TL; DR: не создавайте анемичных объектов. Гораздо меньше с автоматическими инструментами.
Проблемы
- Анемичные объекты
- Связь с реализацией
- Сложнее отлаживать
Решения
- Создавайте свои объекты вручную.
- Сосредоточьтесь на существенном поведении, а не на случайном хранении данных.
Образец кода
Неправильный
<?
AnemicClassCreator::create( 'Employee', [ new AutoGeneratedField('id', '$validators->getIntegerValidator()'), new AutoGeneratedField('name', '$validators->getStringValidator()'), new AutoGeneratedField('currentlyWorking', '$validators->getBooleanValidator()') ]);
class Employee extends AutoGeneratedObjectEmployee { }
//We have magic setters and getters //getId() , setId(), getName() //Validation is not implicit //Class are loaded via an autoloader
$john = new Employee; $john->setId(1); $john->setName('John'); $john->setCurrentlyWorking(true);
$john->getName(); //returns 'John'
Правильно
<?
final class Employee { private $name; private $workingStatus;
public function __construct(string $name, WorkingStatus $workingStatus) { //.. }
public function name(): string { return $this->name; //This is not a getter. It is Employee's responsibility to tell us her/his name } }
//We have no magic setters or getters //all methods are real and can be debugged //Validations are implicit
$john = new Employee('John', new HiredWorkingStatus());
$john->name(); //returns 'John'
Обнаружение
Часто анемичные модели генерируются с помощью метапрограммирования.
Нам нужно отслеживать эти волшебные генераторы кода.
Теги
- Анемичный
Вывод
Мастера кода, метапрограммирование и анемичные модели - все это запахи кода.
Нам нужно избегать этих темных приемов.
Необходимость писать код явно заставляет нас задуматься над каждым фрагментом данных, который мы инкапсулируем.
связи
Больше информации
Лучшие запахи - это то, что легко обнаружить, и в большинстве случаев они приводят к действительно интересным проблемам. Классы данных (классы со всеми данными и без поведения) являются хорошими примерами этого. Вы смотрите на них и спрашиваете себя, как следует вести себя в этом классе.
Мартин Фаулер
Эта статья является частью серии CodeSmell.