Параметры и атрибуты (переменные класса)? - PullRequest
1 голос
/ 27 августа 2009

В ООП лучше использовать атрибуты класса в функциях класса или просто передать им параметры.

class User{
  private $user = array();

  public function Get_Existing_User($user_id){
    //SQL selects user info for existing user
    $this->user = mysqli_fetch_assoc();
  }

  public function Set_User($user_data){
    $this->user = (array) $user_data;
  }

  public function Add_User(){
    //insert everything from $this->user into database
  }

  public function Get_User(){
    return $this->user;
  }
}

VS

class User{

  public function Get_Existing_User($user_id){
    //SQL selects user info for existing user
    $user = mysqli_fetch_assoc();
    return $user;
  }

  public function Add_User($user_data){
    //insert everything from $user_data into database
  }
}

Какой путь лучше?

Ответы [ 5 ]

1 голос
/ 27 августа 2009

Между вашими решениями сначала лучше, но вы должны изменить названия функций. 'get' следует использовать, только если функция возвращает что-то.

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

Но в данном конкретном случае Get_Existing_User и Add_User должны быть статическими функциями, которые возвращают новый объект User, его иногда называют статическим конструктором. Причина, по которой он намного лучше, состоит в том, что он дает понять, что делают эти функции, они получают что-то в качестве параметра (user_id существующего пользователя или first_name, last_name и другие атрибуты для нового пользователя) и создают объект, который представляет пользователя. Все манипуляции с базой данных будут скрыты. Сам объект должен иметь свойства для имени и других атрибутов и даже метод Save () для возврата изменений. Но основная идея заключается в том, что вы всегда работаете с созданным объектом, объектом, который уже имеет контекст и связан с чем-то в реальном мире (то есть с пользователем в базе данных), а не с пустой оболочкой, которая будет заполняться по ходу работы.

0 голосов
/ 27 августа 2009

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

  1. Сцепление
  2. Сплоченность

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

0 голосов
/ 27 августа 2009

Сначала уточнение терминологии:

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

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

Тем не менее, обычно есть другие факторы, которые могут определить, что выбрать. Вы можете думать об объекте как о области видимости связанных переменных. Если переменная относится к этой области, имеет смысл присвоить ее свойству.

0 голосов
/ 27 августа 2009

Это полностью зависит от того, будете ли вы использовать данные повторно и от того, как вы используете класс.

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

Не существует единого лучшего подхода.

0 голосов
/ 27 августа 2009

Атрибуты класса, как ожидается, описывают состояние экземпляра класса, известного как объект. Таким образом, атрибуты могут использоваться любой функцией класса для изменения его состояния. Параметры функции, с другой стороны, могут не иметь никакого отношения к текущему состоянию объекта, но могут использоваться для изменения его состояния.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...