2009-08-27 2 views
0

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

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 
    } 
} 

Будет лучше пойти?

ответ

0

Некоторые разъяснения по терминологии первой:

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

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

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

0

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

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

0

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

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

Нет никого лучшего в обращении.

1

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

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

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

0

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

  1. Coupling
  2. Cohesion

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

Смежные вопросы