いくつかのことで言われて、あなたはそれらの極端にSOLID原則を取る場合、あなたは関数型プログラミングで終わります。この記事に同意しますが、インターフェイス/オブジェクトから関数/クロージャへの移行でいくつかのセマンティクスが失われると思うので、関数型プログラミングがどのように損失を軽減できるかを知りたいと思います。
記事から:
さらに、インターフェイス分離の原則(ISP)を厳密に適用すると、ヘッダーインターフェイスよりもロールインターフェイスを優先する必要があることを理解できます。
デザインをどんどん小さなインターフェースに向けていくと、最終的には究極のロールインターフェース、つまり単一のメソッドを持つインターフェースに到達します。これは私によく起こります。以下に例を示します。
public interface IMessageQuery
{
string Read(int id);
}
に依存する場合IMessageQuery
、暗黙の契約の一部は、呼び出しRead(id)
が特定のIDのメッセージを検索して返すことです。
これを、同等の機能シグネチャである依存関係と比較してください int -> string
。追加の手がかりがなければ、この関数は単純なものになりToString()
ます。を実装IMessageQuery.Read(int id)
したToString()
場合、意図的に破壊されたと非難する可能性があります!
それでは、機能的なプログラマは、名前の良いインターフェイスのセマンティクスを保持するために何ができるでしょうか?たとえば、単一のメンバーでレコードタイプを作成することは一般的ですか?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
...多分、ドキュメントが契約の一部である理由でしょうか?