码迷,mamicode.com
首页 > 其他好文 > 详细

CleanCode读书笔记六

时间:2015-06-22 11:08:07      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:class

  • 单一权责(SRP)
public class SuperDashboard extends JFrame implements MetaDataUser {
    public Component getLastFocusedComponent()
    public void setLastFocused(Component lastFocused)
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}

不符合单一权责原则,重构:

public class Version {
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}

每个类都应该都应该遵守单一职责。

  • 类的高内聚
    (如果一个类的变量,被类中的每个方法所使用,则该类具有最大内聚性。)

类的高内聚,意味着类的方法、变量相互依赖,结合为一个逻辑整体。
以下就是一个高内聚的类,除size()方法,其余方法中都完全使用了类的变量。

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;
    }
}

当我们把很大的方法 拆分 为一个个较小的方法时,如果小方法中用到了原有方法中的4个变量,那我们就要把这4个变量当作参数?4个参数的方法可不太好。

那我们把这四个变量设置为类变量,是方法共享。可是肯定其他大多数方法不会使用,这就降低了内聚邢。

其实,我们应该把他们拆成单独的类,既保证了内聚,又把长方法拆分了。

所以
把大方法拆分为小方法,也是把大类拆分为小类的时机,会使结构更加有组织

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)
}

重构后:

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 valuesList(Object[] fields, final Column[] columns)
}
public class SelectWithCriteriaSql extends Sql {
    public SelectWithCriteriaSql(
    String table, Column[] columns, Criteria criteria)@Override public String generate()
}
public class SelectWithMatchSql extends Sql {
    public SelectWithMatchSql(
    String table, Column[] columns, Column column, String pattern)@Override public String generate()
}
public class FindByKeySql extends Sql
public FindByKeySql(
String table, Column[] columns, String keyColumn, String keyValue)@Override public String generate()
}
public class PreparedInsertSql extends Sql {
    public PreparedInsertSql(String table, Column[] columns)@Override public String generate() {
        private String placeholderList(Column[] columns)
    }
    public class Where {
        public Where(String criteria)
        public String generate()
    }
    public class ColumnList {
        public ColumnList(Column[] columns)
        public String generate()
    }

有百利无一害,它符合 SRP、OCP,低内聚、更方便测试等等

CleanCode读书笔记六

标签:class

原文地址:http://blog.csdn.net/lemon89/article/details/46591975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!