Prefixed Naming

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

如果你第一次查看 TakesCactoos 的源代码,你很可能会像许多其他人一样,被命名约定所触动,这意味着大多数类名都有两个字母的前缀:BkSafeRqFakeRsWithStatusTkGzip,等等。老实说,我还没有见过一个一眼就能适应这种约定的Java开发者。然而,我见过很多现在喜欢它的人。本文是给那些有兴趣从第一类进入第二类的人。

任何一个体量较大的软件包、模块、库或框架都有大量的类。嗯,它必须要有。如果没有,那么它的设计肯定存在问题。所以如何给这些类命名总是一个问题。最简单、最明显的方法是使用Java及其旗舰框架 Spring 中使用的方法:尽可能使类名具有描述性和长度。这里有一些例子

  • “SimpleBeanFactoryAwareAspectInstanceFactory” should not be translated.

  • TransactionAwarePersistenceManagerFactoryProxy” 不需要翻译成中文。

  • 请将以下Markdown段落从英文翻译成中文,不要翻译技术术语和专有名词:”AbstractAnnotationConfigDispatcherServletInitializer

这是垃圾,对吧?

命名类的一种更复杂和耗时的方式是使用领域驱动设计 (DDD)范例,它建议在真实世界的实体之后使用名词,例如端口、汽车、书、故事、用户、套接字等。确定正确的实体对于软件架构师来说是一个巨大的挑战。一个糟糕的架构师可能只会使用ConnectionFactoryUtilsDefaultListableBeanFactory,就此打住。一个更专业的架构师可能会花几个小时或几天的时间,但最终会得出更加面向领域的结果。

假设你是后者,并且成功找到了正确的名词。在你的领域中会有多少这样的名词?我相信只会有几十个。即使应用程序相当复杂,其问题域中也不会有超过30个实体。然而,如上所述,类的数量会更多,有时可能超过一千个或更多。因此,你将面临的第二个问题是如何为“带有限定词的实体”命名类。例如,你有一个端口,还有一个随机端口、一个TCP端口、一个已关闭的端口、一个尚未打开的端口等等。

将会有带有形容词的名词:随机端口、关闭端口、打开端口、TCP端口、损坏的端口等等。你如何为这些类命名?也许就像这样简单:RandomPortOpenedPortClosedPortTcpPort。也许,但我认为将共同的Port部分转换为所有类的常见前缀Pt会更好:

  • PtOpened

  • PtClosed

  • PtTcp

这种方法的唯一缺点是新手可能不知道Pt前缀的含义。确实,学习它可能需要一些时间(几分钟)。然而,优点更大:一旦你学会了应用程序中存在的所有前缀(而且它们只有很少,因为领域中的实体数量非常有限),你就可以立即了解类属于类型层次结构的哪个部分(这个来自Takes的):

Request <– RqChunk Request <– RqGreedy Request <– RqMultipart Back <– BkParallel Back <– BkSafe Take <– TkFailure Take <– TkGzip Take <– TkMeasured

一旦你看到Rq前缀,你立即就会知道你正在处理的是org.takes.Request接口的实现。而不是来自JDKServletRequest,也不是来自Spring的HttpRequest,也不是来自OkHttpRequest。你知道这是来自Takes的Request

因此,通过使用短前缀而不是名词,我们给代码增加了清晰度。我们消除了重复使用相同名词的噪音,使引用更容易。每个前缀都是类型层次结构中类的唯一定位符。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:05

sixnines availability badge   GitHub stars