clean code 读书笔记(二)

一、对象

  1. 对象不应该暴露数据,而只暴露行为。
  2. 暴露数据的对象属于数据结构(DTO),数据结构无过多的行为,只有setter/getter。

二、错误处理

  1. 使用异常而不是返回某个错误码
  2. 尽量使用不可控异常(即非编译型异常),因为这样会打破开闭原则,函数每一层调用都会在方法签名中增加throw语句
  3. 再异常发生的时候,给出充分的说明和记录(日志和可读,可辨识的有用信息)传递出去。信息中包含失败的操作和失败的类型。
  4. 当调用方法有多种异常抛出, 但所有异常捕获后处理行为一致的情况下,我们需要简化异常(自定义异常),将所有异常封装成统一异常抛出。
Port port = new Port(12);
try {
  port.open();
} catch (DeviceResponseException e) {
  logger.error(e.getMessage());
} catch (PortException e) {
  logger.error(e.getMessage());
} catch (IOException e) {
  logger.error(e.getMessage());
} finally {
  port.close(); 
}

上述异常捕获后处理行为一致,所以我们可以简化代码, 打包异常。

public class PortWrapper() {
  private Port port;
  public PortWrapper(int portNum) {
    port = new Port(portNum);
  }

  public void open() throws PortDeviceFailureException {
    try {
      port.open();
    } catch (DeviceResponseException e) {
       throw new PortDeviceFailureException(e);
    } catch (PortException e) {
       throw new PortDeviceFailureException(e);
    } catch (IOException e) {
       throw new PortDeviceFailureException(e);
    } finally {
      port.close();
  }
}

三、边界

  1. Map,List等集合类接口,不要作为方法参数在系统中传递。
  2. 第三方接口和系统本身的接口尽量不耦合,使用adaptor设计模式进行适配,方便系统扩展和测试。

四、单元测试

TDD三大定律:

  • 没有测试之前不要写任何功能代码
  • 只编写恰好能够体现一个失败情况的测试代码
  • 只编写恰好能通过测试的功能代码

五条原则(F.I.R.S.T.):

快速(Fast): 测试足够快.
独立(Independent): 每个测试要互相独立,每一个case不互相依赖。
可重复(Repeatable):测试应当可以任何环境重复通过。
自足验证(self-validating): 测试应该又boolean值输出,即断言,不应该通过查看日志来确定测试是否通过。
及时(Timely): 测试应及时编写。单元测试应该恰好在其通过的生产代码之前编写。

  1. 单元测试一定要具有很好的可读性。明确,简洁,足够的表达力
  2. 测试遵循构造-操作-校验(Build-OPERATE-CHECK)模式。每个测试清晰的拆分成三节。
  3. 单元测试断言数量应最小化。
  4. 每个测试case只测试一个概念。

你可能感兴趣的:(clean code 读书笔记(二))