2

想象一下,您有两个具有完全相同结构的方法,但它们在内部调用的方法不同。“结构”是指逻辑运算符、回调或内部类的相同方案——即定义执行流程的所有内容。可能的几个用例:

1) 两种方法相似,但它们进行的内部调用不同(methodA 和 methodB)

void callIt(int a, int b) {

if (..) {
  methodA();
}

}

void callIt(int a, int b) {

if (..) {
  methodB();
}

}

2) 方法相似但内部调用参数参数不同(即方法之间的唯一区别是内部某些调用的重载(methodA))

void callIt(int a, int b) {

if (..) {
  methodA(a, b);
}

}

void callIt(String a, String) {

if (..) {
  methodA(a, b);
}

} 

是否可以简化此代码并避免代码重复?

PS我使用Java,但希望没关系。

Asnwer:Pete Belford 给出了一个答案,如果我猜对了——这里对其进行了更详细的描述:Refactoring methods that use the same code but different types

4

2 回答 2

1

我认为您在这里寻找的是依赖注入。

假设你有两个班级,A 和 B。

public interface Handler {
  myHandler(int a, int b);
}

public class AHandler implements Handler {....}

public class BHandler implements Handler {....}

然后根据一些标准,将正确的处理程序注入到调用代码中......

public class MyCaller {
    private Handler handler;  //have a setter.

    public void callIt(int a, int b) {
        handler.myHandler(a, b);
    }
}

显然,您可以使用 spring 框架通过配置进行这种注入,但您也可以编写自己的代码。

第二部分可以简单地完成我面向对象的重载概念。在界面中,您可以:

myHandler(int a, int b);
myHandler(String a, String b);

无法忍受糟糕的输入变量名称,这是许多常见 API 方法的操作方式。例如,StringBuilder append 方法有许多不同的版本,它们仅在输入参数上有所不同。

于 2013-08-23T13:43:35.103 回答
0

The first case could be generalized by passing in the method name as a String parameter and call it using reflection.

The second case is much harder since Java isn't good at dynamic casting of values.

Keep in mind that reflection can make your code much harder to read/maintain.

于 2013-08-23T13:48:31.807 回答