CleanCode读书笔记六

  • 单一权责(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,低内聚、更方便测试等等

时间: 2024-08-05 21:08:17

CleanCode读书笔记六的相关文章

悟道—位IT高管20年的职场心经(读书笔记六)

悟道--一位IT高管20年的职场心经 第七章  关于销售 用"最"来形容公司的销售,可以用上若干的词汇: 最牛,最累,最精,最傻,最有钱,最贱,最能吹,最能装... 1.1  销售人得基本素质 善胜者不争,善争者不战,善战者不败,善败者不乱. 五勤:嘴勤.腿勤.手勤(勤读勤记).耳目勤(多看多听).脑勤(勤思勤省). 能吃苦:身体之苦,巨大的心理压力. Not too hard, to be smarter! 1.2  销售VS前锋 最重要的是"临门一脚".拿下单子

Android驱动开发读书笔记六

第六章 Linux 驱动的工作和访问方式是 Linux 的亮点之一,Linux 系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与设备文件交换数据.介绍到如何在多种平台,使用多种方式测试Linux驱动.给出的实例是统计单词的个数,但是关键还在实现该算法的技术是Linux 驱动. (一).编写Linux驱动程序的步骤 1.建立Linux驱动骨架(装载和卸载Linux驱动)

《构建之法》读书笔记六

第14章:质量保障 软件的开发过程有三个主要特性:好.快.便宜.在开发一个软件时,我们应该尽可能的保证软件的质量,不能盲目地听从所谓的"专业人士"的意见,要有自己的见解. 衡量一个软件的质量: 研发出符合用户需求的软件 通过一定的软件流程,在预计的时间内发布"足够好"的软件 并通过数据和其他方式展现所开发的软件是可以维护和继续发展的. 第十五章:稳定和发布阶段 1.对bug进行会诊,确定:修复,砍掉,保持 2.事后诸葛亮会议:在开发过程中学到的知识,缺点

Distributed Programming With Ruby》读书笔记六 Starfish, Distribunaut and Politics (Part2 chapter4-6)

Chapter4: Starfish (海星?)这样的例子有时间换linux的环境试一下吧 Starfish1 bills itself as "a utility to make distributed programming ridiculously easy." I think that is a bit of an overstatement, but Starfish certainly can make distributed programming easier. Thi

读书笔记六

确定你的public继承塑模出is-a关系 public继承和is-a的之间的等价关系很简单.例如动物和鸟,鸟一定是动物,而动物不一定是鸟. public继承意味着is-a.适用于base classes身上的每一件事情也是一定适用于派生类身上的,因为每一个派生类对象也都是一个base classes对象. 避免遮掩继承而来的名称 int x;//global变量 void somefunc(){ double x;//local变量,这个变量会遮掩吊全局变量,在这个函数体内,改变的是doubl

读书笔记(六)

第一个Linux驱动程序: Linux驱动的工作和访问方式是Linux的亮点之一, 同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交换数据.例如,向Linux打印机驱动发送一个打印命令,可以直接使用C语

Machine Learning for hackers读书笔记(六)正则化:文本回归

data<-'F:\\learning\\ML_for_Hackers\\ML_for_Hackers-master\\06-Regularization\\data\\' ranks <- read.csv(file.path(data, 'oreilly.csv'),stringsAsFactors = FALSE) library('tm') documents <- data.frame(Text = ranks$Long.Desc.)row.names(documents) &

这就是搜索引擎--读书笔记六--索引的查询

索引的查询处理 为搜索引擎构建索引,其目的是能更快速地提取与用户查询相关的文档信息,假设搜索引擎已经建立了索引,我们如何利用倒排索引来相应用户的查询呢?这一次的总结就是给大家分享一下搜索引擎对于用户查询的处理过程. 目前有两种常见的查询处理机制,一种称为一次一文档方式,另外一种称为一次一单词方式. 下面我们用一个具体例子来分别说明两种基本查询处理方式的运行机制.在这个例子里,假设用户输入的查询为“搜索引擎 技术”,而“搜索引擎”这个单词对应的倒排列表中,文档ID依次为{1,3,4},“技术”这个

《http权威指南》读书笔记 六

HTTP客户端识别 可以记录客户端信息的http首部:From,User-Agent,Referer,Authorization,Client-IP,X-Forwarded-For,Cookie From:记录客户端的Email地址 User-Agent:记录客户端浏览器信息 Referer:记录用户来源页面的url(用户从哪个页面链接过来的) 用户登录:在浏览器发送请求时,如果服务器希望用户登录,会返回401 Login Required.浏览器会显示一个登录对话框,并用Authorizati