如果您是第一次查看Takes或Cactoos的源代码,则很可能会像其他名称一样被命名约定触发,这意味着大多数类名称都有两个字母的前缀: BkSafe
, RqFake
, RsWithStatus
, TkGzip
等。 老实说,我还没有见过一个Java开发人员会对这种约定一见钟情。 但是,我看到许多现在爱上它的人。 本文适用于那些有兴趣从第一类转到第二类的读者。
任何大小合适的软件包,模块,库或框架都具有大量的类。 好吧,它必须有 。 如果没有,则肯定是其设计存在问题。 因此,如何命名这些类始终存在问题。 最简单,最明显的方法是用在Java及其旗舰框架Spring中的方法 :使类名尽可能具有描述性且尽可能长。 以下是一些示例 :
-
ObjectFactoryCreatingFactoryBean
-
SimpleBeanFactoryAwareAspectInstanceFactory
-
TransactionAwarePersistenceManagerFactoryProxy
-
AbstractAnnotationConfigDispatcherServletInitializer
这是垃圾,不是吗?
DDD范式是一种更复杂,更耗时的类命名方式,它建议在现实世界中的实体之后使用名词 ,例如港口,汽车,书籍,故事,用户,插座等。 对于软件架构师而言,确定正确的实体是一项巨大的挑战。 一个不好的人只会求助于ConnectionFactoryUtils
或DefaultListableBeanFactory
并称之为一天。 一个更专业的人可能要花费数小时或数天的时间,但最终会提出更多由域驱动的东西。
假设您是后者,并且您设法找到了正确的名词。 您的域中将有多少个? 我相信有几十个。 即使应用程序非常复杂,问题域中的实体也不会超过30个。 但是, 如上所述 ,类的数量将更大,有时超过一千或更多。 因此,您将面临的第二个问题是如何命名“带有说明符的实体”的类。 例如,您有一个端口,还有一个随机端口和一个TCP端口,一个端口已经关闭,一个端口尚未打开,依此类推。
会有带有形容词的名词 :随机端口,关闭端口,打开端口,TCP端口,断开端口等等。 您如何命名这些班级? 也许就这么简单: RandomPort
, OpenedPort
, ClosedPort
, TcpPort
。 也许可以,但是我认为最好将所有类的公共Port
部分转换为公共前缀Pt
:
-
PtRandom
-
PtOpened
-
PtClosed
-
PtTcp
这种方法的唯一缺点是,新手可能不知道Pt
前缀的含义。 确实,学习它可能需要一些时间(几分钟)。 但是,这样做的好处是更大的:一旦您了解了应用程序中存在的所有前缀(由于域中的实体数量非常有限,所以只有少数前缀),您可以立即了解该前缀的哪一部分该类所属的类型层次结构(这来自Takes ):
一旦看到Rq
前缀,您将立即了解到您正在处理org.takes.Request
接口的实现。 不是来自JDK的ServletRequest
,不是来自Spring的HttpRequest
,也不是来自OkHttp的 Request
。 您知道这是Takes的Request
!
因此,通过使用短前缀而不是名词,我们使代码更加清晰。 我们消除了一遍又一遍重复使用同一名词的噪音,并使引用变得更容易。 每个前缀都是类型层次结构中类的唯一定位器。
翻译自: https://www.javacodegeeks.com/2020/03/prefixed-naming.html