《重构 改善既有代码的设计(第2版)》读书笔记

一、基本信息 

中文名:《重构 改善既有代码的设计(第2版)》
英文名:《Refactoring improving the design of existing code》

作者:Martin Fowler   作者网站链接:https://martinfowler.com/

        

译者:熊节 林从⽻

         

二、电子书链接

  • https://gausszhou.github.io/refactoring2-zh/
  • https://book-refactoring2.ifmicro.com/

三、书籍结构

本书的重点包含两部分:(1)识别代码中的“坏味道”;(2)重构手法

  • 第一章通过剧院售票结算程序来展示代码如何进行重构
  • 第二章介绍重构的原则
  • 第三章比较出名,介绍了24中代码的坏味道
  • 第四章介绍构建测试体系
  • 第五章介绍重构名录
  • 第六到十二章介绍了61种重构手法

四、第一章简要笔记

1. 示例程序

剧院售票结算程序;基本逻辑如下:

剧名类型
《哈姆雷特》
悲剧
《皆⼤欢喜》
喜剧
《奥塞罗》
悲剧
票价计算⽅式:观众数量x
积分计算⽅式:
悲剧
x <= 30: 40000
x > 30: 40000 + 1000 * (x - 30)
max(x - 30, 0)
喜剧
x <= 20: 30000 + 300 * x
x > 20: 30000 + 300 * x + 10000 + 50 * (x - 20)
max(x - 30, 0) + floor(x / 5)

计算并打印输出票价和积分

function statement(invoice, plays) {
      let totalAmount = 0
      let volumeCredits = 0
      let result = `Statement for ${invoice.customer}\n`
      const format = new Intl.NumberFormat("en-us",
        {
          style: "currency",
          currency: "USD",
          minimumFractionDigits: 2
        }).format

      for (let perf of invoice.performances) {
        const play = plays[perf.playID]
        let thisAmount = 0

        switch (play.type) {
          case "tragedy":
            thisAmount = 40000;
            if (perf.audience > 30) {
              thisAmount += 1000 * (perf.audience - 30)
            }
            break
          case "comedy":
            thisAmount = 30000;
            if (perf.audience > 20) {
              thisAmount += 10000 + 500 * (perf.audience - 20)
            }
            thisAmount += 300 * perf.audience
            break
          default:
            throw new Error(`unknown type: ${play.type}`)
        }

        volumeCredits += Math.max(perf.audience - 30, 0)
        if ("comedy" === play.type)
          volumeCredits += Math.floor(perf.audience / 5)

        result += ` ${play.name}, ${format(thisAmount / 100)} (${perf.audience} seats) \n`

        totalAmount += thisAmount
      }

      result += `Amount owed is ${format(totalAmount / 100)} \n`
      result += `You earned ${volumeCredits} credits\n`
      return result
    }

输入参数:

    let plays = {
      "hamlet": {
        "name": "Hamlet",
        "type": "tragedy"
      },
      "as-like": {
        "name": "As You Like It",
        "type": "comedy"
      },
      "othello": {
        "name": "Othello",
        "type": "tragedy"
      }
    }
    let invoices = [
      {
        "customer": "BigCo",
        "performances": [
          {
            "playID": "hamlet",
            "audience": 55
          },
          {
            "playID": "as-like",
            "audience": 35
          },
          {
            "playID": "othello",
            "audience": 40
          }
        ]
      }
    ]

    let result = statement(invoices[0], plays)

输出结果:

Statement for BigCo
  Hamlet: $650.00 (55 seats)
  As You Like It: $580.00 (35 seats)
  Othello: $500.00 (40 seats)
Amount owed is $1,730.00
You earned 47 credits

从数据结果看:已满足程序要求

若增加两项需求:

  1. 以HTML格式输出结果
  2. 再增加多种戏剧类型

当前的程序便无法满足新的需求,因此需要对代码进行重构。

需求的变化使重构变得必要。如果⼀段代码能正常⼯作,并且不会再被修改,那么完全可以不去重构它
如果你要给程序添加⼀个特性,但发现代码因缺乏良好的结构⽽不易于进⾏更改,那就先重
构那个程序,使其⽐较容易添加该特性,然后再添加该特性。

2. 重构步骤

第一步: 保证修改的代码拥有⼀组可靠的测试,这些测试必须有⾃我检验能⼒;
第二步:发现代码中⼀段⼩的“坏味道”,采用对应重构⼿法进⾏重构;
        举例: 中间switch, 可以采用提炼函数将其提炼出来
        
