Мне любопытно, каковы недостатки использования шаблона ActiveRecord для доступа к данным / бизнес-объектам. Единственное, о чем я могу подумать, - это то, что он нарушает Принцип Единой Ответственности, но модель AR достаточно распространена, и сама эта причина не кажется «достаточно хорошей», чтобы оправдать ее неиспользование (конечно, мой представление может быть искажено, поскольку часто ни один код, с которым я работаю, не следует ни одному из принципов SOLID).
Лично я не фанат ActiveRecord (за исключением написания приложения на Ruby on Rails, где AR чувствует себя «естественным»), потому что он чувствует, что класс делает слишком много, а доступ к данным не должен зависеть от самого класса обрабатывать. Я предпочитаю использовать репозитории, которые возвращают бизнес-объекты. Большая часть кода, с которым я работаю, имеет тенденцию использовать вариант ActiveRecord в форме (я не знаю, почему метод является логическим):
public class Foo
{
// properties...
public Foo(int fooID)
{
this.fooID = fooID;
}
public bool Load()
{
// DB stuff here...
// map DataReader to properties...
bool returnCode = false;
if (dr.HasRows)
returnCode = true;
return returnCode;
}
}
или иногда более "традиционный" способ иметь public static Foo FindFooByID(int fooID)метод для поиска и что-то вроде public void Save()для сохранения / обновления.
Я понимаю, что ActiveRecord, как правило, намного проще в реализации и использовании, но кажется, что он слишком сложен для сложных приложений, и вы могли бы иметь более надежную архитектуру, инкапсулировав логику доступа к данным в репозитории (не говоря уже о том, что ее проще заменить стратегии доступа к данным, например, возможно, вы используете Stored Procs + DataSets и хотите переключиться на LINQ или что-то еще)
Итак, каковы другие недостатки этого шаблона, которые следует учитывать при принятии решения, является ли ActiveRecord лучшим кандидатом на работу?