功能相同,工作不同

时间:2014-07-30 04:01:53

标签: java function oop

这更像是一个设计问题。如何使函数执行不同的任务,具体取决于调用的位置。例如

public doSomething(int a, int b) {
a=a+b; //line 1
b=a+b; //line 2
}

现在我如何根据调用函数doSomething的位置来执行第1行或第2行。我宁愿不将任何额外的变量传递给函数,因为这个函数在很多地方被使用,它会搞乱我现有的代码

4 个答案:

答案 0 :(得分:2)

如果没有

,你无法真正根据上下文使你的方法表现出来
  1. 将带有上下文信息的参数传递给方法。
  2. 让包含该方法的类具有包含必要信息的上下文对象。
  3. 从缓存等地方获取调用者上下文信息。

答案 1 :(得分:2)

一般来说,一个函数应该做一件事并且做得好。

可以想象,一件事应该是选择之一,但前提是有很多共性。

这样做的最佳方法就是你似乎沉默寡言,你传递更多关于该做什么的信息。

也许我们应该解决的问题是你的沉默或提议的设计: - )


如果存在共性,并且由于对当前呼叫者的影响而您不愿意更改API,则还有另一种方法。

为新规范提供 new 函数,并更改旧函数以调用它。例如,假设您有一个函数来查找两个数字的总和:

def sum (a, b):
    return a + b

现在你想要一个新的功能,它可以给你总和或差异,你不想改变当前的来电者:

def sumOrDiff (type, a, b):
    if type == 'sum':
        return a + b
    return abs (a - b)

def sum (a, b):
    return sumOrDiff ('sum', a, b);

这样,你可以在一个地方使用公共代码(我希望它比这更复杂)但不改变已经使用它的调用。

这是一种陈旧的方法,可以在保持代码简单的同时进行更改,而不会破坏向后兼容性。

现在这是一个人为的例子。实际上,我仍然为求和和差异提供单独的函数。您的实际用例有望更有意义。

答案 2 :(得分:1)

你可以使用它。

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 


 for(StackTraceElement st : stackTrace){ // check st for further processing}

这将为您提供堆栈跟踪。取决于函数调用的深度。您可以相应地检查并了解您的情况。

注意:这有性能问题。我建议你改变你的设计或在你的函数中使用一个布尔参数来决定进一步的流程。

希望这能解决您的问题。

答案 3 :(得分:0)

如果我理解您的问题 - 一种方法可能是在您的班级中添加count这样的字段,

private int count = 0;
public doSomething(int a, int b) {
  if (count == 0) {
    a=a+b; //line 1
  } else {
    b=a+b; //line 2
  }
  count++;
}

显然,只有在调用line 1然后line 2时才能直接使用。但是,您可以添加类似

的内容
public void reset() {
  count = 0;
}

当然,这只是将上下文粘贴到您的班级中 - 并且可能更容易为"第2行"添加第3个参数重载方法。 -

public void doSomething(int a, int b) {
  doSomething(a, b, 0);
}

public void doSomething(int a, int b, int c) {
  if (c == 0) {
    a=a+b; //line 1
  } else {
    b=a+b; //line 2
  }
}

然后你只需改变第2行方法。