OOP言語から来て、私はオブジェクト指向設計のSOLID原則に精通しています。これらのいくつかは関数型プログラミングモデルに適合するように見えますが、他の部分は状態のない世界では意味がありません。関数型コードをリファクタリングするための同様の一連の原則はありますか?
4 に答える
私の知る限り(私は専門家ではありません)、SOLIDの原則は状態について何も伝えていません。それらは関数型プログラミング言語にも適用できるはずです。モジュール性を実現する方法についてのアドバイスです。
それらのいくつかはかなり明白であるか、少なくともよく知られています。単一責任はUNIXの原則であり、「1つのことを実行し、それをうまく実行する」ことです。これは、同様に「構成」が広く使用されている関数型言語でさらに一般的です。インターフェイス分離の原則も非常に自然です(インターフェイスをモジュール化して、直交する概念を分離してください)。最後に、依存性逆転は「抽象化」の単なる名前であり、関数型プログラミングに遍在しています。
「OL」の原則であるOpen/ClosedとLSPは、コアソフトウェアエンジニアリングの概念としての継承に基づく言語をより重視しています。関数型言語の値/モジュールにはデフォルトでオープン再帰がないため、「実装継承」は非常に特殊な場合にのみ使用されます。組成が好ましい。その設定でオープン/クローズの原則をどのように解釈すべきかわかりません。抽象型などを使って、関数型プログラムもよく使うカプセル化について考えてみてください。
最後に、リスコフの置換原則は継承に関するもののように思われるかもしれません。関数型言語は常にサブタイピングを使用するわけではありませんが、サブタイピングを使用する場合、「派生型」は「基本型」の仕様を保持する必要があると実際に想定されています。関数型プログラマーはもちろん、プログラムやモジュールなどのインターフェースとプロパティを指定して尊重するように注意し、プログラミング、リファクタリング、ただし、「デフォルトで継承」のアイデアを取り除くと、インターフェイス違反の問題がはるかに少なくなるため、LSPはOOPの場合のように重要な保護手段として強調されません。
このビデオでは、SOLIDの原則と、それらをClojureに適用する方法について説明します。
同じ根本的な問題を解決する必要があるため、これらの原則がOOPと同様に機能の世界でどのように保持されるかを示しています。そして全体として、関数型プログラミングはSOLID設計に適していると思いました。
実際、SOLIDは、関数型プログラミングのより良い原則を持つことをお勧めします。
SRP:
Only do one thing
そもそも命令型プログラミングから取られました。小さく、焦点を絞った機能を持つことは良いことです。OCP:コードを変更せずに動作を変更できるようにするのは良いことです。関数型プログラミングは、継承よりも高階関数を使用しますが、原則は成り立ちます。
LSP:いくつかのインターフェース契約に従うことは、関数型プログラミングでもオブジェクト指向と同じくらい優れています。ソート関数がコンパレーターを使用する場合、「0は等しい、負の結果を提供するよりも少ない、正の結果よりも大きい」動作を期待します。
ISP:ほとんどの関数型言語にはまだ構造体があります。関数に必要な最小のデータセットを指定することは、依然として良い習慣です。データへの最も具体的でないインターフェースを要求すること(Tの列挙が同様に機能するのになぜintのリストを使用するのか?)は依然として良い習慣です。
DIP:関数をハードコーディングして値を取得するのではなく、関数(またはそれらを取得するための高階関数)にパラメーターを指定することは、関数型プログラミングでもオブジェクト指向の場合と同じように優れています。
また、オブジェクト指向プログラミングを行う場合でも、これらの原則の多くはオブジェクトのメソッドの設計にも当てはまります。
「ロンドンJCP委員会のメンバーであるリチャードワーバートンは、彼のプレゼンテーションで、2000年代初頭にロバートC.マーチンによって特定された、確立されたオブジェクト指向プログラミング設計原則の一例としてSOLID原則を説明し、5つのそれぞれを考察します。リチャーズの経験では、多くの開発者は機能設計で既存の設計スキルを使用する方法を知らないものの、機能プログラミングはSOLIDの原則とまた、機能的な考え方は、オブジェクト指向の1つの重要な側面であるカプセル化を実現するのに実際に役立つ可能性があることにも注意してください。」
さらに詳しい情報:
オブジェクト指向設計の原則と関数型プログラミング-https://www.infoq.com/news/2014/03/oo-functional-programming/
関数型プログラミングのSOLID原則に相当-https ://softwareengineering.stackexchange.com/questions/165356/equivalent-of-solid-principles-for-functional-programming