最初の適度に大きなプロジェクトを関数形式(F#で)に書きましたが、その利点を確認できます。主な課題は、「オニオン」アーキテクチャ、つまり大きくて「スマート」な純粋なコア/薄くて「ダムのない」純粋でないシェルを実現することでした。ほとんどの時間を要しましたが、最大のメリット(テスト容易性、正確性、コードの再利用性など)も得られたので、もっと知りたいです。
私はIO /効果を純粋なロジックから分離するための一般的なアプローチを探し始め、Free Monadsに関する多くの資料を、主にHaskellで見つけました(私はそれを知っています) F#にはHKTもネイティブの無料モナドもありませんが)。
私が読んだことから、私はそれを正しく理解していますか:
たとえば、IO演算(Freeモナドによって抽出されたかどうか)の演算)が分岐/決定に使用され、規律なしに他のロジックとインターリーブされた場合-つまり、関数がフラットに縮小されない場合リストまたは非常に単純な命令のツリー。これは、フリーモナドのインタープリターによってさらに簡略化できます。
ここに根本的なものが欠けていますか?
これが私が参照できる記事の1つです: http://degoes.net/articles/modern-fp
「タマネギを楽しむ」のパラグラフの著者は、「プログラムのさまざまな側面を完全に解明することができます...最後に、プログラム全体に分散することになる知識を統合することができます... "-伝えられるところでは無料のおかげ?
しかし、記事からわかるように、彼は最初にタマネギと簡潔なファイル代数を注意深く設計し、その後、前述の利点(インタプリタでの名前変更などのいくつかの複合操作を最適化するためのさまざまな側面が複雑化/ナレッジ統合/機会)を得ました。これがすでに達成されたとき、私はまだDIコンテナーを言うよりもFreeが「はるかに優れたソリューション」(「要約」からの引用)であることを確認するのに苦労しています。
ほとんどのフリーモナドがタマネギのアーキテクチャに関連しているのは、タマネギの外側の層を簡単に交換する方法です。実際には、通常、単体テスト用の純粋なインタープリター実装と、通常のランタイム用の不純な実装を入れ替えます。ただし、別のデータベースやロギング方法などのスワップアウトにも使用されることがあります。
OOPスタイルの依存性注入に対する主な利点は、無料のモナドを使用すると、解釈時に世界のエッジで一度だけ依存性を注入することです。 OOPスタイルでは、コードのプログラム仕様部分の至る所でその依存関係を渡す必要があります。無料のモナドを使用すると、ユニットテストを有効にするために下位層に依存関係を渡す以外に何もしない追加の関数引数がないため、コードがより簡潔に読み取られます。
コードが「規律に欠けている」としても、その利点は消えません。ただし、規律は、どのパラダイムのコードにも明らかにメリットがあります。