function statement (invoice, plays) {
  let totalAmount = 0;
  let volumeCredits = 0;
  let result = `Statement for ${invoice.customer}\n`;
  const format = new Intl.NumberFormat("en-US",
                        { style: "currency", currency: "USD",
                          minimumFractionDigits: 2 }).format;
  for (let perf of invoice.performances) {
    const play = plays[perf.playID];
    let thisAmount = 0;

    switch (play.type) {
    case "tragedy":
      thisAmount = 40000;
      if (perf.audience > 30) {
        thisAmount += 1000 * (perf.audience - 30);
      }
      break;
    case "comedy":
      thisAmount = 30000;
      if (perf.audience > 20) {
        thisAmount += 10000 + 500 * (perf.audience - 20);
      }
      thisAmount += 300 * perf.audience;
      break;
    default:
        throw new Error(`unknown type: ${play.type}`);
    }

    // add volume credits
    volumeCredits += Math.max(perf.audience - 30, 0);
    // add extra credit for every ten comedy attendees
    if ("comedy" === play.type) volumeCredits += Math.floor(perf.audience / 5);

    // print line for this order
    result += ` ${play.name}: ${format(thisAmount/100)} (${perf.audience} seats)\n`;
    totalAmount += thisAmount;
  }
  result += `Amount owed is ${format(totalAmount/100)}\n`;
  result += `You earned ${volumeCredits} credits\n`;
  return result;
}

第三步:编译并执⾏测试

重构技术就是以微⼩的步伐修改程序。如果你犯下错误,很容易便可发现它
第四步: 测试通过commit提交
重构的节奏感,每⼀步都保证代码处于编译通过和测试通过的可⼯作状
第五步:循环第二三四步直到重构结果令人满意

五、代码的“坏味道”

待整理.....

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《重构:改善既有代码设计第2pdf》是一本由Martin Fowler撰写的软件工程经典之作,讲述了如何通过重构改善既有代码设计质量,提高软件系统的可读性、可维护性和可扩展性。这本书详细阐述了重构的原则、实践、技巧和案例,对软件开发人员、架构师和工程师都是非常有益的参考书籍。 重构是一种旨在在不改变软件系统外部行为的前提下修改代码内部结构的技术。通过重构可以消除代码中的重复、提取公共代码、改进函数和类的接口、消除魔法数字和硬编码等不良实践,使代码更加简洁、可读、可维护、可扩展,从而提高软件系统的质量。这本书中提出了多种重构技术,包括重命名、提炼函数、搬移函数、拆分类、合并类等等。通过实际案例的演示,读者可以深入理解每个技术的应用场景,以及如何正确地使用。 此外,《重构:改善既有代码设计第2pdf》还介绍了如何在重构时保持代码的正确性和完整性。它详细阐述了测试驱动重构的思想和技术,以及如何使用测试来验证所做的重构是否正确和有效。同时,该书还讲解了如何使用重构来应对软件设计中的问题和挑战,如代码坏味道、代码膨胀、复杂度过高等等。通过阅读本书,读者可以获得许多实用技巧和经验,从而更好地应对日常编码工作中的实际问题。 总之,《重构:改善既有代码设计第2pdf》是一本非常优秀的软件工程书籍,它提供了很多实用的技巧和经验,对于想要提高编码水平、提高软件系统质量的人员都是非常有价值的参考。 ### 回答2: 《重构:改善既有代码设计第2pdf》是一本非常有价值的书籍,它提供了许多关于重构代码设计方面的实用技巧和建议。在开发软件时,我们通常会遇到需要改进代码的情况,而本书就为我们提供了一些重构代码的方法和原则。 本书的作者Martin Fowler强调了“渐进式重构”的概念,即在不改变系统行为的前提下,逐步改进代码。这样做可以降低风险,同时提高代码质量。他还强调了代码的“坏味道”,指的是代码中常见的一些问题,例如代码冗余、过长的方法或类等,这些问题会导致代码难以维护。 本书还介绍了一些常见的重构技术,例如提炼函数、合并重复的代码、使用多态等。这些技术可以帮助我们改进代码设计,提高系统的健壮性和可维护性。 总的来说,《重构:改善既有代码设计第2pdf》是一个非常有用的书籍,可以帮助软件开发人员更好地重构和改进代码,并提高系统的可维护性和健壮性。通过印刷品将其的阅读体验最佳。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值