2015-02-13 4 views
0

У меня есть класс NoteEntity, который предназначен для представляет строку в моей таблице notes. Объект «(данных)» в моей структуре строго означает запись/сохранение данных - строку базы данных, если хотите. Создание такого объекта так же просто, как и инициализация его массивом, возвращаемым mysqli_fetch_array(), что требует от меня совпадения свойств объекта с именами столбцов моей таблицы.Хорошая практика иметь геттер для каждого свойства в классе, представляющем строку, или мне нужно исследовать другой подход?

Конструктор наследуется от родительского класса DataEntity:

PHP код

public function __construct($row_array) 
{ 
    foreach ($row_array as $column => $value) 
    { 
     if (property_exists($this, $column)) 
     { 
      $this->$column = $value; 
     } 
     else 
     { 
      trigger_error(get_class($this) . " has no attribute called '$column'.", E_USER_NOTICE); 
     } 
    } 
} 

Как вы можете видеть, все это делает, это отображение соответствующих столбцов в соответствующие свойства объекта.

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

Вопрос идет как: Хорошая практика иметь геттер для каждой собственности, или я должен исследовать другой подход? Я прошу об этом с точки зрения производительности, но я бы хотел, чтобы мой код был как можно более удобным.

Причина я обеспокоен производительности в том, что если он получает немного занят, получая свойства быстро становится:

PHP код

foreach ($notes as $note_entity) 
{ 
    $template->Process(array(
     'note_name' => $note_entity->GetName(), 
     'note_ext' => array_pop(explode('.', $note_entity->GetFilename())), 
     'subject_id' => $note_entity->GetSubjectID(), 
     'subject_name' => $note_entity->GetSubject(), 
     'institute_id' => $note_entity->GetInstituteID(), 
     'institute_nick' => $note_entity->GetInstitute(), 
     // ... 
    )); 
} 

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


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

  • возвращающиеся только подмножество данных создают неявные логические зависимости между NoteEntity и где он используется, если разыскиваемое подмножество варьируя между призывающими местами,
  • возвращается все свойства создает ненужный поток данных, который никогда не будет использоваться,
  • Обновление конфигурации colum увеличивает стоимость ремонтопригодности, так как нам также необходимо обновить структуру возвращаемого массива.

ответ

1

Я думаю, что это скорее предпочтительный дизайн, но есть много преимуществ использования геттеров/сеттеров.

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

Если вы хотите сделать это для примитивов или не является спорным, но, как правило, вы не хотите, чтобы обновить свойства, ссылки на них непосредственно и особенно не внешне. Таким образом, наличие геттеров/сеттеров - хороший способ их изолировать.

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