функция абстракция - PullRequest
       7

функция абстракция

2 голосов
/ 09 ноября 2011

Просто быстрый вопрос по поводу повторного использования кода.

В последнее время я пытался модулировать мой код.Я пока не очень хорошо разбираюсь в OO PHP (я работаю над тем, чтобы все обдумать), но даже если я начал использовать OOP, есть ряд сценариев, подобных приведенному ниже, где я вижу проблему с абстрагированием моего кода.

Итак, допустим, у меня есть список пользователей, которые разместили комментарий в новостной статье.Когда я получаю список комментариев, все, что у меня есть, это идентификатор пользователя.До того, как я начал пытаться абстрагировать функциональность, я бы просто сделал что-то вроде

SELECT c.*, u.username FROM comments AS c LEFT JOIN users AS u ON c.uid = u.id WHERE c.news_id = 90

. Это даст мне комментарий вместе с именем пользователя, который его опубликовал.Теперь для того, чтобы абстрагироваться от повторного получения имени пользователя (скажем, если имя пользователя было пустым, я могу захотеть вернуть concat из fname и sname), я мог бы сделать что-то вроде этого.(имея в виду, что это пример, я знаю, что в большинстве случаев имя пользователя будет обязательным полем регистрации, представьте, что я создаю базовую систему для разработки новых сайтов, где имя пользователя может быть чем-то отличным от строки в базе данных).

function getUsername($uid) {
  return /** the username from the database however i decide to get it **/
}

Это должно было бы выполнить по крайней мере 1 запрос MySQL.Если у меня отображается 100 комментариев, это может быть 100 выполняемых запросов

В ООП, я думаю, я бы сделал что-то вроде

$user = new User($uid);
echo $user->getUsername();

Но для этого также потребовался бы запрос для загрузки пользователя.(и, вероятно, будет немного более ресурсоемким, поскольку пользовательский класс получит гораздо больше информации о init для создания пользовательского объекта для всех возможных методов.

Я знаю, что мог бы использовать memcache или что-то еще, чтобы ускорить процессДаже кешировать результаты, поэтому последующие вызовы getUsername () с тем же uid не требуют другого запроса. Но я не могу придумать решение, которое почти так же хорошо, как получение имени пользователя в моем обычном виде (фрагмент первого кода).

Смотрю ли я слишком глубоко на абстракцию функции и пытаюсь чрезмерно использовать ООП? Я не думаю, что так лично, я думаю, что это совершенно правильное требование, и было бы целесообразно создать экземпляр объекта пользователя, если бы я использовалООП?

Просто ищу некоторые указатели на самом деле.у всегда влияют на производительность?Или я просто ошибаюсь?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2011

В этой конкретной ситуации я бы рассмотрел использование статического метода (http://www.php.net/manual/en/language.oop5.static.php). Примерно так:

class User {

    /* all my normal class stuff to load a user */

    public static function getUsername($uid) {
        /* sql to retrieve username from db */
        return $username;
    }
}

$username = User::getUsername($uid);

Таким образом вы избегаете создания нового пользовательского объекта и просто выполняете необходимый запрос.

0 голосов
/ 02 мая 2012

Пока я очищал свой аккаунт, я подумал, что лучше закрыть несколько старых вопросов.То, что я нашел, довольно очевидно, и у меня было чувство, что я знал это все время.Для всех, кто интересуется тем же, что и я, и найдите этот пост.Основная предпосылка - это ваше решение.

По сути, вы можете полностью абстрагировать свои методы, чтобы они были полностью автономными и страдали от некоторых довольно серьезных проблем с производительностью, или на другом конце шкалы вы вообще не можете абстрагироваться и иметь возможностьнастроить каждую мелочь, чтобы получить лучшую производительность.Производительность и абстракция в общем смысле противоположны, так что найдите где-то посередине, что делает вас счастливыми.

В приведенном выше случае я решил сделать метод статическим, а затем передать либо идентификатор пользователя, либо массив.Затем код проверяет, является ли он массивом или целым числом, является ли он целым числом или массив не содержит требуемых ключей, он выполняет поиск запроса перед созданием имени пользователя для возврата.

0 голосов
/ 09 ноября 2011

Вот где может прийти инфраструктура Model View Controller.

По сути, каждая таблица mysql имеет модель, каждая со своими функциями контроллера, которые используют эти модели и разные страницы (или представления) для этого контроллера.*


Если вы не хотите идти по маршруту MVC, я не вижу проблем с созданием User класса объекта:

class User {
    public function __construct($ID){
          $user_query = "SELECT * FROM USERS WHERE id='$id'";
          //do the query
          //save all info to object:
          $this->username = $row['username'];
          $this->fname = $row['fname'];
          //...
    }

    public function getUserName(){
         return $this->username;
    }

    public function getFirstName(){
         return $this->fname;
    }

    //..etcetera
}

И вы можете использовать его так:

$user = new User(1);

echo "Hello ".$user->getFirstName()." your username is: ".$user->getUserName();
...