重构的体会——类属性优先移动

  今天开始对一个别人写的项目进行优化,我先把类之间的关系想好好,开始移动方法,相应的再移动相应的类属性,改到后面,发现越改越多,基本上改完了所有方法重构就全部完成了,但是改动很大,而且中间没有测试的机会,一直有错误,耦合的太紧密了,没法一步一步的做,完成了大概一半的样子,发现做不下去了,即使硬着头皮做下去出错的可能太大了,我没把握重构后不出错。

  没办法,又重新checkout了一份代码,想了下,如果先移动方法,方法中包含了属性,就要求属性也进行相应的移动。但是如果只移动属性,就可以通过如下方法很容易实现移动属性,而相应的方法还在原来的位置。例如A类的a属性,移动到B类中,A类的do()方法操作了a。这种情况可以将B类型的一个引用传给A,把a移动到B类中并提供set/get方法。然后将A类中给a属性赋值的地方全部替换成b.setA(),相应的获取a的值的地方替换成b.getA(),这样就实现了类属性的移动。完成了这一步,整个程序跟原来是等价的,可以直接验证。因为没有修改方法的调用,且逻辑不复杂,故出错的几率要小很多。

public class A {
  private T a;

  public String do() {
    a = new T();
    System.out.println("a:"+a.getValue());
    return  a.getValue();
  }
}

class T {
    private String value;    // setValue/getValue ……
}

移动属性后的结果

public class A {
  private B b;

  public String do() {
    b.setA(new T());
    System.out.println("a:"+b.getA().getValue());
    return b.getA().getValue();
  }
}

class B {
  private T a;

  // setA/getA ……
}

如果只是看这个小例子,看不出移动属性后有什么好处,但是在一个遗留项目中的某一个类包含多许多不应该在该类中的属性时,且该类的许多方法都要用到这些属性时,这样将属性移到本来应该的位置中,就能够清晰每个类的职责,对后面的重构是一个基础。

时间: 2024-10-13 21:28:54

重构的体会——类属性优先移动的相关文章

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左到右对应0,1,2,3 enum CompassPoint { case North case South case East case West //enum中可以定义方法 func show(){ print(self) } } //定义enum 变量 var p = CompassPoint.Nor

类属性和实例属性冲突

类属性和实例属性名字冲突怎么办 修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢? class Person(object): address = 'Earth' def __init__(self, name): self.name = name p1 = Person('Bob') p2 = Person('Alice') print 'Person.address = ' + Person.address p1.address = 'Ch

java个人学习笔记:类属性,类方法

类属性作为该类各个对象之间共享的变量.在设计阶段,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性.相应的方法设置为类方法. 如果方法和调用者无关,这样的方法通常被称为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用.   static关键字 在java类中,可用static修饰属性,方法,代码块,内部类 被修饰后成员具备以下特点: 随着类加载而加载 优先于对象存在 修饰的成员,被所有对象所共享 访问权限允许时,可不创建对象,直接被类调用   类方法 可以用类名.方法名

python__基础 : 类属性,类方法,静态方法

类属性  定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 0 类属性用 实例.类属性   或者 类.类属性 都可以访问, 如 a = Test()  用 a.num 可以访问 ,但是如果这个实例有一个实例属性 self.num 那么这样访问的其实是 self.num , 所以一般用 类.属性 即这样 Test.num 访问 类方法, 类方法是属于这个类的方法,定义方式为 前面加上装饰器 @classmethod 且第一个参数传递的

python 类属性与实例属性

#__author__ = 'juzi_juzi' #类属性与实例属性 #1.无法通过类访问实例属性: #2.类属性归类所所有,但是所有实例都可访问: #3.如果存在相同名称的类属性与实例属性,实例访问的时候会优先使用实例属性,实例找不到该属性再找类属性: #4.实例修改了类属性值,但原类属性对应的值仍存在: class Test(): count = 3 # count 为类属性: def __init__(self,name,age): self.name = name #name ,age

django之创建第4-2个项目-访问class类属性和类方法

1.修改index <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>django之创建第4-2个项目</title> </head> <body> <h1>hello,{{test.name}}</h1> <!--模板 变量用变量定义--> &l

Python中父类和子类间类属性(非实例属性)的设置获取的传递

前几天做一个项目,遇见类似这样一个问题.父类是个公用类,很多子项目中都运用到了,而子类也要作为一个基本类在该项目中的很多地方都要用到,但是的原始父类里面有些类属性(注意这里是类属性,不是实力属性).在程序运行时候要进行重新设置. 背景:Python中父类的类属性,类方法,实力属性都能够被子类继承,实力属性的再设置很简单,当然为了控制类属性的访问权限(Python中不能完全实现控制),也可以用@preproty装饰符优化和控制实力属性的设置,父类的类属性被子类继承,可以很容易的获得父类属性的内容,

重构笔记——将类内联化

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43159817         在上一篇文章中介绍了"提炼类".本文将介绍"将类内联化"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类并没有做太多的事情. 解决:将这个类的所有特性搬移到另一个类中,然后移除原类. 动机 "将类内联化"正好与"