未维护订单类型操作的默认值
几周前,我读了一条包含这张照片的推文,有人说:“这就是为什么值类型有用的原因!”。 之后,我想起了几年前发生的情况,因此我决定写一篇关于它的博客文章。
在某些项目中,我看到了很多验证代码,这非常疯狂。 在大多数情况下,方法的参数如Doubles,BigDecimals或Strings,然后在每种方法的开头进行大量业务验证。 这些业务验证分散在整个代码库中,大部分时间都是复制粘贴。 这些验证包含技术验证,例如空检查和业务验证。 由于多种原因,此类情况确实不是最佳选择。
此博客文章描述了即使不进行域驱动设计,也应该了解并使用值类型的概念的原因。
为什么这么糟?
首先, 代码不反映业务领域 。 这些方法参数中的某些参数相互依赖,并且随后的验证检查与该参数结合形成了业务规则,就可维护软件而言,这实际上是很糟糕的。 为什么? 因为该软件提供了产品所有者想要的功能,但是在代码库中很难找到此特定的业务规则,因为您无法搜索该业务人员所说的特定名词。 我已经不止一次遇到这种情况。 我必须掌握整个代码库,因为不清楚在哪里可以找到该业务规则以及哪个类或方法负责。
另一方面, 语义还不清楚 。 当使用字符串而不是值类型作为方法参数时,以错误的方式使用方法会更容易导致错误。 想象一个带有两个String类型参数的方法。 实现此方法的人员知道每个参数的职责,因为他实现了此方法并了解此方法的内部。 其他只想使用此方法的开发人员对内部情况一无所知。 他们只知道方法名称和参数,并且可能不那么仔细,并在第二个参数中传递第一个String并在第一个参数中传递第二个String,甚至可以编译代码! 尽管从业务角度来看这是完全错误的! 在最好的情况下,可以通过测试检测到该错误。 否则,它可能会在本地运行时的运行时出现,甚至更糟:在生产中。 当用有意义的值类型替换字符串时,您不能只切换两个参数而不会出现编译错误,因为它们不是同一类型。 您(作为使用此方法的开发人员)不能以错误的方式使用该方法并使您的应用程序处于不规则状态。
如何改善呢?
为了改善这一点,您只需实现一个不可变的类,其构造函数包含此方法参数。 在此构造函数中,您可以执行之前在整个代码库中所做的所有这些验证检查。 这样可以提高软件的可维护性。
过去,我经常听到人们说:“ ..但我不想只为几行代码创建其他类”。是的,它是一个附加类,但是该类可保护您避免在代码中传递错误的参数。例如,在使用值类型而不是字符串作为参数时的方法。
除此之外,已经在编译时检测到错误。 值类型可以为您节省很多钱,因为您可以在开发的早期而不是生产中修复错误。
结论
在软件的可维护性方面,价值对象非常强大。 即使您不在项目中使用域驱动设计。
通过使用值对象,您的代码将更易于理解,从而更易于他人维护。 对于其他开发人员而言,无需掌握整个代码库并搜索不同方法参数的用法,就可以更轻松地找到产品所有者正在谈论的业务规则。
希望您喜欢这篇博文并学到一些新东西。 如果您喜欢,请发表评论。 如果不能也留下一个;-)
再见
本内特
进一步阅读
- http://martinfowler.com/bliki/ValueObject.html
- http://dirkriehle.com/computer-science/research/1998/ubilab-tr-1998-10-1.html
- http://wiki.c2.com/?ValueObject
- http://bezmax.com/2015/09/20/clean-code-with-value-objects/
- https://twitter.com/Heimeshoff/status/799272483853598723
参考: | 为什么值类型对可维护软件很重要?我们的JCG合作伙伴 Bennet Schulz在Java Enterprise Software Development博客上发表了文章。 |
翻译自: https://www.javacodegeeks.com/2016/12/value-types-important-maintainable-software.html
未维护订单类型操作的默认值