命名

创建一个好的声明模型是软件开发的一大挑战,一般使用如下工具:

  • 项目字典
  • 域术语、词汇
  • XP 风格表述

一般的原则

  • 对处理方法使用动词,对访问方法使用名词/形容词
  • 对类似的事物使用相同的词,不同的事物使用不同的词
  • 倾向使用单个词
  • 看重名字的表述能力

命名涉及的坏味道

  • 名字中有嵌套
  • 表达力差的名字
  • 不一致的名字

尽量不要使用表达力差的名字:

  • 单字符或双字符名
  • 无元音的名字
  • 带有编号的变量
  • 奇怪的缩写
  • 任意产生误导的名字

不一致的名字,对于用一个对象,在某处用了一个名字,而在另外一个地方用了另外一个名字。例如,对于同一个基本特性,可能用了 add()、store()、put()和 place()。

不必要的复杂性

涉及到的异味

  • 死代码:变量、参数、字段、代码段、方法或类为在任何地方使用
    • 需求发生改变,或者采用了新方法,但是没有进行充分的清理
    • 复杂逻辑会产生一些根本不会发生的条件组合
  • 过分一致性:
    • 存在未用到的类、方法、字段、参数
    • 就当前要实现的需求而言,代码过于复杂

采取的措施

  • 对于一个不必要的类
    • 如果此类的父类或子类更适合完成操作,则通过继承体系将其合并
    • 否则使用内联把行为合并到它的调用者中。
  • 对于不必要的方法,使用内联方法或者移除方法
  • 不必要的字段,删除
  • 不必要的参数,删除

重复

重复会导致如下问题:

  • 需要维护更多的代码
  • 变化的部分隐藏在不变的部分之中
  • 代码变化通常会隐藏更深层次的相似性
  • 有可能一处bug修复了,其他处的bug未修复

所涉及的异味:

  • 魔法数
    • 使用常量解决
  • 重复性代码
    • 简单形式:两段代码看上去几乎相同
    • 复杂形式:两段代码有几乎相同的功能
  • 不同接口的相似类
    • 创建类似的代码来处理类似的情况,却没有意识到还存在与之类似的其他代码

采取的措施

  • 如果一个方法内部或者同一个类的多个方法内部出现重复,那么可以提取方法
  • 如果两个兄弟类出现重复,则抽取方法,然后上移方法,在父类当中创建一个公共方法
  • 如果两个无关的类存在重复,这可以提取类将公共逻辑抽到新的类中。
  • 不同接口的相似类,采取重命名使方法名类似
  • 尽量删除多余的类
  • 如果两个类只是相似而非相同,在对它们进行合理协调后,抽取超类。

【参考资料】

  1. 重构手册
  2. 代码中如何选取名字

—EOF—