圣诞大减价开始了!

用方法对象替换方法

问题

你有一个很长的方法,其中局部变量是如此纠缠在一起,你不能应用提取方法

解决方案

将方法转换为单独的类,以便局部变量成为类的字段。然后可以将该方法拆分为同一个类中的几个方法。

之前
class Order{//…public double price() {double primaryBasePrice;双secondaryBasePrice;双tertiaryBasePrice;//执行长计算。}}
class Order{//…public double price(){返回新的PriceCalculator(this).compute();}}类PriceCalculator{私有双primaryBasePrice;private double secondaryBasePrice;private double tertiaryBasePrice;public PriceCalculator(Order Order){//从// Order对象复制相关信息。} public double compute(){//执行长计算。}}
之前
公共类Order{//…public double Price() {double primaryBasePrice;双secondaryBasePrice;双tertiaryBasePrice;//执行长计算。}}
公共类Order{//…public double Price(){返回新的PriceCalculator(this).Compute();}}公共类PriceCalculator{私有双primaryBasePrice;private double secondaryBasePrice;private double tertiaryBasePrice;public PriceCalculator(Order Order){//从// Order对象复制相关信息。} public double Compute(){//执行长计算。}}
之前
class Order{//…公共函数价格(){$primaryBasePrice = 10;$secondaryBasePrice = 20;$tertiaryBasePrice = 30;//执行长计算。}}
class Order{//…公共函数price() {return (new PriceCalculator($this))->compute();}}类PriceCalculator {private $primaryBasePrice;私人secondaryBasePrice美元;私人tertiaryBasePrice美元;public function __construct(Order $ Order){//从Order对象中复制相关信息。}公共函数compute(){//执行长计算。}}
之前
班级顺序:#…def price(self): primaryBasePrice = 0 secondaryBasePrice = 0 tertiaryBasePrice = 0 #执行长计算。
班级顺序:#…def price(self):返回PriceCalculator(self).compute()类PriceCalculator: def __init__(self, order): self。_primaryBasePrice = 0 self。_secondaryBasePrice = 0 self。从# order对象中复制相关信息。执行长时间计算。
之前
class Order{//…price(): number {let primaryBasePrice;让secondaryBasePrice;让tertiaryBasePrice;//执行长计算。}}
class Order{//…price(): number{返回新的PriceCalculator(this).compute();}}类PriceCalculator {private _primaryBasePrice: number;private _secondaryBasePrice: number;private _tertiaryBasePrice: number;构造函数(order: order){//从// order对象复制相关信息。} compute(): number{//执行长计算。}}

为什么重构

一个方法太长了,你不能把它分开,因为有大量的局部变量很难相互分离。

第一步是将整个方法隔离到一个单独的类中,并将其局部变量转换为类的字段。

首先,这允许在类级别隔离问题。其次,它为将一个庞大而笨重的方法分割成较小的方法铺平了道路,这些方法无论如何都不符合原始类的目的。

好处

  • 将一个长方法隔离在它自己的类中可以防止方法的规模膨胀。这也允许在类内将其拆分为子方法,而不会用实用工具方法污染原始类。

缺点

  • 添加了另一个类,增加了程序的整体复杂性。

如何重构

  1. 创建一个新类。根据要重构的方法的目的来命名。

  2. 在新类中,创建一个私有字段,用于存储对先前定位方法的类实例的引用。如果需要,可以使用它从原始类中获取一些所需的数据。

  3. 为方法的每个局部变量创建单独的私有字段。

  4. 创建一个构造函数,该构造函数接受方法的所有局部变量的值作为参数,并初始化相应的私有字段。

  5. 声明主方法并将原始方法的代码复制到主方法中,用私有字段替换局部变量。

  6. 通过创建一个方法对象并调用它的主方法来替换原始类中原始方法的主体。

Baidu
map