1 整洁代码
没什么需要写的
2 有意义的命名
不必使用m_前缀来标明成员变量。
接口名最好不要加额外的修饰,如果接口和实现必须选择一个加修饰的话,宁愿选择实现,如ShapeFactoryImp,而不用IShapeFactory作为接口名。
概念名称要一致,比如fetch, retrieve, get和Controller, Manager。
避免使用双关语,比如add既有加减乘除的意思,也有添加的意思。如果代码中同时出现这两个,后者就应该用insert或者append。
3 函数
函数应该尽可能短小。
将一个大函数抽象成多个层级,每个层级单独编写一个函数。switch可以借助多态埋藏在较低的抽象层级,比如原本calculatePay函数用switch计算不同类型Employee的工资,如下
就应该把计算工资的函数埋藏在Employee中,不同类型的Employee都是一个单独的类,都有一个calculatePay的函数,如下
函数命名不要害怕长名字。
函数参数要尽可能少,最好是0个,其次是1个,再次是2个。
单参数函数:函数名称要尽可能体现这会修改系统状态,还是仅仅是个无状态的转换操作。转换操作就应该使用返回值,而不是修改参数。
不要用标识函数(即单参数且这个参数是个布尔值),这样的函数应该直接被换成两个相应的函数。如render(Boolean isSuite)改成renderForSuite()和renderForSingleTest()。
两参数的函数可以用。有些本来就是两参数,比如Point(1,2),但是writeField(outStream, name)最好改为outStream.writeField(name)。
如果参数中有多个参数是相关联的,就应该封装成一个类,如makeCircle(int x, int y, int radius)就应该改为makeCircle(Point center, int radius)。writeField(name)比write(name)更好,因为前者说明了name是一个“field”;assertExpectedEqualsActual(expected, actual)比assertEqual(expected, actual)更好,因为前者减轻了记忆参数顺序的负担。
函数应该尽可能避免副作用,如果确实有副作用,则应该在命名中体现出来。
函数参数中尽量避免用于输出的参数,如向一个List类型的参数写入新元素。如果函数确实需要修改状态,那么最好用report.appendFooter()而非appendFooter(report)。
函数要么修改,要么查询,不要都做。
尽量使用异常代替错误码。这样的话,如果有新的异常,只需要从原先类中派生出来,而不需要修改错误码定义。
错误处理这件事就应该放在独立的函数中完成。把try-catch抽离出来,如下
可能一开始没有办法做到符合上述规则的函数,这得写好以后打磨,修改,使之符合上述规则。