【问题标题】:Same function, different jobs相同的功能,不同的工作
【发布时间】:2014-07-30 04:01:52
【问题描述】:

这更像是一个设计问题。如何使函数根据调用位置执行不同的任务。例如

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

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

【问题讨论】:

  • “从哪里调用函数 doSomething”你的意思是类??
  • 是的,它是一个公共函数,被同一类的两个不同函数调用。
  • 这更像是一个设计答案:改变你的设计。您可能认为您的提案将是一个简单的解决方案,但它很快就会成为维护的噩梦。 XY Problem。如果你真的,真的需要它,this answer 描述了你需要做的事情 - 但它很慢,我无法告诉你我建议不要这样做。

标签: java function oop


【解决方案1】:

如果没有

,你不能真正让你的方法根据上下文运行
  1. 将带有上下文信息的参数传递给方法。
  2. 让包含该方法的类有一个包含必要信息的上下文对象。
  3. 从缓存等地方获取调用者上下文信息。

【讨论】:

    【解决方案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);
    

    这样,您可以在一个地方拥有通用代码(我希望它比这更复杂),但无需更改已经使用它的调用。

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

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

    【讨论】:

    • 哈哈实际上我的老板不喜欢我这样做,即传递一个布尔值来告诉函数要做什么。
    • 另一个原因是该功能正在使用我的许多其他模块,我没有开发。所以这对那些程序员来说会很头疼。我想我将不得不创建第二个函数。
    • @Ritwick,这一次老板可能是对的 :-) 如果两个动作有很多共同点,只做布尔值。否则,创建一个单独的函数。
    • 他们确实有很多共同点,实际上除了 1 行。主要问题是其他开发人员也在使用该功能,这会使他们产生歧义
    【解决方案3】:

    你可以用这个。

    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 
    
    
     for(StackTraceElement st : stackTrace){ // check st for further processing}
    

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

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

    希望这能解决您的问题。

    【讨论】:

    • 与 Amadan 的评论相同。
    【解决方案4】:

    如果我理解您的问题 - 一种方法可能是在您的课程中添加像 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 行”添加第三个参数重载方法可能更容易 -

    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 行的方法。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多