Clean Code 读书笔记九

标签: code-monster java 方法
650人阅读 评论(0) 收藏 举报
分类:

要点汇总:

一般性问题

方法名称应该准确表达其具体行为
比如:

Date newDate = date.add(5)//加5天?5个月?

最好使用addDaysTo 或increaseByDays 明确方法的行为。

  • 使用多态 代替 switch或if else
    比如:
class RequestHandler {

    public void handleRequest(int action) {
        switch(action) {
            case LOGIN:
                doLogin();
                break;
            case LOGOUT:
                doLogout();
                break;
            case QUERY:
               doQuery();
               break;
        }
    }
}
interface Command {
    public void execute();
}

class LoginCommand implements Command {
    public void execute() {
        // do what doLogin() used to do
    }
}

class RequestHandler {
    private Map<Integer, Command> commandMap; // injected in, or obtained from a factory
    public void handleRequest(int action) {
        Command command = commandMap.get(action);
        command.execute();
    }
}
  • 用命名常量代替魔法数字
    不多说,代码中出现某个数字,如21,你知道什么意思么?
    这样 CommonConstants.AVERAGE_AGE=21,使用更好。

  • 不要再判断中写一堆&& ||的判断
    看看下边那个更易于理解

if (shouldBeDeleted(timer)) 

if (timer.hasExpired() && !timer.isRecurrent())
  • 避免否定性调节:
    肯定性条件比否定性条件更容易理解
    比如下边那一行更易理解呢?
if (buffer.shouldCompact())  
if (!buffer.shouldNotCompact())
  • 方法只做一件事
public void pay() {
    for (Employee e: employees) {
        if (e.isPayday()) {
            Money pay = e.calculatePay();
            e.deliverPay(pay);
        }
    }
}

重构:

public void pay() {
    for (Employee e: employees)
    payIfNecessary(e);
}
private void payIfNecessary(Employee e) {
    if (e.isPayday()) calculateAndDeliverPay(e);
}
private void calculateAndDeliverPay(Employee e) {
    Money pay = e.calculatePay();
    e.deliverPay(pay);
}
  • 让时序耦合的代码更明显
 public class MoogDiver {
    Gradient gradient;
    List < Spline > splines;
    public void dive(String reason) {
        saturateGradient();
        reticulateSplines();
        diveForMoog(reason);
    }...
}

saturateGradient();reticulateSplines(); diveForMoog(reason);
三者的关系并没有很好的突出,更好的重构是:

public class MoogDiver {
    Gradient gradient;
    List < Spline > splines;
    public void dive(String reason) {
        Gradient gradient = saturateGradient();
        List < Spline > splines = reticulateSplines(gradient);
        diveForMoog(splines, reason);
    }...
}
  • 使用枚举代替常量
    不要在用
public static fianl int ....

使用enum代替

  • Don’t Inherit Constants
public class HourlyEmployee extends Employee {
    private int tenthsWorked;
    private double hourlyRate;

    public Money calculatePay() {


        int overTime = tenthsWorked - straightTime;
        return new Money(
        hourlyRate * (tenthsWorked + OVERTIME_RATE * overTime));
    }...
}

TENTHS_PER_WEEK 、OVERTIME_RATE这两个常量来自哪里?

public abstract class Employee implements PayrollConstants {
    public abstract boolean isPayday();
    public abstract Money calculatePay();
    public abstract void deliverPay(Money pay);
}
public interface PayrollConstants {
    public static final int TENTHS_PER_WEEK = 400;
    public static final double OVERTIME_RATE = 1.5;
}

这种通过继承或实现的方式获取常量,是对常量作用域的忽视,怪异的使用。应该用引入静态类的方式在代码中直接使用常量。

import static PayrollConstants.*;

名称与命名

使用描述性名称
名称很重要,一个准确的名称可以大幅度提高代码的可读性。

