《重构》:Extract Class and Inline Class

这篇具有很好参考价值的文章主要介绍了《重构》:Extract Class and Inline Class。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

hey,gays lets go on to refator those sh!t .

i fork a rep, this the link

GitHub - TIMPICKLE/refator-code: 重构 - 改善既有代码的设计

all right, lets see the genel description.

提取类

对立:内联类

目的:将大类分成小类

场景:维护一个大量函数和数据的类

class Person{
  get officeAreaCode(){
    return this._officeAreaCode;
  }
  get officeNumber(){
    return this._officeNumber;
  }
}
class Person{
  constructor(telephoneNumber){
    this._telephoneNumber = telephoneNumber;
  }
  get officeAreaCode(){
    return this._telephoneNumber.areaCode;
  }
  get officeNumber(){
    return this._telephoneNumber.number;
  }
}
class TelephoneNumber{
  get areaCode(){
    return this._areaCode;
  }
  get number(){
    return this._number;
  }
}
内联类

对立:提炼类

目的:减少不必要的类

场景:

如果一个类不再承担足够的责任
重新分类两个类的不同职责

class Person{
  constructor(telephoneNumber){
    this._telephoneNumber = telephoneNumber;
  }
  get officeAreaCode(){
    return this._telephoneNumber.areaCode;
  }
  get officeNumber(){
    return this._telephoneNumber.number;
  }
}
class TelephoneNumber{
  get areaCode(){
    return this._areaCode;
  }
  get number(){
    return this._number;
  }
}
class Person{
  get officeAreaCode(){
    return this._officeAreaCode;
  }
  get officeNumber(){
    return this._officeNumber;
  }
}

我在阅读重构的时候,对内联类和提取类有一些疑问,他们看起来是对立的,那么在实际的代码中,我该如何选择呢?给我一些具体的例子?

在实际的代码中,选择内联类还是提取类取决于具体情况。下面是一些例子,可以帮助你更好地理解:

**内联类的例子**

如果一个类只有少量的属性和方法,而且这个类在整个代码中只被使用了一次,那么你可以考虑将这个类内联到使用它的地方。这样可以减少类的数量,使代码更加简洁。

例如,假设你有一个 `Person` 类和一个 `Address` 类,每个人都有一个地址。如果你只在 `Person` 类中使用了 `Address` 类一次,那么你可以将 `Address` 类内联到 `Person` 类中,使代码更加简洁。

**提取类的例子**

如果一个类的职责过于复杂,包含了多个不同的职责或功能,那么你可以考虑将这个类拆分成多个小的类。这样可以使代码更加清晰,并且每个类只需要关注自己的职责。

例如,假设你有一个 `Order` 类,这个类既包含了订单信息,又包含了订单处理的逻辑。如果你将订单处理逻辑提取成一个独立的类,比如 `OrderProcessor` 类,那么代码会更加清晰,并且每个类都只需要关注自己的职责。

希望这些例子可以帮助你更好地理解内联类和提取类的使用场景。

有代码实例吗?

当然,以下是一些具体的C#代码示例,以帮助您更好地理解内联类和提取类:

**内联类的示例:**

public class Person {
    public string Name { get; set; }
    public Address Address { get; set; }

    public void PrintAddress() {
        Console.WriteLine("Address: " + this.Address.ToString());
    }

    // other methods
}

public class Address {
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

    public override string ToString() {
        return $"{this.Street}, {this.City}, {this.State} {this.ZipCode}";
    }
}

在上面的代码中,`Person` 类只使用了一次 `Address` 属性,并且只有一个方法使用了这个属性。因此,我们可以将 `Address` 类内联到 `Person` 类中,使代码更加简洁:

