design-patterns - 是否有避免使用编程语言类型的做法的名称?
问题描述
我试图说服同事停止编写这样的代码(java 中的示例):
class Person {
Long id;
String name;
String surname;
}
并编写如下代码:
class Person {
PersonId id;
PersonName name;
PersonSurname surname;
}
基本上,我想避免过度使用 Strings'、Longs' 并使用与域对应的专用类型。这不是一个新的概念、方法或实践(不管你怎么称呼它),所以它可能已经有了一个名字。可能有很多人已经写过这种方法的优缺点,但我找不到任何东西,因为我不知道该寻找什么。
解决方案
是的,这种做法的名称是Avoiding Primitive Obsession
。
根据这篇文章:
The Smell: Primitive Obsession 使用原始数据类型来表示领域思想。例如,我们使用 String 来表示消息,使用 Integer 来表示金额,或者使用 Struct/Dictionary/Hash 来表示特定对象。
修复:通常,我们引入一个 ValueObject 来代替原始数据。
工具:有些语言会让你更容易或更难。
在像 C# 和 Java 这样的语言中,创建数百个小类型只是包装一个简单的字符串或 int 可能会很痛苦。例如,您将有很多这样的类:
class PersonName {
public String value;
public PersonName(String value) {
this.value = value;
}
}
但是在像 F# 这样的ML 语言中,创建简单的包装器类型是微不足道的:
type PersonName = PersonName of string
关于该主题的一些好文章:
- https://refactoring.guru/smells/primitive-obsession
- https://softwareengineering.stackexchange.com/questions/365017/when-is-primitive-obsession-not-a-code-smell
- http://codemonkeyism.com/never-never-never-use-string-in-java-or-at-least-less-often/
- https://fsharpforfunandprofit.com/posts/designing-with-types-single-case-dus/
推荐阅读
- azure - mavenAuthenticateFeed 在 Azure DevOps MavenTask 中做了什么?
- python - 将带有 K:V 的 3 列 excel 转置为 Pandas 列
- reactjs - 在 ReactJS 中单击按钮时如何添加活动类
- kotlin - 将 lambda 表达式存储在变量中会删除内联优化
- archunit - ArchUnit 可以在方法调用中检查某些字符串模式吗?
- storage - 我应该在哪里为我的应用程序存储少量数据?
- scilab - Scilab gui 上没有文字
- sql - 我无法登录到 postgres,因为我输入了一个空密码
- c++ - 在 C++ 中用字符串和 int 解析(拆分)一个 txt 文件
- sapui5 - 分组聚合后列表控件中断