TL; DR: не создавайте анемичных объектов. Гораздо меньше с автоматическими инструментами.

Проблемы

  • Анемичные объекты
  • Связь с реализацией
  • Сложнее отлаживать

Решения

  1. Создавайте свои объекты вручную.
  2. Сосредоточьтесь на существенном поведении, а не на случайном хранении данных.

Образец кода

Неправильный

<?
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'

Обнаружение

Часто анемичные модели генерируются с помощью метапрограммирования.

Нам нужно отслеживать эти волшебные генераторы кода.

Теги

  • Анемичный

Вывод

Мастера кода, метапрограммирование и анемичные модели - все это запахи кода.

Нам нужно избегать этих темных приемов.

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

связи



Больше информации





Лень II: мастера кода
Генераторы кода делают нашу тяжелую работу. Но они нам больше не нужны. codeburst.io



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

Мартин Фаулер



Эта статья является частью серии CodeSmell.