【问题标题】:Eclipse method call refactoringEclipse 方法调用重构
【发布时间】:2013-07-10 17:37:51
【问题描述】:

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

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

// to
fooBar(object1, object2) ;

在哪里

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

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

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

编辑 - 响应 cmets 的更多信息:

我无法控制 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 ;
}

【问题讨论】:

  • 您为每个对象放置一个 foo 而为所有对象放置一个 foobar?当然会减少所需的内存。每个对象至少 4 个字节。
  • 在代码中的某些情况下 object1 的类型是 SuperClass;在其他情况下,object1 的类型明确地是 ChildClass,SuperType 的子类。
  • 你对foo的实现有控制权吗?让它永远不返回 null 会更容易——而是返回一个默认实例,bar() 只返回默认值。
  • 我已添加更多信息以响应您的 cmets。谢谢!
  • @huseyintugrulbuyukisik 我不确定你的意思。如果你的意思是改变 foo() 的实现,我不能。如果您的意思是每次都进行空值检查,我正在尝试通过使用实用程序方法来最大程度地减少代码重复。

标签: java eclipse methods refactoring


【解决方案1】:

我什至在这 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. 从备份副本中恢复每个方法的实现;

就是这样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多