0

私はRobert W. Sebestaによるプログラミング言語の概念を読んでおり、第9章には aSubProgramを a として関数に渡すことに関する簡単なセクションがありparameterます。これに関するセクションは非常に短く、約 1.5 ページであり、その適用に関する唯一の説明は次のとおりです。

サブプログラムが数学関数をサンプリングする必要がある場合。いくつかの異なる点で関数をサンプリングすることにより、関数のグラフの下の領域を推定することによって数値積分を行うサブプログラムなど。このようなサブプログラムは、どこでも使用できる必要があります。

これは、私が今まで学んだこととはまったく異なります。この問題に独自の方法でアプローチする場合、function objectを作成し、上記を達成して を受け入れる関数を作成しますfunction objects

どこでこれを使用するかわからないため、これが言語の設計上の問題である理由がわかりません。クイック検索では、これが明確になりませんでした。

どうやら、ポインターを利用することで、C および C++ でこれを実現できます。JavaScript などのネストされたサブプログラムを許可する言語では、これを 3 つの方法で行うことができます。

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();
    };

提供された洞察に感謝します。

4

1 に答える 1

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

  • 将来の未知の時点で発生する可能性のあるイベントを処理できることが望ましい場合があります。これらのイベントがいつ発生するかを知っているコードの作成者は、そのときに何が起こるはずなのかについての手がかりがないかもしれません。アクションを発生させたい人が、いつ発生するかを知るメソッドをコードに与えることを許可すると、そのコードは、何をすべきかを知らなくても、適切なタイミングでアクションを実行できます。

最初の状況は、メソッドを与えられた関数が戻る前にのみそれを使用することが期待されるコールバックの特別なケースを表しています。2 番目の状況は、「ファクトリ パターン」または「依存性注入」と呼ばれることがある例です (ただし、これらの用語は、より広いコンテキストでも役立ちます)。3 番目のケースは、通常、フレームワークがイベントと呼ぶ構造を使用するか、「オブザーバー」パターンを使用して処理されます [オブザーバーは、何かが発生したときにオブザーバブル オブジェクトに通知するように要求します]。

于 2013-10-02T16:56:04.373 に答える