How to Handle the Problem of Too Many Classes

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

在我解释面向对象编程的观点的几乎每个演示中,总会有人发表这样的评论:“如果我们按照你的建议做,我们将会有很多小类。”我的回答总是一样的:“当然,那很好!”我真诚地相信,即使你不能认为“拥有很多类”是一种优点,但你也不能将其称为任何真正面向对象代码的缺点。然而,也许会有一个点,当类成为一个问题时;让我们看看何时、如何以及如何处理这个问题。

以前提到了一些“规则”,如果应用这些规则,显然会导致大量的类,包括:a) 所有公共方法必须在接口中声明;b) 对象不能有超过四个属性(《优雅对象》第2.1节);c) 不允许使用静态方法;d) 构造函数必须是无代码的;e) 对象必须暴露少于五个公共方法(《优雅对象》第3.1节)。

当然,最大的担忧是可维护性:“如果我们有300个较短的类,而不是50个较长的类,那么代码将变得难以阅读。”如果设计不当,这肯定会发生。

在面向对象编程中,类型(或类)构成你的词汇,它解释了你代码周围的世界-你的代码所生活的世界。词汇越丰富,你的代码就越强大。你拥有的类型越多,你就越能理解和解释这个世界。

如果你的词汇足够丰富,你会说出这样的话:

用一个较小的词汇量来表达,相同的短语会听起来像:

显然,第一个短语更容易阅读和理解。面向对象编程中的类型也是如此:你拥有的类型越多,你的代码就越有表达力、明亮和易读。

不幸的是,Java和许多其他语言并没有以这个概念为基础进行设计。包、模块和命名空间实际上并没有帮助,我们通常会得到像AbstractCooKyivalueMethodArgumentResolver(Spring)或CombineFileRecordReaderWrapper(Hadoop)这样的名称。我们试图将尽可能多的语义装入类名中,以便用户不会犹豫一秒钟。然后,我们试图将尽可能多的方法放入一个类中,以方便用户使用;他们会使用IDE提示来找到正确的方法。

这与面向对象编程大相径庭。

如果你的代码是面向对象的,你的类必须是小的,它们的名称必须是名词,它们的方法名称必须只有一个词。以下是我在我的代码中所做的,以实现这一点:

接口是名词。例如,RequestDirectiveDomain。没有例外。类型(在Java中也称为接口)是我词汇表的核心部分;它们必须是名词。

类有前缀。我的类总是实现接口。由于如此,我可以说它们总是请求、指令或域。我总是希望它们的用户能记住这一点。前缀有帮助。例如,RqBuffered是一个缓冲请求,RqSimple是一个简单请求,RqLive是一个表示“实时”HTTP连接的请求,RqWithHeader是一个带有额外头部的请求。

另一种方法是使用类型名称作为类名的核心部分,并添加一个解释实现细节的前缀。例如,DyDomain是在DynamoDB中持久化数据的域。一旦你知道Dy前缀是用来做什么的,你就能很容易理解DyUserDyBase是关于什么的。

在一个中等规模的应用程序或库中,你将需要记住多达10到15个前缀,不会更多。例如,在Takes Framework中,有24,000行代码,410个Java文件和10个前缀:BcCcTkRqRsFbFkHmPsXe。记住它们的含义并不困难,对吧?

在所有的240个类中,最长的名称是RqWithDefaultHeader

我发现这种类命名的方法相当方便。我在这些开源项目(在GitHub上)中使用了它:yegor256/takes(10个前缀)、yegor256/jare(5个前缀)、yegor256/rultor(6个前缀)和yegor256/wring(5个前缀)。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 09:54

sixnines availability badge   GitHub stars