1.类的组织
包括变量和方法
变量:公共静态常量、私有静态常量、私有实体变量、公共实体变量
方法:公共方法、私有方法,一般私有方法在调用该方法的方法后面
2.类应该短小
类的第一原则就是短小
命名是判断类的长度的第一手段
如果某个类无法命名精确,那说明这个类就太长了
2.1 单一权责原则
类或者模块应有其仅有一条加以修改的理由。
系统应该有许多短小的类而不是少量巨大的类组成,每个小类封装一个权责,只有一个修改的原因,并与少数其他类一起协同达成期望的系统行为
2.2 内聚
类应该只有少量的实体变量。类中的每个方法都应该操作一个或多个这种变量。
一般来说,创建极大化内聚类是既不可取也不可能,我们希望内聚性保持较高位置,内聚性高,意味着类中的方法和变量互相依赖,互相结合成一个逻辑整体
看一个例子
public class Stack{
private int topofStack=0;
List<Integer> elements=new LinkedList<Integer>();
public int size(){
return topofStack;
}
public void push(int element){
topofStack++;
elements.add(element);
}
public int pop() throws PoppedWhenEmpty{
if (topofStack == 0) {
throw new PoppedWhenEmpty();
}
int element=elements.get(--topofStack);
elements.remove(topofStack);
return element;
}
}
2.3保持内聚性就会得到许多短小的类
将大函数拆分成小函数,就会出现更多的类,而且在拆分函数的过程中,我们又会提前局部变量为实体变量以便于减少函数的入参,慢慢的类的内聚性就会下降,这个时候我们又需要将类拆分成内聚性更高的类,最终我们拆分成很多的短小内聚的类
3. 为了修改而组织(开闭原则)
基本上任何系统,都不可避免进行修改,每一次修改我们都是冒着系统其他部分不能如期工作的风险。但是在整洁的系统中,我们对类加以组织,最大程度降低了修改的风险
接下来我们看一个例子
public class Sql{
public Sql(String table,Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String findByKey(String keyColumn,String keyValue)
public String select(Column column,String pattern)
public String select(Criteria criteria)
public String preparedInsert()
private String columnList(Column[] columns)
private String valuesList(Object[] fields,final Column[] columns)
private String selectWithCriteria(String criteria)
private String placeholderList(Column[] columns)
}
当前的代码还不支持update的sql语句,如果我们需要支持update的语句,我们就必须修改sql,一旦进行了修改,我们就需要回归测试sql所有的功能,而且里面还有一些私有方法只和select语句相关,导致维护成本、测试成本、阅读成本大大增高
重新组织后
abstract public class Sql{
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql{
public CreateSql(String table, Column[] columns)
@Override
public String generate();
}
public class SelectSql extends Sql{
public SelectSql(String table, Column[] columns)
@Override
public String generate();
}
public class InsertSql extends Sql{
public InsertSql(String table, Column[] columns, Object[] fields)
@Override
public String generate();
private String valueList(Object[] fields,final Column[] columns);
}
public class SelectWithCriteriaSql extends Sql{
public SelectWithCriteriaSql(String table, Column[] columns, Criteria criteria)
@Override
public String generate();
}
...
经过重新组织后,每一个类中的代码都变的简单,大大降低了阅读成本和维护成本,满足了开闭原则,隔离了修改,支持了扩展,再想增加update语句,我们只需创建UpdateSql的类,实现update的功能即可