再利用可能なライブラリに関する FP 設計の重要な違いの前提の 1 つとして (私が学んでいることについて)、これらは対応する OO (一般に) よりもデータ中心であるということです。
これは、 TFD (Type-First-Development)などの新しい技術からも確認されているようで、Tomas Petricek がこのブログ投稿で詳しく説明しています。
現在、言語はマルチパラダイムであり、同じ Petricek がその本で C# から使用できるさまざまな関数型テクニックを説明しています。
ここで私が興味を持っているのは、コードを適切に分割する方法です。
そのため、判別共用体 (Petricek book に示されている) に相当するものを使用してライブラリ データ構造を定義し、私の要件のドメイン ロジックに従って、それらを不変リストおよび/またはタプルと共に使用することを計画しています。
データ構造に作用する操作 (メソッド ... 関数) はどこに配置すればよいですか?
標準の delegates で具体化された関数値を使用する高階関数を定義したい場合Func<T1...TResult>
、どこに配置すればよいですか?
常識的には、これらのメソッドを静的クラスにグループ化するように言われていますが、C# で機能ライブラリを既に作成している人々からの確認が必要です。
これが正しく、次のような高次関数があると仮定します。
static class AnimalTopology {
IEnumerable<Animal> ListVertebrated(Func<Skeleton, bool> selector) {
// remainder omitted
}
}
選択した脊椎動物に、ライブラリで公開したい N 個の特定のケースがある場合、それらを公開するより正しい方法はどれですか。
static class VertebratedSelectorsA {
// this is compatible with "Func<Skeleton, bool> selector"
static bool Algorithm1(Skeleton s) {
//...
}
}
また
static class VertebratedSelectorsB {
// this method creates the function for later application
static Func<Skeleton, bool> CreateAlgorithm1Selector(Skeleton s) {
// ...
}
}
どんな指摘も非常に高く評価されます。
編集:
Mads Torgersen による T. Petricek のReal World Functional Programmingの序文から 2 つのフレーズを引用したいと思います。
[...] C# で関数型プログラミング手法を使用すると、大きなメリットが得られますが、F# で行う方が簡単で自然です。[...] 関数型プログラミングは心の状態です。[...]
編集-2:
質問をさらに明確にする必要があると感じています。タイトルで言及されている関数は、関数型プログラミングに厳密に関連しています。私は、より論理的な方法や一般的により理にかなった方法という意味で、メソッドをグループ化するより機能的な方法を求めているわけではありません。
これは、実装がNOOOマニフェストによって要約され、便宜上および明確にするためにここに引用されているFP の基本概念に可能な限り従おうとすることを意味します。
- クラスの関数と型
- 可変性よりも純度
- 継承より合成
- メソッドディスパッチに対する高階関数
- null に対するオプション
問題は、FP の概念に従って記述された C# ライブラリをどのようにレイアウトするかに関するものであるため、(たとえば) データ構造内にメソッドを配置するオプションは絶対にありません。これは、オブジェクト指向パラダイムの創設者だからです。
編集-3:
また、質問に対する回答 (およびさまざまなコメント) が得られたとしても、あるプログラミング パラダイムが別のパラダイムよりも優れていると言われているという誤った印象を与えたくありません。以前のように、FP の権威である Don Syme について、著書 Expert F# 3.0 (ch.20 - Designing F# Libraries - pg.565) で言及します。
[...] 関数型プログラミングとオブジェクト指向プログラミングの方法論が競合するというのはよくある誤解です。実際、それらはほぼ直交しています。[...]