概要
純粋関数を、アルゴリズムを記述するパッシブオブジェクトと、それらのアルゴリズムを実行できるアクティブオブジェクトに分割することの長所と短所は何ですか?関数に副作用がないため、状況が大幅に簡素化されることに注意してください。
詳細
私が書いているコードの一部(Python 3で)は、主に関数型プログラミングに準拠しています。
いくつかの(不変の)データがあります。いくつかのアルゴリズムがあります。そして、それらのアルゴリズムをデータに適用して、結果を得る必要があります。
アルゴリズムは通常の関数として表すことができ、標準の操作を使用して変換されます(たとえば、2つの関数を作成し、を使用して一部のパラメーターをフリーズfunctools.partial
し、結果の関数を引数として別の関数に渡すことができます)。パフォーマンス上の理由から、下位レベルの関数の多くはメモ化されます。
しかし、おそらくアルゴリズムをパッシブオブジェクトとして表現する必要があるという考えが浮かびました。そのようなオブジェクトは、それ自体では何も実行できません。実行する準備ができたら、アルゴリズムオブジェクトとそれが期待するすべての入力を特別な「計算」オブジェクトにフィードします。これは私のアルゴリズムのメンタルモデルとはるかによく一致しますが、このアプローチでいくつかの問題を見逃しているのではないかと心配しています。
アルゴリズムオブジェクトは、さまざまな方法で実装できます。おそらく、複数の実装も許可される可能性があります。私のアルゴリズムが抽象クラスAlgorithmのインスタンスであるとしましょう。その場合、そのサブクラスは次を表すことができます。
- 作成するドメイン固有言語のテキスト文字列
- 私が構築するある種の実行ツリー
- 通常のPython関数でさえ
私はこれまでこれを行ったことがないので、このアイデアについてフィードバックをもらいたいと思いました。より「自然」であるという私の主観的な感覚は別として、それは実際のデザイン上の利点を提供しますか?問題はありますか?