Einige sagen, wenn Sie SOLID-Prinzipien auf die Spitze treiben, landen Sie in der funktionalen Programmierung . Ich bin mit diesem Artikel einverstanden, aber ich denke, dass einige Semantiken beim Übergang von der Schnittstelle / dem Objekt zur Funktion / zum Abschluss verloren gehen, und ich möchte wissen, wie funktionale Programmierung den Verlust mindern kann.
Aus dem Artikel:
Wenn Sie das Prinzip der Schnittstellentrennung (ISP - Interface Segregation Principle) konsequent anwenden, sollten Sie Rollenschnittstellen gegenüber Header-Schnittstellen bevorzugen.
Wenn Sie Ihr Design in Richtung kleinerer und kleinerer Schnittstellen weiterentwickeln, erhalten Sie schließlich die ultimative Rollenschnittstelle: eine Schnittstelle mit einer einzigen Methode. Das passiert mir sehr oft. Hier ist ein Beispiel:
public interface IMessageQuery
{
string Read(int id);
}
Wenn ich eine Abhängigkeit von einem annehme, besteht ein IMessageQuery
Teil des impliziten Vertrages darin, dass ein Anruf Read(id)
nach einer Nachricht mit der angegebenen ID sucht und diese zurückgibt.
Vergleichen Sie dies damit, dass Sie eine Abhängigkeit von der entsprechenden funktionalen Signatur annehmen int -> string
. Ohne zusätzliche Hinweise könnte diese Funktion eine einfache sein ToString()
. Wenn Sie IMessageQuery.Read(int id)
mit einem implementiert haben, ToString()
kann ich Sie beschuldigen, absichtlich subversiv zu sein!
Was können funktionierende Programmierer also tun, um die Semantik einer benannten Schnittstelle beizubehalten? Ist es üblich, beispielsweise einen Datensatztyp mit einem einzelnen Element zu erstellen?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... vielleicht ist die Dokumentation deshalb Bestandteil des Vertrages ?