何时将子程序作为必要参数传递

时间:2013-10-02 05:10:14

标签: language-agnostic parameter-passing

我一直在阅读Robert W. Sebesta编写的“编程语言概念”,在第9章中有一个关于将SubProgram作为parameter传递给函数的简短部分。关于此的部分非常简短,约1.5页,其应用的唯一解释是:

  

当子程序必须采样某些数学函数时。例如,通过在多个不同点处对函数进行采样来估计函数图下的面积来进行数值积分的子程序。这样的子程序应该可以在任何地方使用。

这完全取决于我所学到的任何东西。如果我以自己的方式解决这个问题,我会创建一个function object并创建一个完成上述操作并接受function objects的函数。

我不知道为什么这是语言的设计问题,因为我不知道在哪里使用这个。快速搜索并没有让我更清楚。

显然,您可以通过使用指针在C和C ++中实现此目的。允许嵌套子程序(如JavaScript)的语言允许您以三种不同的方式执行此操作:

function sub1() {
    var x;
    function sub2() {
        alert( x ); //Creates a dialog box with the value of x
        };
    function sub3() {
        var x;
        x = 3;
        sub4( sub2 ); //*shallow binding* the environment of the                                 
                      //call statement that enacts the passed 
                      //subprogram
        };
    function sub4( subx ) {
        var x;
        x = 4;
        subx();
        };
    x=1;
    sub3();
    };

我很感激所提供的任何见解。

1 个答案:

答案 0 :(得分:1)

由于各种原因,能够传递“方法”非常有用。其中:

  • 执行复杂操作的代码可能希望提供一种方法,用于通知用户其进度或允许用户取消它。拥有复杂操作的代码必须执行这些操作本身会增加它的复杂性,如果从使用不同风格的进度条或“取消”按钮的代码调用它也会导致丑陋。相反,让调用者提供UpdateStatusAndCheckCancel()方法意味着调用者可以提供一种方法,该方法将更新调用者想要使用的任何进度条和取消方法。

  • 能够在表中存储方法可以大大简化需要将对象导出到文件并稍后再次导入的代码。而不是需要代码说

    if (ObjectType == "Square")
      AddObject(new Square(ObjectParams));
    else if (ObjectType == "Circle")
      AddObject(new Circle(ObjectParams));` 
    etc. for every kind of object
    

    代码可以说类似

    if (ObjectCreators.TryGetValue(ObjectType, out factory))
      AddObject(factory(ObjectParams));
    

    处理已将其创建方法添加到ObjectCreators的所有类型的对象。

  • 有时希望能够处理将来某个未知时间可能发生的事件;知道这些事件何时发生的代码的作者可能不知道应该发生什么事情。允许希望操作发生的人为代码提供一个知道何时发生的方法,允许该代码在正确的时间执行操作,而不必知道它应该做什么。

第一种情况表示回调的一种特殊情况,其中给出该方法的函数只能在它返回之前使用它。第二种情况是有时被称为“工厂模式”或“依赖注入”的例子[尽管这些术语在某些更广泛的背景下也是有用的]。第三种情况通常使用框架引用为事件的构造来处理,或者使用“观察者”模式处理[观察者要求可观察对象在发生事件时通知它]。