《代码整洁之道 》第二章 有意义的命名

第二章 有意义的命名

名副其实

变量和方法的命名要有含义,有业务的含义。

这段代码,有什么目的?theList是什么?4又代表什么?

我们发现这个是一个扫雷的游戏。盘面是名为thelist的单元表格,数组的0下标是状态值,4标识已标记。
可以修改成这样:

还可以更进一步,数组表示的单元格,可以用一个类实现,写一个类函数 isFlagged,可以掩盖那个魔术数。

避免误导

比如accountList来指一组账号,除非他真的是List类型,不然List对程序员有特殊的意义,如果不是一个List,就会引起误导,所以使用accountGroup,bunchOfAccounts。

小写字母l 和大写字母O ,他们和数字 0 1 很像,也容易误导

有意义的区分

无意义的区分

public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}

如果参数名改为source和destination,这个函数就会像样许多。”
“废话是另一种没意义的区分。假设你有一个 Product 类。如果还有一个 ProductInfo 或ProductData类,那它们的名称虽然不同,意思却无区别。Info和Data就像a、an和the一样,是意义含混的废话。”

“getActiveAccount();

getActiveAccounts();

getActiveAccountInfo();

程序员怎么能知道该调用哪个函数呢?”

“如果缺少明确约定,变量 moneyAmount 就与 money 没区别,customerInfo 与 customer没区别,accountData与account没区别,theMessage也与message没区别。要区分名称,就要以读者能鉴别不同之处的方式来区分。”

使用读得出来的名称

使用可搜索的名称

找一个MAX_CLASSES_PER_STUDENT很容易,但是你想找一个一个数子 7 ,就麻烦了

虽然看起来拉长了代码,但是这些变量比数字好找多了。

避免使用编码

比如一些前缀,C标识细胞模块,C_ddd, C_yyy
人们很快就会学会无视前缀。

接口和实现

有时候写一些接口,IShapeFactory。或者CShapeFactory。就是个废话。我不想让用户知道我给他们的是接口

避免思维映射

不应当让读者在脑中把你的名称翻译为他们熟知的名称,这种问题经常出现在选择是使用问题领域术语还是解决方案领域术语时。

单个字母变量,当他的作用域很小的时候,没有冲突,是可以的,比如循环计数器,i,j。但是使用l O,就不行了

类名

类名和对象名应该是名词或者名词短语,如Customer 、WikiPage 、Account、AddressParser 。

避免使用Manager 、Processor 、Data或Info这样的动词。

方法名

方法名要应该是动词或者动词短语。postPayment 、deletePage 或save。属性访问器、修改器、断言应该根据其值命名,并依靠javaBean标准加上get、set、is前缀。

每个概念对应一个词

在同一堆代码中有controller,又有manager还有driver,就令人很困惑,DeviceManager和Protocol-Controller之间有和根本的区别?为什么不全用controller或managers,他们都是Drivers。

别用双关语

可能很多类里面都会有add方法,只要这些add方法的参数列表和返回值在语义上等价,就一切顺利。

但是有些人写add方法实现,该方法通过增加或连续两个现存值来获得新值。

比如 把单个参数放到群集(collection)中,这个方法还应该叫做add吗?

应该叫做insert或append这类才对。

使用解决方案领域名称

主要程序员才会读取你的代码,所以尽量使用计算机科学术语、算法名、模式名、数学术语。

对于熟悉访问者(VISITOR )模式的程序来说,名称AccountVisitor 富有意义。哪个程序员会不知道JobQueue 的意思呢?程序员要做太多技术性工作。给这些事取个技术性的名称,通常是最靠谱的做法。

使用源自所涉问题领域的名称

如果不能使用程序员熟悉的术语来给手头的工作命名,就采用所涉问题领域而来的名称,至少这样,负责维护代码的程序员还可以去请教领域专家。

优秀的程序员,工作之一就是分离解决方案领域和问题领域的概念。与涉及问题领域更为贴近代码,应当采用源自问题领域的名称。

添加有意义的语境

设想你有名为firstName 、lastName street 、houseNumber 、city、state 和zipcode 的变量。 当它们搁一块儿的时候,很明确是构成了一个地址。不过,假使只是在某个方法中看见孤零零一个state 变量呢?你会理所当然推断那是某个地址的一部分吗?

有语境的代码

不要添加没用的语境

如果你有一个“豪华版加油站”(Gas Station Deluxe)的应用,在其中给每个类添加GSD前缀就不是什么好点子了。如果idea一搜索GSD就一堆。

再比如,你在GSD应用程序中的记账模块创建了一个表示邮件地址的类,然后给该类命名为GSDAccountAddress 稍后,你的客户联络应用中需要用到邮件地址,你会用 GSDAccountAddress 吗?这名字听起来没问题吗?在这17个字母里面,有10个字母纯属多 余和与当前语境毫无关联。

只要短名称足够清楚,就要比长名称好。

最后的话

取好名字最难的地方在于需要良好的描述技巧和共有文化背景。与其说这是一种技术、商业或管理问题,还不如说是一种教学问题。其结果是,这个领域内的许多人都没能学会做 得很好。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代码整洁之道是指编写易于理解、易于维护、可扩展性强的高质量代码的一系列准则和实践。以下是一些Java代码整洁之道的要点: 1. 命名规范:使用有意义的变量、方法和类名,遵循驼峰命名法,并避免使用缩写和单个字符作为名称。 2. 函数和方法的简洁性:函数和方法应该尽可能短小,只做一件事,并遵循单一职责原则。避免过长的函数和方法,可以通过提取子函数或方法来减少代码复杂性。 3. 注释和文档:使用清晰的注释来解释代码的意图和逻辑,但不要过度注释。另外,编写良好的文档注释,以便其他开发人员能够理解和使用你的代码。 4. 避免重复代码:重复代码会增加维护成本,应该尽量避免。可以通过提取公共代码块为方法或函数,或者使用继承、接口等方式来实现代码的重用。 5. 异常处理:合理处理异常情况,避免捕获所有异常或忽略异常。根据具体情况选择合适的异常处理方式,例如抛出异常、记录日志或返回默认值。 6. 单元测试:编写单元测试是保证代码质量的重要手段。每个方法都应该有对应的单元测试,覆盖各种情况,确保代码的正确性和稳定性。 7. 代码格式化:统一的代码格式可以提高代码的可读性。使用合适的缩进、空格、换行等格式化规范,并使用代码格式化工具进行自动格式化。 8. 设计模式和面向对象原则:熟悉常用的设计模式和面向对象原则,如单一职责原则、开闭原则、依赖倒置原则等,合理应用于代码设计中。 9. 持续重构:随着需求的变化和代码的演进,及时进行代码重构是保持代码整洁的关键。通过重构,可以改进代码结构、提高可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值