代码之家  ›  专栏  ›  技术社区  ›  Jeff Axelrod

重构以将私有字段从一个类移动到其助手类?

  •  10
  • Jeff Axelrod  · 技术社区  · 15 年前

    edit :我提交了一个 此重构的Eclipse增强请求

    是否有方法将私有字段从一个类移动到其助手类?下面的鸡爪抓取UML显示了我现在正在手动执行的操作。class c1 has private field and a private final reference to a helper object before the重构.

    重构之后,所有在 c1'中的引用都被更改为 helper.getfield()和 helper.setfield()中。

    class field
    
    C1类
    最终的私人领域;
    最终私人助手;
    
    公共字段getField()。{
    返回场;
    }
    
    公共C1()
    helper=new helper();
    field=new field();
    }
    }
    
    类帮助器{}
    
    类C1Prime{
    最终私人帮助者主要帮助者;
    
    公共字段getField()。{
    返回helper.getField();
    }
    
    公共c1prime()。{
    helper=new helperprime();
    }
    }
    
    类帮助器prime{
    最终的私人领域;
    公共帮助器prime()。{
    field=new field();
    }
    公共字段getField()。{
    返回场;
    }
    }
    < /代码> 
    
    

    我已经使用了Eclipse的重构功能很多,但是我找不到一种自动化的方法。

    例如,理想情况下,我会将私有字段/属性/成员从一个类拖到另一个类,并希望Eclipse询问我如何处理未解析的引用。它不提供任何建议,会破坏所有参考。

    我一直重复的操作是将不属于当前类的知识和行为分开。我正在将引用原始类中某些字段的属性和行为移动到新的“助手”类中。

    重构的第一步是移动字段。对helper类的引用作为字段存在于要从中重构的类中。为了不在重构过程中中断c1->code>的操作,我认为如果Eclipse提供在helper'中生成getter和setters,并在c1->code>中更新引用以使用getter/setters in the new class..

    是否有方法将私有字段从一个类移动到其助手类?下面的鸡爪抓取UML显示了我现在正在手动执行的操作。等级C1有私人field私人最终参考Helper重构前的对象。

    重构之后,中的所有引用C1'领域改为helper.getField()helper.setfield()适当时。

    UML Diagram

    class Field {}
    
    class C1 {
       final private Field field;
       final private Helper helper;
    
       public Field getField() {
          return field;
       }
    
       public C1() {
          helper = new Helper();
          field = new Field();
       }
    }
    
    class Helper {}
    
    class C1Prime {
       final private HelperPrime helper;
    
       public Field getField() {
          return helper.getField();
       }
    
       public C1Prime() {
          helper = new HelperPrime();
       }
    }
    
    class HelperPrime {
       final private Field field;
       public HelperPrime() {
          field = new Field();
       }
       public Field getField() {
          return field;
       }
    }
    

    我已经使用了Eclipse的重构功能很多,但是我无法找到一种自动化的方法。

    例如,理想情况下,我会将私有字段/属性/成员从一个类拖到另一个类,并希望Eclipse询问我如何处理未解析的引用。它没有提供任何建议,并且破坏了所有的引用。

    我一直重复的操作是将不属于当前类的知识和行为分开。我正在将引用原始类中某些字段的属性和行为移动到新的“助手”类中。

    重构的第一步是移动字段。对helper类的引用作为字段存在于要从中重构的类中。为了不破坏C1在重构过程中,我认为如果Eclipse提供在Helper'并更新中的引用C1使用新类中的getter/setter。

    6 回复  |  直到 13 年前
        1
  •  2
  •   Bill K    15 年前

    问题是,您的字段必须是私有的(我甚至不知道为什么存在创建公共非最终字段的能力)。那么你怎么可能从另一个类访问它呢?

    创建类时,将其设置为现有类的内部类或同一文件中的第二个类。

    如果将其设置为内部类,则可以先复制方法,然后再引用其他类中的成员。一旦将所有功能移植到上面,就可以移动变量。此时,不应该更新对该变量的任何引用,因为无论它在哪个类中,您都以相同的方式访问它。

    在同一个文件中将一个类设置为第二个类是很好的,如果您也在拆分功能——它允许您一次访问所有内容,而不必在窗口之间移动鼠标。完成后,只需将新类拖到它自己的Java文件中,重新计算导入,重新格式化,使其公开并保存它。

    在创建与现有类交互的新类时,我几乎总是使用这些方法中的一种。

        2
  •  8
  •   Mark Peters    15 年前

    好吧,这根本就没有意义 一般来说 . 从语义上讲,这是一个奇怪的操作。如果您将字段移动到一个新的、不相交的类(比如从字符串移动到整数),引用它的代码将没有新类的实例来获取实例字段。

    所以只有在特殊情况下才有意义:当字段是静态成员,或者您将其移动到父类时。

    对于静态成员 ,右键单击要移动的字段(变量名),然后单击重构->移动即可。选择新类型。引用将自动更新(亲自尝试并查看)

    当你把它移到父类或从父类移到父类 ,您可以使用重构->上拉或下拉,但这不会自动为您更改引用(只有下拉问题;上拉多态性问题指示引用仍然正常)。

        3
  •  1
  •   kukudas    15 年前

    在野外进行的移动操作无法正常工作。您可以移动一个字段,但Eclipse不会移动getter和setter。这是一个有趣的问题,如果可能的话,我不认为是这样。

        4
  •  1
  •   Bozho    15 年前

    不会 right click the field > Refactoring > Move 怎么办?

    是的,它不更新引用,但是想象一下它必须做什么——在引用字段的所有地方,它必须实例化新类。这不实际。

        5
  •  0
  •   Romain Linsolas    15 年前

    对于Java函数,可以简单地右击它的名称,然后选择 Refactor > Move . 在向导中,选择现在将管理此方法的新类。

    我认为这可以帮助你完成任务,即使你不能同时选择几个必须移动的元素…

        6
  •  0
  •   Nick H    15 年前

    如果目标类不存在,则可以使用 Refactor > Extract Class . 这将创建一个包含所选字段的新类,并将此类型的字段添加到原始类中。

    我不确定你是否能为一个确实存在的类做这件事——但是你可以总是使用extract类,然后剪切粘贴它的内容到你的新类中。