質問

私はコマンドパターンに非常に精通していますが、ファンクターとコマンドの理論上の違いをまだ理解していません。特に、Javaの実装を考えています。どちらも基本的に「動詞」をプログラミングしています。オブジェクトとして表されます。ただし、ファンクターの場合、いくつかの例から見たように、匿名の内部クラスの実装は一般的です。誰でも私のためにこれをきれいにクリアできますか?

役に立ちましたか?

解決

ファンクターは「構文レベル」の概念です-関数ポインターのように構文的に扱うことができるオブジェクトにコードをパッケージ化します-つまり、パラメーターリストをその後に括弧で囲んで「呼び出す」ことができますC ++では、operator()をオーバーライドすることでクラスをファンクターにすることができます。

コマンドパターンのコマンドは、いくつかの実行可能な機能をパッケージ化するオブジェクトですが、ファンクターである必要はありません。たとえば、インターフェイスICommandを実装するクラスで、Do()を呼び出してコマンドを実行できます。

他のヒント

ファンクターは実装であり、オブジェクトを関数のように動作させる方法です。

「コマンドパターン」はデザインパターンです。
ファンクターは、「コマンドパターン」を実装する1つの方法です。

GOF から回答があります:

  

Coplienは実装方法を説明しています   ファンクター、関数であるオブジェクト、   C ++ [Cop92]で。彼は学位を取得します   使用における透明性の   関数呼び出し演算子のオーバーロード   (オペレーター())。コマンドパターンは   異なる;その焦点は 維持にあります   受信者との間のバインディング   機能(アクションなど)だけでなく    機能の維持

Apache Commons Functor ページの説明から:


ファンクターは、オブジェクト、または単一の汎用関数を表すオブジェクトとして操作できる関数です。

ファンクターは、以下を含む多くの強力なプログラミング手法をサポートおよび奨励しています。

  • 機能的スタイルでのプログラミング
  • 高階関数
  • 内部イテレータ
  • 継承とオーバーロードではなく、構成による再利用と特殊化
  • generic" callback"または「拡張ポイント」 API
  • 汎用の「フィルター」または述語API
  • 多くの「行動」訪問者、戦略、責任の連鎖などのデザインパターン。

GOF(ギャングオブフォー)の定義(Comptrolによる)によると、FunctorとCommandは2つの異なるパターンです。

すでに述べたように、Functorはサービスメソッドを含むクラスを表します。つまり、ファンクタークラスの主な役割は、独自のメソッドに実装された特定のロジックを格納することです。したがって、ファンクターで、独自のメソッドの内部ロジックのコンテナーをどのように考えることができます。歴史的に、Java仕様には「関数ポインター」の実装および/または概念が存在しないため、Functorが生まれました。これは、登録されたコールバック(オブザーバーパターンの特定の実装)のコンテキストで非常に役立ちます。

コマンドパターンは、InvokerエンティティをReceiverエンティティから分離することを目的としたデザインパターンを表します。主に、アクションリスナーからアクションをデカップリングする(イベントを生成する)必要がある場合に使用されます(GUIと考えてください)。特定のオブジェクトレシーバーを参照する特定の操作(独自のスーパークラスからの特定のコマンド実装に依存)の実行を担当するメソッドがあります。前述の定義では、実行メソッドは「スマートではない」と定義できます。実際、スマート実装では、それ自体を第3オブジェクトに委任するのではなく、動作ロジックを実装できます。 スマート実行メソッドがある場合、ファンクタを実装し、ファンクタ(特定のコマンドサブパート実装)をコマンドパターンのコンテキストに配置します。

これがお役に立てば幸いです。

ファンクターはコマンドパターンのコンポーネントであると考えています。これには、呼び出し側やコマンド受信者などの他のインフラストラクチャも含まれます。

Javaにはクロージャがないため、コマンドパターンはJavaで使用されます。 Functorsはクロージャーを実装する試みです。

クロージャーを持つ言語には、コマンドパターンは必要ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top