当前位置: 首页 > article >正文

重构类关系-Pull Up Constructor Body构造函数本体上移三

重构类关系-Pull Up Constructor Body构造函数本体上移三

1.构造函数本体上移

1.1.使用场景

你在各个子类中拥有一些构造函数,它们的本体几乎完全一致。在超类中新建一个构造函数,并在子类构造函数中调用它。

构造函数是很奇妙的东西。它们不是普通函数,使用它们比使用普通函数受到更多的限制。

如果你看见各个子类中的函数有共同行为,第一个念头应该是将共同行为提炼到一个独立函数中,然后将这个函数提升到超类。

对构造函数而言,它们彼此的共同行为往往就是“对象的建构”。这时候你需要在超类中提供一个构造函数,然后让子类都来调用它。很多时候,子类构造函数的唯一动作就是调用超类构造函数。这里不能运用Pull Up Method (322),因为你无法在子类中继承超类构造函数。(你可曾痛恨过这个规定?)

如果重构过程过于复杂,你可以考虑转而使用Replace Constructor with Factory Method (304)。

1.2.如何做

  • 在超类中定义一个构造函数。
  • 将子类构造函数中的共同代码搬移到超类构造函数中。
  • 被搬移的可能是子类构造函数的全部内容。
  • 首先设法将共同代码搬移到子类构造函数起始处,然后再复制到超类构造函数中。
  • 将子类构造函数中的共同代码删掉,改而调用新建的超类构造函数。
  • 如果子类构造函数中的所有代码都是一样的,那么子类构造函数就只需要调用超类构造函数。
  • 编译,测试。
  • 如果日后子类构造函数再出现共同代码,你可以首先使用Extract Method (110)将那一部分提炼到一个独立函数,然后使用Pull Up Method (322)将该函数上移到超类。

1.3.示例

下面是一个表示“雇员”的Employee类和一个表示“经理”的Manager类:

 class Employee...
   protected String _name;
   protected String _id;
   
 class Manager extends Employee...
   public Manager (String name, String id, int grade) {
       _name = name;
       _id = id;
       _grade = grade;
   }
   private int _grade;

Employee的字段应该在Employee构造函数中设初值。因此我定义了一个Employee构造函数,并将它声明为protected,表示子类应该调用它

 class Employee
   protected Employee (String name, String id) {
       _name = name;
       _id = id;
   }

然后,我从子类中调用它:

   public Manager (String name, String id, int grade) {
       super (name, id);
       _grade = grade;
   }

后来情况又有些变化,构造函数中出现了共同代码。假如我有以下代码:

 class Employee...
   boolean isPriviliged() {..}
   void assignCar() {..}
   
 class Manager...
   public Manager (String name, String id, int grade) {
       super (name, id);
       _grade = grade;
       // 这段代码在其他子类中也会重复出现
       if (isPriviliged()) assignCar(); //every subclass does this
   }

   boolean isPriviliged() {
       return _grade > 4;
   }

我不能把调用assignCar()的行为移到超类构造函数中,因为唯有把合适的值赋给_grade字段后才能执行assignCar()。此时我需要使用Extract Method (110)和Pull up Method (322)。

 class Employee...
   void initialize() {
       if (isPriviliged()) assignCar();
   }
 class Manager...
   public Manager (String name, String id, int grade) {
       super (name, id);
       _grade = grade;
       // 将重复的代码提炼为方法,同时提升到父类中
       initialize();
   }

摘录来自: [美]马丁·福勒(Martin Fowler). “重构:改善既有代码的设计。” Apple Books.
摘录来自: [美]马丁·福勒(Martin Fowler). “重构:改善既有代码的设计。” Apple Books.

摘录来自: [美]马丁·福勒(Martin Fowler). “重构:改善既有代码的设计。” Apple Books.
摘录来自: [美]马丁·福勒(Martin Fowler). “重构:改善既有代码的设计。” Apple Books.


http://www.kler.cn/a/2932.html

相关文章:

  • 什么是根服务器?有什么作用?
  • TORCH_CUDA_ARCH_LIST
  • Docker 设置代理的三种方法(2024年12月19日亲自测试)
  • 谷歌集群数据集:负载均衡云服务测试数据
  • 【Unity3D】Particle粒子特效或3D物体显示在UGUI上的方案
  • AIDD - 探索语言模型在药物分子生成方面的应用
  • 2023年通过CDGA的朋友可以考CDGP数据治理专家认证啦!
  • 传感器之相机介绍和使用
  • 游戏开发中常用的算法(持续更新)
  • 206. 反转链表
  • [数据结构]排序算法
  • Swift入门
  • 类和对象 - 下
  • 第二十一天 数据库开发-MySQL
  • 大文件上传
  • forward函数——浅学深度学习框架中的forward
  • CVPR 2023 | 旷视研究院入选论文亮点解读
  • HCIP-6.2NAT协议原理与配置
  • Qt5.12实战之控件设计
  • 并查集、并查集+离线、并查集+倒叙回答
  • JVM知识整理
  • Python实现人脸识别检测, 对美女主播照片进行评分排名
  • 串口通信(STM32演示实现)
  • C++ 八股文(简单面试题)
  • 奇安信_防火墙部署_透明桥模式
  • ​selenium+python做web端自动化测试框架与实例详解教程​