- Толстые модели можно охватить модульными тестами. С тонкими придётся писать ещё и функциональные.
- Реализацию метода толстой модели легко подменить. Для меня это основной аргумент (хотя часто и я ленюсь). Например, есть у нас модели в системе, использующие Active Record:
class MyThinModel extends CActiveRecord { … }
В большинстве случаев вызывают их в контроллерах как-то так:
$criteria = new CDbCriteria(); $criteria->compare('used', 1); $models = MyThinModel::model()->findAll($criteria);
А теперь представим, что проект у нас вырос до приличных нагрузок и кэш с оптимизацией запросов не помогают. Что теперь делать? Приходится перекраивать хранилище на какой-нибудь быстрый key-value, например, тот же Redis. Вот только проблема есть… проект очень завязан на SQL-ный Active Record и программист, посмотрев на всё это дело, принимает популярное решение «переделать с нуля». А ведь можно было этого избежать (ну или хотя-бы сгладить эффект), если бы изначально использовались толстые модели:
class MyThinModel extends CActiveRecord { public function getAllUsed() { $criteria = new CDbCriteria(); $criteria->compare('used', 1); return self::model()->findAll($criteria); } }
Ну и в контроллере:
$models = MyThinModel::model()->getAllUsed();
В этом случае переписать необходимо будет только getAllUsed
.