1

我正在尝试按照以下模式重构一些代码:

// from
object1.foo(object2).bar() ;

// to
fooBar(object1, object2) ;

在哪里

  • object1 是 SuperClass 的子类型
  • object2 是一个字符串
  • fooBar 在需要导入的实用程序类中

对于上下文,更改是由于 foo() 在某些情况下返回 null,这会在调用 bar() 时导致 NullPointerExceptions。
fooBar() 首先检查 foo() 是否会返回 null,如果是则返回默认值,否则调用 bar() 并返回该值。

我正在使用 Eclipse,我想知道是否有一种好方法可以做到这一点,而不是在文件搜索中使用正则表达式手动更改每次出现的情况。

编辑 - 回复评论的更多信息:

我无法控制 foo() 的实现。

关于 object1 是 SuperClass 的子类:

//in some cases this happens
SuperClass object1 = new SuperClass(/*whatever*/) ;

//in other cases this happens
ChildClass object1 = new ChildClass (/*whatever*/) ;

我虽然应该提到它,因为它可能会影响如何搜索 object1。

[也许] 更清晰的前后代码版本:

//before
Object result = object1.foo("a string").bar() ;
//NullPointerException if foo() returns null! :(

//after
Object result = fooBar(object1, "a string") ;

同时,在一个单独的实用程序类中,存在:

public static Object fooBar(SuperClass obj, String str) {
    Object result = DEFAULT_RESULT ;

    if (obj != null && str != null && obj.fooAble(str)) {
        result = obj.foo(str).bar() ;
    }

    return result ;
}
4

1 回答 1

0

我什至在这 3 年的生命中都找到了解决方案!:)

实际上基于代码重构的解决方案将一个方法调用替换为另一个方法调用。示例:在我们拥有之前:obj1.method1(){}; obj2.method2(obj1){ obj1.method1(); };

在应用 eclipse 重构“Inline ...”之后,我们将每次调用obj2.method2(obj1);替换为调用obj1.method1();

所以对于你的情况:

  1. 使用 foo, bar, fooBar 方法实现源文件的备份;
  2. 然后将 fooBar 的实现替换为: fooBar(object1, object2) { return this; };
  3. 将方法 bar() 的实现替换为: bar() { return this; };
  4. 将方法 foo(object2) 的实现替换为: foo(object2) { return fooBar(this,object2); };
  5. 然后适用于 bar() eclipse 重构“Inline ...”的任何调用,它只是溶解所有 bar() 调用;
  6. 再次应用“内联...”来object1.foo(object2)替换所有此类调用的任何调用fooBar(this,object2);
  7. 从备份副本中恢复每个方法的实现;

而已!

于 2016-08-10T19:40:32.813 回答