Answers:
ActiveRecord有一些有效的批评。和往常一样,鲍伯叔叔 完美地总结了一下:
我对Active Record的问题是,它对这两种截然不同的编程风格产生了混淆。数据库表是一种数据结构。它公开了数据,没有任何行为。但是活动记录似乎是一个对象。它具有“隐藏”数据和公开行为。我将“隐藏”一词用引号引起来,因为实际上数据不是隐藏的。几乎所有ActiveRecord派生类都通过访问器和更改器导出数据库列。实际上,Active Record的用途就像是数据结构。
另一方面,许多人在其Active Record类中添加了业务规则方法。这使它们看起来像是对象。这导致了两难选择。活动记录真正落在哪一边?是物体吗?还是数据结构?
维基百科在可测试性方面总结了批评意见:
在OOP中,封装的概念通常与关注点分离的概念不一致。一般而言,支持关注点分离的模式更适合于隔离的单元测试,而支持封装的模式则更易于使用API。Active Record强烈支持封装,以至于没有数据库的测试非常困难。
加文·金(Gavin King)专为Ruby on Rails实现而设计(重点是我):
在这一点上,大多数开发人员都在想,好吧,那么我该如何通过查看我的代码来了解公司的属性?我的IDE如何自动完成它们?当然,Rails员工对这个问题有一个快速的答案。噢,只需启动您的数据库客户端并查看数据库!然后,假设您知道ActiveRecord的自动大写和复数规则/ 完全 /,您将能够猜出您自己的Company类的属性名称,并手动键入它们。
同样在Ruby on Rails实施中,John Januszczak写道(重点是我):
问题1:静态方法
...
有人会说使用静态方法仅相当于过程编程,因此是差的面向对象设计。其他人会说静态方法是可测试性的牺牲品。
问题2:全局配置设置
...
因此,在我的示例中,没有对Account类进行依赖注入,也没有对Account实例进行依赖注入。众所周知,寻找事物是非常非常糟糕的!
关于为何通常将ActiveRecord和ORM视为反模式的其他资源:
ActiveRecord一直被认为是一种非常有用的反模式,但我确实同意它违反了SRP,另外,它也违反了依赖反转原则。