搜索
您的当前位置:首页正文

Clean Code代码整洁之道阅读笔记,提升代码写作规范

来源:哗拓教育


前言

《代码整洁之道》是由Robert C. Martin(也被称为“Uncle Bob”)所著的一本经典编程书籍,专注于如何编写可维护、易读且高质量的代码。以下是一个关于这本书的阅读笔记,结合实际的JavaScript代码示例。

一、什么是整洁的代码

  • 优雅:代码读起来令人愉悦,可读性
  • 效率:但并非单纯追求速度,可扩展性
  • 引诱:修改糟糕的代码,往往越改越乱
  • 细节:完善错误处理代码、前后不一的命名方式
  • 减少重复代码
  • 直观体现设计理念
  • 包含尽量少的实体,如类、方法、函数等

二、有意义的命名

  • 认真对待变量名,像给第一个孩子命名般谨慎
  • 变量、函数、类名应该能够表达其用途。
  • 使用描述性命名,而不是过于简短或抽象的名称。
  • 体现本意
  • 不使用魔术数
  • 使用读的出的名称
  • 使用可搜索的名称
  • 避免使用编码
  • 避免思维映射:不应该让读者在脑中把你的名称翻译成他们熟知的名称
  • 方法名应为动词或动词短语:set、get
  • 每一个概念对应一个词:fetch/get/
  • 别使用双关语:避免将同一单词用于不同目的,同一术语,不同概念
  • 使用解决方案领域名称:技术性的名称
  • 添加有意义的语境
// 不好的命名
let d;
function ld() {}

// 好的命名
let daysSinceModification;

function loadDocument() {}

三、函数

  • 函数应短小且功能集中:函数不应该长于一屏,20行最佳。
  • 每个函数只说一件事,每个函数依序承接下一个函数
  • 向下规则:每个函数一个抽象层级:想要代码拥有自上而下的阅读顺序,要让每一个函数后边都跟着位于下一抽象层级的函数,这样查看函数时,就能遵循抽象层级,向下阅读。
  • switch语句:switch太长时,出现几个问题:太长、不只做了一件事、违反了单一权责原则、违反开放闭合原则。解决方案是将switch埋到抽象工厂下,接收多态的派遣
  • 使用描述行的名称:长具有描述性的名称,比短而令人费解的名称要好
  • 动词与关键词:函数和参数应该形成动词、名称的形式
  • 函数参数:最理想的参数是0个,应避免三个及以上参数函数(除非有足够理由)
  • 标识参数:标识参数丑陋不堪。函数不只干一件事,为true时,为false时执行不同。因为调用者已经传入了标识,重构困难,只能把范围限制在该函数范围内或以下。
  • 参数对象:如果函数参数需要三个及以上
  • 无副作用:时序性解耦--调用时机所产生的影响
  • 抽离try catch代码块:搞乱代码结构,把错误处理和正常流程混为一谈,最好把主体部分抽离
// 不好的函数:
function processOrder(order) {
  if (order.isValid()) {
    let total = 0;
    for (let item of order.items) {
      total += item.price;
    }
    order.total = total;
    if (total > 100) {
      order.discount = total * 0.1;
    } else {
      order.discount = 0;
    }
    saveOrder(order);
  }
}


// 好的函数:
function processOrder(order) {
  if (!order.isValid()) return;

  calculateTotal(order);
  applyDiscount(order);
  saveOrder(order);
}

function calculateTotal(order) {
  order.total = order.items.reduce((sum, item) => sum + item.price, 0);
}

function applyDiscount(order) {
  order.discount = order.total > 100 ? order.total * 0.1 : 0;
}

四、别重复自己(DRY原则)

// 重复的代码
function getUserInfo(userId) {
  // fetch user info from database
  let user = database.fetchUser(userId);
  return {
    id: user.id,
    name: user.name,
    email: user.email
  };
}

function getProductInfo(productId) {
  // fetch product info from database
  let product = database.fetchProduct(productId);
  return {
    id: product.id,
    name: product.name,
    price: product.price
  };
}


// 抽象后的代码:

function fetchInfo(type, id) {
  let item = database[`fetch${type}`](id);
  return {
    id: item.id,
    name: item.name,
    ...type === 'User' && { email: item.email },
    ...type === 'Product' && { price: item.price }
  };
}

let userInfo = fetchInfo('User', userId);
let productInfo = fetchInfo('Product', productId);

五、注释的使用

  • 代码应该是自解释的,尽量通过清晰的命名和结构减少对注释的依赖。
  • 注释应当描述为什么,而不是做什么。
  • 注释不能美化的糟糕的代码:带有少量注释的整洁而有表达力的代码,要比带有大量注释而复杂的代码更好。与其花时间编写解释糟糕代码的注释,不如搞时间清洁糟糕的代码。
  • 用代码阐述,代码层面的优化比注释更好
  • 好注释:唯一真正好的注释就是不去写注释
  • 法律信息:这类注释不应是合同等,应指向外部链接
  • 提供信息的注释、对意图的解释、对复杂参数或返回值的解释、警示
  • TODO-解释部分代码的无所作为,及将来实现
  • jsDoc的使用
  • 误导性注释、多余注释、废话注释、注释掉的代码(其他人不敢删除注释掉的代码,堆积一起,就会冗余)

六、错误处理

  • 使用异常代替返回错误码。
  • 保持错误处理的代码整洁。
  • 在编写可能出现错误代码时, 先写try-catch-finally
  • 给异常发生的环境说明,以便判断错误来源
  • 别传递、返回null值
// 不好的错误处理:
function readFile(filePath) {
  if (fs.existsSync(filePath)) {
    let fileContent = fs.readFileSync(filePath, 'utf8');
    return fileContent;
  } else {
    return null;
  }
}

// 好的错误处理:
function readFile(filePath) {
  try {
    return fs.readFileSync(filePath, 'utf8');
  } catch (error) {
    console.error(`Error reading file from disk: ${error}`);
    throw error;
  }
}

七、单元测试

  • 单元测试用保证程序可运行的,用过即扔的短代码
  • 每个测试一个断言
  • 每个测试一个概念
  • FIRST原则: 快速、独立、可重复、自足验证、及时

八、类

  • 单一权责原则:类或模块应且只有一条加一修改的理由
  • 内聚:类中变量和方法相互依赖,形成一个逻辑整体

结论

《代码整洁之道》不仅仅是一本关于编码技巧的书,更是一本关于编程心态的指南。通过遵循这些原则,可以编写出更具可读性、可维护性的代码,使团队协作更加顺畅,代码质量更高。希望这些阅读笔记和代码示例对你有所帮助!

因篇幅问题不能全部显示,请点此查看更多更全内容

Top