public int x() {
    int q = 0;
    int z = 0;
    for (int kk = 0; kk < 10; kk++) {
        if (l[z] == 10) {
            q += 10 + (l[z + 1] + l[z + 2]);
            z += 1;
        } else if (l[z] + l[z + 1] == 10) {
            q += 10 + l[z + 2];
            z += 2;
        } else {
            q += l[z] + l[z + 1];
            z += 2;
        }
    }
    return q;
}
public int score() {
    int score = 0;
    int frame = 0;
    for (int frameNumber = 0; frameNumber < 10; frameNumber++) {
        if (isStrike(frame)) {
            score += 10 + nextTwoBallsForStrike(frame);
            frame += 1;
        } else if (isSpare(frame)) {
            score += 10 + nextBallForSpare(frame);
            frame += 2;
        } else {
            score += twoBallsInFrame(frame);
            frame += 2;
        }
    }
    return score;
}

两段代码对比一下即可知道名称的重要。

  • 变量的作用范围越大,越应该重视名称的重要。

  • 不要用名称掩盖了内容。

public ObjectOutputStream getOos() throws IOException {
    if (m_oos == null) {
        m_oos = new ObjectOutputStream(m_socket.getOutputStream());
    }
    return m_oos;
}

更准确的名称应该是: createOrReturnOos

测试

  • 使用测试覆盖工具

  • 测试边境条件
    很多问题都出在边界上,如数组越界等等。注意边境!

查看评论

Clean Code 读书笔记一

什么是 clean code ?大神对优雅代码的定义: I like my code to be elegant and efficient. The logic should be stra...
  • lemon89
  • lemon89
  • 2015-06-05 23:21:00
  • 1144

Clean Code 读书笔记三

clean code 之方法(函数)- 短小 ,再短小,更短小 20行最佳 只做一件事 准确说来每个方法应该是只做抽象概念上的的一件事 只做一件事的方法是无法把逻辑分段的 自顶向下的代码 To...
  • lemon89
  • lemon89
  • 2015-06-07 03:01:53
  • 1273

简明代码和代码重构思维导图

  • 2016年04月06日 12:33
  • 1.96MB
  • 下载

《九型人格与领导力》读书笔记

1、九型人格: 一号(完美主义者)、二号(给予者)、三号(实干者)、四号(浪漫主义者)、五号(观察者)、六号(怀疑论者)、七号(享乐者)、八号(保护者)、九号(调停者)。 备注:通过学习九种人格类...
  • cbk861110
  • cbk861110
  • 2012-12-23 16:25:44
  • 2795

Clean Code 读书笔记七

clean code 之 系统 构建与使用分离 Software systems should separate the startup process, when the application ...
  • lemon89
  • lemon89
  • 2015-06-22 12:17:12
  • 636

Clean Code 读书笔记四

能用代表表述的就不要用注释 减少注释,把精力放在代码上,让代码说话,而不是注释 不要写add by 的注释,用svn 、git管理组件就可以了** 代码中不要保留注释的代码 例如: //Chec...
  • lemon89
  • lemon89
  • 2015-06-14 16:46:11
  • 535

Clean Code 读书笔记八

简单设计四规则:• Runs all the tests • Contains no duplication • Expresses the intent of the programmer •...
  • lemon89
  • lemon89
  • 2015-06-22 17:39:33
  • 753

Clean Code 读书笔记二

细节汇总: 拒绝在容器类型的命名中使用 该容器类型 List flaggedCells = new ArrayList(); As we’ll see later on, even if the...
  • lemon89
  • lemon89
  • 2015-06-06 13:22:53
  • 658

clean code 读书笔记

第一章 整洁的代码 1.1 要有代码 代码永存 1.2 糟糕的代码 糟糕的代码会毁坏公司 我们都曾说过有朝一日回头清理,当然,在那些日子里,我们都没有听说过 勒布朗法则:稍后等于永不 1...
  • xradio
  • xradio
  • 2015-07-07 23:48:18
  • 291

《Clean Code》读书笔记.md

第一章;整洁代码 代码呈现了需求的细节 第二章:有意义的命名 名副其实,看名称能够理解意识,减少注释补充说明 做有意义的区分 第三章:函数 短小:if语句,else语句,while语句,其中的代码块应...
  • JiaoZi0201
  • JiaoZi0201
  • 2017-01-12 21:58:59
  • 327
    个人资料
    专栏达人
    等级:
    访问量: 13万+
    积分: 2777
    排名: 1万+
    博客专栏
    最新评论