1 整洁代码
代码逻辑直截了当;尽量减少依赖关系;依据某种分层战略完善错误处理代码;性能达到最优;
2 有意义的命名
1)名副其实;2)避免误导;3)做有意义的区分;4)方法名应该是动词,如deletePage或者save
3 函数
函数应该尽量短小;它应该只做一件事,做好一件事;
每个函数一个抽象层次:自顶向下读代码。每个函数都跟着位于下一个抽象级的函数。
使用描述性的名称;
抽离try/catch代码块:
public void delete(Page page)
{
try
{
deletePageAndAllReferences(page);
}catch(Exception e){}
}
private void deletePageAndAllRefernces() throws Exceptions{
deletePage(page);
registry.deleteReference(page.name);
}
delete函数只处理异常,deletePageAndAllRefernces函数只完全删除一个page有关。
减少函数代码的重复。
4 注释
法律信息;提供信息的注释;对意图的解释;TODO注释用来保存程序员应该做但是某些原因还没做的事情。
5 格式
1)概念间垂直方向上的区隔,紧密概念垂直方向靠近。
2)变量声明尽量靠近使用位置。
3)相关函数应该放在一起。
4)概念相关的代码应该放在一起。
6 对象和数据结构
1)数据抽象
隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象。类并不简单的取值器和赋值器将其变量推向外间,而是暴露抽象接口。以便用户无需了解数据的实现就能操作数据本体。
具象机动车
public interface Vehicle{
double getFuelTankCapacityInGallons();
double getGallonsofGas();
}
抽象机动车
public interface vehicle{
double getPercentFuelRemianing(){}
}
2)数据,对象的反对称性
对象把数据隐藏在抽象之后,曝露操作数据的函数;数据结构曝露其数据,没有提供有意义的函数。Geometry操作形状类,形状类都是简单的数据结构,没有任何行为。
过程式形状代码
public class Squire
{
public Point topLeft;
public double side;
};
public class Geometry
{
public final double PI=3.14;
public double area(object shape) throws NoSuchShapeException{
if(shape instaceof Squire){
Squire s=(Squire) shape;
return s.side*s.side
}
...
}
};
面向对象的方案
public class Squire implements Shape
{
private Point topLeft;
private double side;
public double area(){
return side*side;
}
};
过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。
3)the Law of Demeter
方法不应该调用任何函数返回的对象的方法。但是类只是数据结构,没有任何行为,该定律不再适用。
10 类
1)公共静态变量应该先出现,其次是私有静态变量,以及私有实体变量。
2)单一权责原则(SRP)
3)大函数拆分成小函数,据此将类拆分成小类。
4)为了修改而组织。
一组必须打开修改的类
public class Sql
{
public Sql();
public string create()
public string selectALl()
};
一组封闭类
abstarct public class Sql
{
public Sql(){}
abstract public String generate();
};
public class CreateSql extends Sql
{
public CreateSql();
@override public String generate()
};
11 系统
IOC实现分离构造和使用。Spring 框架提供了最有名的Java DI容器。用户在XML配置文件中定义相互关联的对象,然后Java代码请求特定的对象。