public class Person {
    public string Name { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

    public void PrintAddress() {
        Console.WriteLine($"Address: {this.Street}, {this.City}, {this.State} {this.ZipCode}");
    }

    // other methods
}

**提取类的示例:**

public class Order {
    public int OrderId { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<OrderItem> Items { get; set; }

    public void ProcessOrder() {
        // process the order
    }

    // other methods
}

在上面的代码中,`Order` 类包含了订单信息和订单处理的逻辑。如果我们将订单处理逻辑提取成一个独立的类 `OrderProcessor`,那么代码会更加清晰,并且每个类都只需要关注自己的职责:

public class Order {
    public int OrderId { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<OrderItem> Items { get; set; }

    // other methods
}

public class OrderProcessor {
    public void ProcessOrder(Order order) {
        // process the order
    }
}

希望这些示例可以帮助您更好地理解内联类和提取类的使用场景。文章来源地址https://www.toymoban.com/news/detail-514350.html

到了这里,关于《重构》:Extract Class and Inline Class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Tomcat报错:cannot be cast to class java.util.Map (java.io.ObjectStreamClass$Caches$1 and java.util.Map

    启动tomcat时会报如下错误,原因是tomcat与jdk的版本不匹配。当然要因情况而异,给大家一个解决方法的思路 这是从tomcat官方文档中找到对应的jdk版本 后记 并不是tomcat与jdk版本匹配就一定不会问题,产生这个问题是我启动activiti-app时发生的,当时我的tomcat是9,JDK是11后来又换

    2024年01月21日
    浏览(39)
  • compile_and_runtime_not_namespaced_r_class_jar\debug\R.jar: 另一个程序正在使用

    run App的时候,提示该文件被占用 想要clean Project,还是提示该文件被占用,这个文件和连带的文件夹都无法被删除。 AndroidStudio下方的terminal(没有这个窗口的话,从上面的view-tool Winndow-terminal打开) 执行taskkill /im java.exe /f 关闭Android Studio,手动找到这个文件夹,删除该文件。

    2024年02月13日
    浏览(47)
  • idea连接登入GitHub账号提示:access token should have `repo` and `gist` scope

    idea连接登入GitHub账号(使用token连接登入)的时候出现提示: 解答一下现在说不行的同学的问题哈~ 首先你要确认,你本地是否安装了git,然后先用命令行确认本地配置连接git是没有问题的情况下,在进行idea环境的配置 1 删除token-重新去新建一个新的有效token令牌: 设置路径

    2024年02月13日
    浏览(45)
  • 小程序进阶-inline、block和inline-block的区别与联系

    每个html标签元素都有默认的元素类型,主要包括两大类:inline内联元素和block块元素。其他则称为可变元素,会根据上下文语境决定该元素为inline元素或者block元素。 在css里,有一个display的属性,它规定元素应该生的框的类型,可能的值很多,除inline、block,常用的有table-

    2024年02月09日
    浏览(32)
  • inline hook

    inline hook的核心是通过修改机器码改变程序的执行流程,实现跳转有很多种方式,如JMP的短跳(EB)、近跳(E9)、远跳(EA),其中短跳和进跳的的操作数是相对于EIP的偏移,其满足“目标地址 = 当前指令地址 + 指令长度 + RVA”,而远跳的操作数是一个绝对地址;又如 push+r

    2024年01月16日
    浏览(30)
  • 【C++】详解inline

    2023年8月28日,周一晚上 目录 优点 缺点 使用条件 为什么调用函数会有开销 举例说明 当使用 inline 声明一个函数时,编译器会将函数体内联到所有调用该函数的地方。 这可以提高执行效率,因为无需进行函数调用的开销。 但是,过度使用内联函数也有不利影响: 可执行文

    2024年02月11日
    浏览(39)
  • Inline内联函数简单理解

    How to Write it? example- 特点 编译器会将函数调用直接展开为函数体代码 人话: 直接将函数体里面的计算方法直接放到函数调用里,类似于宏替换。和#include 很像,但不相同。 编译后代码体量会变大。 用途 因为调用普通函数需要 开辟栈空间 ,调用完成后要 回收栈空间 如果是内

    2024年03月11日
    浏览(42)
  • 【C++】初阶 --- 内联函数(inline)

    🥰 用C语言先来实现普通的Add函数看一下 👇 转到反汇编来看一下: 可以看到,编译器为了实现一个简单的相加函数,Add函数体内需要执行的汇编指令要很多,而且为了调用函数还要执行指令跳转 (并且要在栈区上为函数开辟栈帧空间) ,如果 Add函数被重复大量地使用,则会

    2024年02月14日
    浏览(34)
  • Matplotlib中的%matplotlib inline是什么

    %matplotlib是一个魔法函数(Magic Function),功能:内嵌画图。将matplotlib的图表直接嵌入到Notebook中,或使用指定的界面库显示图表(由参数指定)。inline就表示将图表嵌入到Notebook中。 IPython有一组预先定义好的魔法函数,可以通过命令行的语法形式来访问。 Magic Function分两种

    2024年02月15日
    浏览(40)
  • mysql中json_extract的使用方法

    mysql5.7版本开始支持JSON类型字段,本文详细介绍json_extract函数如何获取mysql中的JSON类型数据 json_extract可以完全简写为 - json_unquote(json_extract())可以完全简写为 - 下面介绍中大部分会利用简写 id content 1 {“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包