40

視覚化のための設計パターンとクラス図の使用を含むオブジェクト指向アーキテクチャに精通しており、コントラクトとプロトコル バインディングを備えたサービス指向アーキテクチャについても知っています。関数型プログラミング言語?

FPは中規模から大規模のプロジェクトに使用されていることを知っています。Paul Graham は Yahoo! の最初の化身を書きました。Common Lisp に保存します。一部の Lisp 開発システムは複雑です。関数型言語で書かれた人工知能と金融システムは、かなり大きくなる可能性があります。それらはすべて、少なくとも何らかの固有のアーキテクチャを持っていますが、何か共通点があるのでしょうか?

式の評価に基づくアーキテクチャはどのようなものですか? FP アーキテクチャはより構成可能ですか?

更新: Kyle は、 SICPがこのテーマの優れたリソースであることを思い出させてくれました。

更新 2:このテーマに関する良い投稿を見つけました: 関数型プログラミングはコードの構造にどのように影響しますか?

4

7 に答える 7

22

関数型言語を使用するプロジェクトの「アーキテクチャ」の共通点は、従来のシステム アーキテクチャの意味でのサブシステムではなく、代数の層に分割される傾向があることです。

このようなプロジェクトの優れた例については、XMonadYi、およびHappSを確認してください。それらがどのように構造化されているかを調べると、それらがモナド構造の層で構成され、その間にコンビネータの接着剤が入っていることがわかります。

また、システムが依存関係を抽象化するコンポーネントで構成されるアーキテクチャの概要を説明しているThe Scala Experimentペーパーも参照してください。

于 2008-09-18T23:49:52.937 に答える
3

関数型言語で見られる最大の共通点は、関数を使用してデータを格納することです。これは、オブジェクトなしでオブジェクトに対してアクセサー関数を使用することに少し似ています。代わりに、必要なデータにアクセスできる環境で関数が作成されます。現在、この関数はどこにでも渡して使用でき、データを使用する機能も保持されています。

これは非常に簡単な例です。これは状態を変更するため、純粋に機能的ではありませんが、十分に一般的です。

(define (make-counter)
  (let ((count 0))
    (lambda ()
      (set! count (+ count 1))
      count)))

(define x (make-counter))

(x) returns 1

(x) returns 2

...etc...

そのため、カウンターの状態を内部に持つ別の関数を返す関数 make-counter があります。新しく作成されたカウンターを呼び出して、内部の変化を観察できます。

これが関数型プログラムの構造です。関数を引数として受け取る関数、非表示の状態で関数を返す関数などがあります。メモリを自分で管理するよりもはるかにクリーンです。

于 2008-09-18T01:46:50.917 に答える
3

Ocaml のデザイン パターンを印刷して調べたところ、モジュールとファンクター (およびオブジェクト) を使用して、慣れ親しんだ通常のデザイン パターンを再現しています。興味深いのですが、彼らはオブジェクトを使いすぎて、関数型言語の利点を本当に理解していないと思います。FP は非常に構成可能であり、その性質の一部です。私の簡単な答えは、モジュールファンクターを使用することだと思います。

私の現在のプロジェクトはかなり大きく、各モジュールをファイルごとに分けています -- ocaml では暗黙的です。プロジェクトから生まれた本当に成功したデザインについて、別の見方や考えが含まれている可能性のある包括的なリソースも探しています。

于 2008-09-18T13:48:01.713 に答える
2

うまくいけばあまり接線的ではありませんが、この質問への回答を閲覧している人にとっておそらく興味深いのは、Peter Norvig による動的プログラミングのデザイン パターンです。

于 2008-09-24T08:10:33.137 に答える
2

私はいくつかのかなり大規模な機能プロジェクトに取り組んできました。それらは通常 2 つの陣営に分類されます (少なくとも、私が使用した陣営は):

  • 極端なスケーラビリティ/信頼性/同時実行性。トランザクション モデルは、言語に非常に緊密に組み込むことができます。並行 ML はこの好例であり、並行 ML を使用するプロジェクトは、並行性の正確性に関して間違いを犯すことは非常に困難です。
  • フレームワークの解析/変更。これらのフレームワークが基づいている設計パターンの多くは、関数型言語で作成/構築/変更するのが非常に簡単です。訪問者パターンは、この好例です。
于 2008-09-18T01:50:10.847 に答える
1

これが役立つと思います。

一部のパターンは消滅します。つまり、それらは言語機能によって直接サポートされます。一部のパターンはより単純であるか、異なる焦点を持ち、一部は本質的に変更されません。

[AIM-2002-005] Gregory T. Sullivan、実行可能な設計パターンのための高度なプログラミング言語機能「リフレクションによるより良いパターン」

2002 年 3 月 22 日

デザイン パターン ブック [GOF95] は、適切に設計されたソフトウェア システムに一貫して現れる、実績のある 24 のパターンを示しています。各パターンには、パターンが対処する設計上の問題の説明と、サンプルの実装コードおよび設計上の考慮事項が示されています。この論文では、動的で高次のオブジェクト指向プログラミング言語を使用して同様の問題に対処したときに、「Gang of Four」または「GOF」と呼ばれることが多い本のパターンがどのように現れるかを探ります。一部のパターンは消滅します。つまり、それらは言語機能によって直接サポートされます。一部のパターンはより単純であるか、異なる焦点を持ち、一部は本質的に変更されません。

于 2008-09-18T20:15:58.507 に答える