関数型プログラミングのSOLID原則に相当


36

オブジェクト指向設計について考えるとき、SOLIDの原則は非常に有用であることがわかりました。

関数型プログラミング向けに調整された、言語に依存しない原則の類似/同等のセットはありますか?


12
FWIW、これは1年前にSOで簡単に議論されました
StuartLC


このビデオこれらのスライドは、関数型プログラミングに適用されるSOLIDの原則を示しています。どちらもClojure言語を例として使用していますが、原則は他の言語にも当てはまります。
mascip


回答:


14

同等のものを見つけるのは少し難しいですが、私は試すことができます:

  • FPのS(SRP)関数は、常に同じ引数に対して同じ出力を作成します。これは参照透過性と呼ばれます
  • FPのO(OCP)には代数データ型と呼ばれる概念があり、それがクラス階層とどのように関係しているか、両方ともどのような問題が解決しようとしているのかを見てみましょう1
  • L(LSP)Liskov Substitution Principle is Contravariance 2
  • 一般的な関数型プログラミングのD(DIP)は、関数の構成を通じて抽象化を実現します。また、「依存性注入」3のカテゴリ理論(モノイドやファンクターなど)を使用した他のメカニズムもあります。

21
私は単一責任原則から参照透明性にどのようになったのかまだ考えています。これら2つは無関係です。SRPは、単一の目的を持つ機能に関するものです。それに関しては、参照的に透明である場合とそうでない場合があります。
ゴランジョヴィック

3
ああ、私の悪い-私は今それを得る。これらは原則であり、同じ頭字語を形成するという意味では同等であり、同じまたは類似したものを意味するという意味ではありません。downvoteでごめんなさい!
ゴランジョヴィック

1
それはそれを読むための意図された方法です。fpのコンテキストでこれらの用語のマッピングを記述しようとしました。
アンドレアスシャイナート

男私はコメントを編集できないことを嫌う、実際には物事は少なくとも似たようなものを意味するべきである。
アンドレアスシャイナート

高階関数は、ある種の依存性注入を提供する可能性があります。具体的な関数をパラメーターとしてジェネリック(高階)関数に注入します。
ジョルジオ

45

SOLIDは、機能的/命令的な領域でも良いアイデアであることがわかりました。

SRP-そもそも命令型プログラミングから「たった1つのことを行う」だけです。小さく、焦点を絞った機能を持つことは良いことです。

OCP-コードを変更せずに動作を変更できるようにすることは良いことです。関数型プログラミングでは、継承よりも高次の関数を使用しますが、原則は保持されます。

LSP -下回らないよう、いくつかのインターフェース契約によっては、ちょうどオブジェクト指向のような関数型プログラミングでは良いようです。ソート関数がコンパレーターをとる場合、「0は等しい、負の結果を提供するよりも小さい、正の結果よりも大きい」という振る舞いを期待します。

ISP-ほとんどの機能言語にはまだ構造体があります。関数が必要とするデータの最小セットを指定することは、依然として良い習慣です。データへの最も具体性の低いインターフェイスを必要とする(Tの列挙が同様に機能する場合にintのリストを使用する理由)は、依然として良い習慣です。

DIP-関数をハードコーディングして値を取得するのではなく、関数(またはそれらを取得するための高次関数)にパラメーターを指定することは、関数型プログラミングでもオブジェクト指向と同様に優れています。

また、オブジェクト指向プログラミングを行う場合でも、これらの原則の多くはオブジェクトのメソッドの設計にも適用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.