1.认识"代码简洁"

“简洁代码”是我在写代码中一直以来遵循的一条理论。事实上,对于我来说,与其说是一种理论,不如说是一种信仰。他是这么一种理念——你的代码必须够简洁且尽可能接近于完美。如果你所写出来的代码比你所需要的多,那么多出来的那部分代码不应该存在其中。任何的多余都是不可能容忍的,而且一直以来我甚至觉得一个空格都不允许多余。你要让你的代码不仅仅是解决了问题,而是尽可能的有效率、可读性好、易维护。同样,我经常花很多额外的时间去设计我的代码。
所有的一切开始于Andy Hunt 和 Dave Thomas 写的《程序员修炼之道》

2.如何 "代码简洁"

一.有意义的命名

1.名副其实

int d;//消逝的时间,以日计int elapsedTimeInDays;复制代码

2.避免误导

别用accountList来指称一组账号,除非它真的是List类型。提防使用不同之处较小的名称。误导性名称最可怕的例子,是用小写字母“l”和大写字母“O”作为变量名。因为他们看起来实在太像数字“零”和“壹”。如以下代码:

int a=l;if(O==l)  a=O1;else l=01;复制代码

3.做有意义的区分

废话是另一种没意义的区分。例如你有一个Product类和一个ProductInfo类,这两个名称虽然不同,意思却毫无区别。

4.使用读的出来的名称

像生成时间戳 这个变量应该是 generationTimestamp 而不是 genymdhms . 

5.使用可搜索的名称

尽量避免使用单字母和数字作为常量名称,因为它们通常很难在一大段代码中被准确的搜索出来。作者认为 单字母名称 仅用于短方法中的本地变量。名称长短应与其作用域大小相对应。

6.避免使用编码

把类型和作用域编进名称里面,徒然增加了解码的负担。典型的如:

  1. 匈牙利语标记法
  2. 成员前缀(没必要使用前缀来标明成员变量,应当把类和函数做的足够小,消除对成员前缀的需要)如下代码:
public class Part{  String description;  void setDescription(String description){    this.description=description;  }}复制代码

7.避免思维映射

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

8.类名

类名应该是名词或名词短语,例如 Customer、WikiPage、Account 和 AddressParser,避免使用 Manager、Processor、Data或者Info这样的类名。

类名不应当是动词。

9.方法名

方法名应当是动词或动词短语,如 postPayment、deletePage 或save。

10.每个概念对应一个词

给每个抽象概念选一个词,并且一以贯之。例如,使用fetch、retrieve和 get 来给在多个类中的同种方法命名。

二.函数

1.第一规则:短小

if语句、else语句、while语句等,其中的代码块应该只有一行。函数的缩进层级不应该多于一层或两层。

2.只做一件事

函数应该只做一件事,做好这一件事。

3.每个函数一个抽象层级

自顶向下读代码:向下原则。

4.使用描述性的名称

长而具有描述性的名称,要比短而令人费解的名称好。长而具有描述性的名称,要比描述性的长注释好。

5.函数参数

参数数量尽可能的少,最好的是零参数函数,其次是一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。

5.1 标识参数

应当尽量避免标识参数,避免向函数传入布尔值。

5.2 三元函数

写三元函数之前一定要深思熟虑,是否有必须写三个参数的必要性。

5.3 参数对象

如果函数需要两个,三个或三个以上的参数,就说明其中一些参数应该封装为类了。

5.4 动词与关键字

对于一元函数,函数和参数应当形成一种非常良好的动词/名词对形式。

例如:write(name),或者更好的名称:writeField(name)。例如:assertEqual改成assertExpectedEqualsActual(expected,actual)。复制代码

5.5 错误处理

  • 使用异常代替返回错误码
  • 抽离Try / Catch 代码块
  • 函数应该只做一件事,错误处理就是一件事。因此,错误处理的函数不该做其他事。

3.这书中的对我最有用的建议

1.类的层级

基类和派生类,较高层级不依赖较低层级派生类的概念。
例外情况是,派生类数量严格固定,基类中拥有在派生类之间选择的代码,在有限状态机的实现中这种情况很常见。然而需要注意的是,这种基类和派生类紧密耦合的,只是部署在同一个jar文件中。
一般情况下,我们是希望派生类和基类部署到不同的jar文件中,确保基类jar文件对派生类jar文件的内容一无所知,我们就能把系统部署为分散和独立的组件。当修改派生类时,不需要重新部署基类。这意味着大大降低了修改产生的影响,从而使维护系统变得简单。