我正在尝试将ORM逐步引入我支持的应用程序中。 该应用程序的结构不是很好,没有任何单元测试。 因此,任何更改都是有风险的。 我显然很担心我有足够的理由去改变。 这样做的想法是减少用于数据访问的样板代码,从而提高生产率。

这与您的经历相符吗?
逐步实施它是否可能甚至是个好主意?
ORM的缺点是什么?

===============>>#1 票数:3 已采纳

我强烈建议您获得一份Michael Feather的书,该书有效地使用了Legacy Code (通过“ Legacy Code”,Feathers表示单元测试未充分涵盖的任何系统)。 它充满了好主意,应该可以帮助您重构和逐步采用最佳实践。

当然,您可以逐步引入ORM,首先使用它来访问域模型的某些子集。 是的,我发现使用ORM可以加快开发时间-这是关键优势之一,我当然不会错过曾经费力地手工制作数据访问层的日子。

ORM的缺点-从经验来看,掌握所选ORM解决方案的概念,配置和特质不可避免地会有一些学习曲线。

编辑:更正了作者的名字

===============>>#2 票数:2

必须由迈克尔·费瑟斯(Michael Feathers)实际写成的“罗伯特·马丁(Robert C Martin)”书(如今看来,“鲍伯叔叔”已经是一个商标!)。

将单元测试放入未经其开发的应用程序中几乎是不可能的,更不用说耗时了。 该代码只是不适合。

但这不是问题。 重构是指在不更改功能的情况下更改设计(我希望这里的含义没有被严重破坏),以便您可以更广泛地工作。

从大块开始。 设置可重复执行,并捕获后续执行的预期结果。 现在,您的应用程序或至少其中一部分正在接受测试。 当然,这不是一个很好的测试,也不是一个全面的测试,但这只是一个开始,事情只能从那里变得更好。

现在您可以开始重构了。 您想开始提取数据访问代码,以便可以用ORM功能替换它,而不会造成太多干扰。 经常测试:使用旧版应用程序,您会惊讶于发生了什么; 凝聚力和耦合很少是它们的本质。

我还考虑考虑Martin Fowler的Refactoring ,这显然是该过程中的权威性工作。

===============>>#3 票数:1

我在一个大型ASP.net应用程序上工作,我们最近开始在其中使用NHibernate。 我们将一直手动保留的大量域对象移到了NHibernate上,而将它们一直手动保留到Sql Server。 它大大简化了事情,使随着时间的推移更改事情变得容易得多。 我们很高兴进行了更改,并在适合我们的许多新工作的地方使用了NHibernate。

===============>>#4 票数:0

重构的规则是。 做单元测试。

因此,也许首先您应该至少对核心/主要内容进行一些单元测试。

ORM应该设计为减少样板代码。 时间/麻烦与投资回报率取决于您自己来估计:)

===============>>#5 票数:0

我听说TypeMock通常被用来重构遗留代码。

===============>>#6 票数:0

我很认真地认为将ORM引入遗留应用程序会引起麻烦(并且可能与完全重写的麻烦量相同)。

除此之外,ORM是一个不错的选择,绝对应该考虑一下。

===============>>#7 票数:0

除非您的代码已被构建为允许模型层后端的“热交换”,否则以任何方式进行更改始终将具有极大的风险。

试图在架构不良的代码上建立单元测试的安全网并不能保证成功,只会让您对更改它感到更安全。

因此,除非您有充分的商业理由承担所涉及的风险,否则最好不要打扰。

  ask by Johnno Nolan translate from so

未解决问题?本站智能推荐:

13回复

使用ORM或纯SQL? [关闭]

对于我开发的一些应用程序(然后继续忘记),我一直在编写纯SQL,主要用于MySQL。 虽然我在SQLAlchemy中使用了python中的ORM,但我并没有坚持使用它们。 通常是文件或复杂性(从我的观点来看)阻碍了我。 我看到它是这样的:使用ORM来实现可移植性,如果它只是使用一种类型
5回复

什么是ORM,它是如何工作的,我该如何使用? [关闭]

有人建议我为我正在设计的项目使用ORM,但是我无法找到有关它是什么或它是如何工作的信息。 任何人都可以给我一个简短的解释,说明ORM是什么以及它是如何工作的以及我应该如何开始使用它?
6回复

社交网站的ORM是否有意义?

我之所以这样问是因为我需要知道是否在社交网站上使用ORM根本没有任何意义。 我为什么ORM不适合社交网站的论点是: 社交网站不是产品,因此您不需要支持多个数据库。 您知道要使用哪个数据库,并且您很可能不会偶尔更改它。 社交网站需要用户之间的多对多关系,最终有时您需要编写
9回复

ORM仍然是“计算机科学的越南”吗?

我昨晚读了这篇文章 ,我注意到它是从2006年开始的。我可以选择ORM,数据库的任何一种方式,但我只是想知道是否所有不好的杰夫说甚至现在考虑到这个帖子是从2006年以来ORM仍然适用。
1回复

专家系统(用于数据库访问)与ORM

我最近发现了PyKE ,并注意到给定的潜在用途示例(实际上是最初为之创建的用途)之一是编译SELECT语句以查询数据库,并将结果映射到字典。 作者强调,这不是ORM。 由此,我有两个子问题: 使用PyKE(或能够执行或发出代码或返回结构化数据以供调用程序使用的另一种专家系统)的
3回复

何时使用ORM中的复合主键模型进行INSERT或UPDATE?

我有一个自制的ORM系统,该系统目前仅支持自动递增的主键。 这种方法效果很好,但是现在是支持复合主键的时候了。 我知道代理主键和复合主键之间的神圣之战,我个人认为每个主键之间都有地方。 无论如何... :) 使用自动递增的主键,可以很容易地知道在保存模型时是否必须运行INSERT或U
1回复

示例数据库架构+域模型,用于试用ORM

是否有一个DDD域模型的示例(免费提供),该示例具有随附的模式,该模式使用了可用于测试ORM的多个ORM功能(继承性,值类型等)? 创建简单的Order / OrderItem模式很容易,但是它永远不会使您为日后的复杂性做好准备。 (尽管这个问题在很大程度上与平台无关,但我来自.NE
3回复

ORM自动创建表违反了DBA首选项

我正在使用ORM从模型类自动创建表。 我以一种对应用程序很自然的方式命名类及其字段。 然后,ORM将这些相同的名称用于表和列,并自动生成其他对象的名称,例如约束和序列,这些对象由ORM完全抽象。 我没有声明如何命名表,列等。 我将其留给ORM来决定。 从应用程序的角度来看,这是一种
2回复

使用ORM表示表时,具有非表特定的功能是否明智?

例如(非逐字) 还是应该ORM只是表格,仅此而已? 这可能是一个主观的观点,因为每个人都有自己的观点,但是在那里进行编程以及您要做的事情和您实际上不应做的事情。 我只是想知道这是否是其中一种情况。
6回复

代码生成器与ORM与存储过程

这些软件体系结构在哪些领域发挥作用或失败? 哪些关键要求会促使您选择其中一个? 请假设您有开发人员可以做好面向对象的代码以及良好的数据库开发。 另外,请避免神圣的战争:)这三种技术都有利有弊,我对哪种方式最适合使用感兴趣。