我真的需要看到一些诚实,深思熟虑的辩论,目前公认的 < em > 企业应用程序 设计范式的优点。
我不相信实体对象应该存在。
我所说的实体对象是指我们倾向于为应用程序构建的典型对象,比如“ Person”、“ Account”、“ Order”等等。
我目前的设计理念是:
(注意: 我也用 JavaEE 构建了企业级应用程序,请用 Java 人员替换我的.NET 示例)
我不反 OO。我为不同的目的编写了许多类,只是没有实体。我承认,我编写的大部分类都是静态助手类。
我不是在做玩具。我指的是跨多台机器部署的大型、高容量事务性应用程序。Web 应用程序、 Windows 服务、 Web 服务、 b2b 交互等等。
我已经使用了 OR Mapper。我写了一些。我已经使用了 JavaEE 堆栈、 CSLA 和其他一些等价物。我不仅使用了它们,而且还在生产环境中积极地开发和维护了这些应用程序。
我得出了一个经过实战检验的结论: 实体对象正在妨碍我们,如果没有它们,我们的生活将会轻松得多。
考虑这个简单的例子: 您得到一个关于应用程序中某个页面不正常工作的支持调用,可能其中一个字段没有像应该的那样被持久化。对于我的模型,分配给发现问题的开发人员打开 正好三份文件。一个 ASPX、一个 ASPX.CS 和一个带有存储过程的 SQL 文件。这个问题可能是存储过程调用缺少的参数,需要几分钟才能解决。但是对于任何实体模型,您都必然会启动调试器,开始逐步执行代码,最终可能会在 VisualStudio 中打开15-20个文件。当您降到堆栈底部时,您忘记了从哪里开始。我们一次只能记住这么多东西。软件是难以置信的复杂,没有添加任何不必要的层。
开发复杂性和故障排除只是我抱怨的一方面。
现在我们来讨论一下可伸缩性。
开发人员是否意识到,每次编写或修改与数据库交互的任何代码时,他们都需要对对数据库的确切影响进行彻底的分析?而且不仅仅是开发副本,我指的是生产的模拟,所以您可以看到,您现在需要为对象添加的额外列刚刚使当前查询计划失效,而一个在1秒内运行的报告现在将花费2分钟,仅仅因为您向选择列表添加了一个列?结果是,您现在需要的索引非常大,以至于 DBA 必须修改您的文件的物理布局?
如果您让人们使用抽象离物理数据存储太远,他们将对需要伸缩的应用程序造成严重破坏。
我不是狂热分子。如果我错了,我可以被说服,也许我是错的,因为有这样一个强大的推动 Linq 到 Sql,ADO.NET EF,Hibernate,Java EE 等。请仔细想想你的回答,如果我错过了什么,我真的想知道它是什么,为什么我应该改变我的想法。
[编辑]
看起来这个问题突然又活跃起来了,所以现在我们有了新的评论功能,我已经直接对几个答案进行了评论。谢谢你的回复,我认为这是一个健康的讨论。
我可能应该更清楚地表明,我说的是企业应用程序。我真的不能评论,比如说,在某人的桌面上运行的游戏,或者移动应用程序。
有一件事我必须放在这里的顶部来回应几个类似的答案: 正交性和关注点分离经常被引用作为进入实体/ORM 的理由。对我来说,存储过程是我能想到的最好的关注点分离。如果不允许通过存储过程以外的其他方式访问数据库,理论上,只要维护存储过程的输入和输出,就可以重新设计整个数据模型,而不会破坏任何代码。它们是契约式编程的完美例子(只要您避免使用“ select *”并记录结果集)。
问问在这个行业工作了很长时间并且从事过长期应用程序工作的人: 在数据库存在的时候,有多少应用程序和 UI 层来了又去?当有4或5个不同的持久层生成 SQL 来获取数据时,调优和重构数据库有多难?你什么都改变不了!ORM 或任何生成 SQL锁定你的数据库的代码。