web-dev-qa-db-ja.com

SOLIDと同等の関数型プログラミングの原則

SOLIDの原則 は、オブジェクト指向の設計について考えるときに非常に役立ちます。

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

39
mikera

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

  • [〜#〜] s [〜#〜](SRP)in FP関数は常に同じ出力を作成します同じ議論に対して、これは参照透過性と呼ばれます
  • [〜#〜] o [〜#〜](OCP)in FP代数的データと呼ばれる概念があります型、それがクラス階層とどのように関係しているか、そして両方が解決しようとしている問題を見てください 1
  • [〜#〜] l [〜#〜](LSP)リスコフ置換原理は反変です 2
  • [〜#〜] d [〜#〜](DIP)一般的な関数型プログラミングでは、関数の構成を通じて抽象化を実現しますが、他にもヘルプのメカニズムがありますカテゴリ理論(モノイドやファンクタなど)の「依存性注入」 
15

SOLIDは、機能的/命令的レルムにとっても良いアイデアであることがわかりました。

[〜#〜] srp [〜#〜]-「1つのことだけを行う」は、そもそも命令型プログラミングから取られたものです。小さく焦点を絞った機能があると良いでしょう。

[〜#〜] ocp [〜#〜]-コードを変更せずに動作を変更できるようにすることは良いことです。関数型プログラミングでは、継承よりも高次関数を使用しますが、原則は同じです。

[〜#〜] lsp [〜#〜]-関数指向プログラミングでは、オブジェクト指向の場合と同じように、いくつかのインターフェイスコントラクトを順守することが適切です。並べ替え関数がコンパレータを使用する場合、「0は等しい、負の結果よりも小さい、正の結果よりも大きい」という動作が期待されます。

[〜#〜] isp [〜#〜]-ほとんどの関数型言語にはまだ構造体があります。関数が必要とするデータの最小セットを指定することは、依然として良い習慣です。データへの最も固有性の低いインターフェイスを要求すること(Tの列挙が同様に機能するのに、なぜListのintを使用するのか)は、依然として良い習慣です。

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

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

47
Telastyn