代码之家  ›  专栏  ›  技术社区  ›  Amit Kumar Gupta

调用函数的方式

  •  0
  • Amit Kumar Gupta  · 技术社区  · 15 年前

    我想做一个API。我只想对终端程序员隐藏所有细节。我还想为他们提供调用函数的选项。

    我有4个同名但签名不同的函数(重载函数)

    function1()
    function1(arg1)
    function1(arg1,arg2)
    function1(arg1,arg2,arg3)
    

    在上述序列中,第4个函数ie function1(arg1,arg2,arg3) 有实际的逻辑。REST函数正在用一些默认值调用下一个函数。

    现在,如果用户调用上面序列ie中的第一个函数 function1() 然后调用第二个函数ie function1(arg1) 有一些默认值。等等。

    我的问题是,这种链接可以节省loc(代码行)并增加理解。但从性能角度看是否好?

    我的条件

    1. 我正在使用Java
    2. 我正在使用JDK1.4。因此支持可变数量的参数。

    尽管您也可以用其他语言建议我的性能,但前提是您不建议使用“可变参数数”功能。

    5 回复  |  直到 15 年前
        1
  •  1
  •   awe    15 年前

    通常,调用一个函数会导致内存跳跃,这对于性能来说比按顺序运行要昂贵得多。当只调用这两次时,这不是一个大问题,即使有许多级别的链接。但如果在大型循环中调用它,则可能会出现明显的性能问题。

    注:
    要将链接减少到最小,可以直接从所有简化函数调用最详细的函数(声明了所有参数)。

    function1(){
      function1(null,null,null);
    }
    function1(arg1){
      function1(arg1,null,null);
    }
    function1(arg1,arg2){
      function1(arg1,arg2,null);
    }
    
    function1(arg1,arg2,arg3){
       // Actual logic here...
    }
    

    这样你只有一个额外的步骤。

    注:
    编译器可能通过优化您的调用给您带来一些好处。甚至可能是编译器将替换对 function1() 打电话到 function1(null,null,null) 因为这就是全部 函数1() 做。

        2
  •  1
  •   Philipp    15 年前

    在像C/C++这样的语言中,编译器可以以根本不存在性能损失的方式处理这些事情。在类似matlab的语言中,每个函数调用都有一个值得注意的时间。

    如果这样的时间很重要,那么它很大程度上取决于调用方法的频率。如果它们做了一些需要大量计算的事情,或者如果它们被用于初始化,那么它们的调用可能不会太频繁。在这些情况下,我不担心这个。如果经常打电话给他们,我建议在做决定之前先衡量一下。

        3
  •  0
  •   Nivas    15 年前

    [注:我假设您在问问题时谈论的是现代编程语言(因为它没有明确的语言标记)。如果这不是真的,请放弃这个答案。]

    首先,这种链接的目的是 不应该 减少LOC。在性能方面,代码行是最不重要的,在某种程度上,甚至在可读性方面,尤其是在现代的IDES时代。(备案:“在某种程度上”。我不认为2500行的方法是好的)

    这样做的目的是为了避免逻辑的重复和程序员的方便,否则这将是维护的噩梦。(如果您要在所有方法中都有逻辑)以及最终程序员的一些困难(如果您只需要一个实现)

    在现代编程语言中,额外的两个方法类引起的开销是可以忽略的。这种优化(减少方法调用的数量)通常不会导致任何结果。

    性能取决于方法正在做什么,如果有任何性能问题,应该集中精力。

    我看不到任何问题,包括性能,实际上也看不到您在问题中提到的那种方法链接的好处。

        4
  •  0
  •   Matthieu    15 年前

    在C语言中,当没有提供额外的参数时,这些参数总是默认值。

    为此,我用定义…也许不是很漂亮,但是它可以工作,并且在最终的二进制文件中不会有任何性能影响(没有额外的堆栈空间,或者在程序计数器周围跳跃时间)。

        5
  •  0
  •   Landei    15 年前

    可能这有 更糟的 性能,但增加了更多的灵活性,并避免了用户混淆参数。如果你做一些类似的事情,你可以有类似于C++中的默认参数。

    public class function1 {
    
       private String arg1 = "ding";
       private String arg2 = "dong";
       private String arg3 = "dang";
    
       public function1 arg1(String arg1) {
           this.arg1 = arg1;
           return this;
       }
    
       public function1 arg2(String arg2) {
           this.arg2 = arg2;
           return this;
       }
    
       public function1 arg3(String arg3) {
           this.arg3 = arg3;
           return this;
       }
    
       public String eval() {
           return arg1 + arg2 + arg3;
       }
    
    }
    
    System.out.println(new function1().arg2("deng").eval());
    

    也许这在这里是多余的,但作为更多的论据,这是更好的解决办法。注意,如果某些参数是强制的,您可以将它们放入构造函数中。