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提示来找到正确的方法。
这与面向对象编程大相径庭。
如果你的代码是面向对象的,你的类必须是小的,它们的名称必须是名词,它们的方法名称必须只有一个词。以下是我在我的代码中所做的,以实现这一点:
接口是名词。例如,Request
、Directive
或Domain
。没有例外。类型(在Java中也称为接口)是我词汇表的核心部分;它们必须是名词。
类有前缀。我的类总是实现接口。由于如此,我可以说它们总是是请求、指令或域。我总是希望它们的用户能记住这一点。前缀有帮助。例如,RqBuffered
是一个缓冲请求,RqSimple
是一个简单请求,RqLive
是一个表示“实时”HTTP连接的请求,RqWithHeader
是一个带有额外头部的请求。
另一种方法是使用类型名称作为类名的核心部分,并添加一个解释实现细节的前缀。例如,DyDomain
是在DynamoDB中持久化数据的域。一旦你知道Dy
前缀是用来做什么的,你就能很容易理解DyUser
和DyBase
是关于什么的。
在一个中等规模的应用程序或库中,你将需要记住多达10到15个前缀,不会更多。例如,在Takes Framework中,有24,000行代码,410个Java文件和10个前缀:Bc
,Cc
,Tk
,Rq
,Rs
,Fb
,Fk
,Hm
,Ps
和Xe
。记住它们的含义并不困难,对吧?
在所有的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