重构:改善既有代码的设计(第二版)笔记总结

本文探讨了软件开发中常见的代码重构技术,包括拆分函数、封装变量、整合功能、引入参数对象等,旨在提高代码可读性和维护性。通过示例展示了如何处理过长函数、如何将逻辑封装,以及如何利用类和对象来组织数据,从而实现更高效、更易于理解的代码结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重构,第一个示例
为何,以及如何提炼一个函数
如何处理过长的函数

A First Set of Refactorings

在这里插入图片描述

Split Phase

在这里插入图片描述

Encapsulate Variable

let defaultOwner = { firstName: "Martin", lastName: "Fowler" };

// after encapsulate variable
let defaultOwnerData = { firstName: "Martin", lastName: "Fowler" };
export function defaultOwner() { return defaultOwnerData; }
export function setDefaultOwner(arg) { defaultOwnerData = arg; }

Combine Funtion into Class

使用类,将数据与函数捆绑,为数据与函数提供一个共同环境
在这里插入图片描述

Combine Functino into Transform

类似结构型设计模式中的monkey patching 猴子补丁

const rawReading = acquireReading();
const aReading = enrichReading(rawReading);
const basicChargeAmount = aReading.baseCharge;		// 将逻辑封装到 enrichReading 

function enrichReading(original) {
  const result = _.cloneDeep(original);
  result.baseCharge = calculateBaseCharge(result);
  return result;
}

Introduce Parameter Object

共有行为的数据放入一个类中,如找出温度在(50~55)之外的元素
在这里插入图片描述

Encapsulation

在这里插入图片描述

Encapsulate Collection

在这里插入图片描述

Encapsulate Record

organization = { name: "Acme Gooseberries", country: "GB" };

// after encapsulate record
class Organization {
  constructor(data) {
    this._name = data.name;
    this._country = data.country;
  }
  get name() { return this._name; }
  set name(arg) { this._name = arg; }
  get country() { return this._country; }
  set country(arg) { this._country = arg; }
}

Replace Primitive with Object

orders.filter(o => "high" === o.priority
  || "rush" === o.priority);

// after replace primitive with object
orders.filter(o => o.priority.higherThan(new Priority("normal")))

Replace Temp with Query

临时变量 -> Query (Class -> get value())

在这里插入图片描述

Organizing Data

Split Variable

一个变量,多种用途,将其拆成两个变量

let tmp = 2 * (height + width)
console.log(tmp)
tmp = height * width
console.log(tmp)

after split variable

const perimeter = 2 * (height + width)
console.log(perimeter)
const area = height * width
console.log(area)

Replace Derived Variable with Query

将可变数据的作用域限制到最小

如下例子:添加数据的时候还要计算 total,将计算total的逻辑单独移出来
在这里插入图片描述

Refactoring API

Separate Query from Modifier

查询函数副作用函数分离
在这里插入图片描述

Replace Parameter with Query

在这里插入图片描述

Perserve Whole Object

传递整个对象能够更好地应对变化,同时还能缩短参数列表

在这里插入图片描述

Replace Function with Command

在类中,将参数的传递放入构造器中而非某个方法中,可以非常直观的得出该类需要那些参数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值