《代码整洁之道》第十章,类。教我们去识别能支持拓展的代码是怎样的,跟设计模式是有交集的,包括单一原则,开闭原则。借书中的代码和阐述,记录下对原则的认识,及识别高内聚、可拓展的代码。
根据需求要对代码进行修改,是非常合乎软件迭代的。但是如果不同维度的需求,都要对代码进行修改,那么代码就违反了单一职责。先贴原书的代码,后分析。
/**
* 修改时违反SPR 原则 (单一职责)
* Single Responsibility Principle
*
*/
public abstract class Sql {
// public Sql(String table, Column[] columns);
public abstract String create();
public abstract String insert(Object[] fields);
public abstract String selectAll();
public abstract String findByKey(String keyColumn, String keyValue);
public abstract String select(Column column, String pattern);
public abstract String select(Criteria criteria);
public abstract String preparedInsert();
private String selectWithCriteria(String criteria) {
return "";
}
private String columnList(Column[] columns) {
return "";
}
private String valuesList(Object[] fields, final Column[] columns) {
return "";
}
private String placeholderList(Column[] columns) {
return "";
}
update
类型语言select
支持子查询为了方便表达,比如把if (topLevel == 0 && parenet == null)
抽成私有方法 isTop()
,这个是提升代码可读的私有方法。而功能相关的私有方法,只与一部分功能相关,那么很有可能,这个私有方法应该放到其他类中。比如selectWithCriteria
只与 select
语句有关的方法,关心update
语句的开发者并不关心前者的代码。
abstract public class Sql {
public Sql(String table, Column[] columns) {};
abstract public String generate();
}
class SelectSql extends Sql {
public SelectSql(String table, Column[] columns) { super(table, columns); }
@Override
public String generate() { return ""; }
}
class Where {
public Where(String criteria) {}
public String generate() { return ""; }
}
class ColumnList {
public ColumnList(Column[] columns) {}
public String generate() { return ""; }
}
Sql
实现UpdateSql
,对Sql
和SelectSql
都不需要修改。class UpdateSql extends Sql {
public UpdateSql (String table, Column[] columns) { super(table, columns); }
@Override
public String generate() { return ""; }
}
我们根据需求拓展了Sql 类,却不用改变Sql 类及其实现类。即对修改关闭,对拓展开放,即开闭原则