Wenn Sie ein Programm im objektorientierten Stil schreiben, legen Sie Wert auf Ausdruck Domänenbereich in Bezug auf die Datentypen. Und auf den ersten Blick sieht das nach einer guten Idee aus - wenn wir mit Benutzern arbeiten, warum nicht eine Klasse User
haben? Und wenn Benutzer Autos verkaufen und kaufen, warum nicht Klasse Car
haben? Auf diese Weise können wir einfach Daten verwalten und den Fluss steuern - es spiegelt nur die Reihenfolge der Ereignisse in der realen Welt wider. Während dies ist sehr bequem für Domain, für viele interne Objekte (das heißt Objekte, die nichts von der realen Welt widerspiegeln, sondern nur in der Programmlogik auftreten) Objekte ist es nicht so gut. Vielleicht das beste Beispiel ist eine Anzahl von Sammlungstypen in Java. In Java (und vielen anderen OOP-Sprachen) gibt es beide Arrays, List
s. In JDBC gibt es ResultSet
, die auch Art der Sammlung ist, aber Collection
Schnittstelle nicht implementiert. Für die Eingabe verwenden Sie oft , die Schnittstelle für den sequentiellen Zugriff auf die Daten bietet - genau wie verknüpfte Liste! Es implementiert jedoch auch keine Art von Sammlungsschnittstelle. Wenn Ihr Code also mit der Datenbank arbeitet und ResultSet
verwendet, ist es schwieriger, ihn für Textdateien und InputStream
umzuformatieren.
MFUFA Prinzip lehrt uns weniger Aufmerksamkeit zu schenken Definition eingeben und mehr zu gemeinsamen Abstraktionen. Aus diesem Grund führt Clojure eine einzige Abstraktion für alle erwähnten Arten ein - die Sequenz. Jedes iterable wird automatisch zur Sequenz gezwungen, Streams sind nur faule Listen und Ergebnismenge kann leicht in einen der vorherigen Typen transformiert werden.
Ein weiteres Beispiel PersistentMap
Schnittstelle für structs und Aufzeichnungen verwendet. Mit solchen allgemeinen Schnittstellen wird es sehr einfach, wieder verwendbare Subroutinen zu erstellen und nicht viel Zeit für das Refactoring aufzuwenden.
Zusammengefasst und Ihre Fragen zu beantworten:
- Ein einfaches Beispiel für ein Problem, das häufig in OOP erscheint: Daten aus vielen verschiedenen Quellen zu lesen (zB DB, Datei, Netzwerk, etc.) und die Verarbeitung in in der gleichen Weise.
- Um ein guten MFUFA Design Versuch machen zu Abstraktionen so häufig wie möglich zu machen und Ad-hoc-Implementierungen zu vermeiden. Z.B. Vermeiden Sie Typen a-la
UserList
- List<User>
ist in den meisten Fällen gut genug.
- Folgen Vorschläge von Punkt 2. Darüber hinaus versuchen, so viel Schnittstellen zu Ihren Datentypen (Klassen), wie es möglich hinzuzufügen. Zum Beispiel müssen, wenn Sie wirklich
UserList
(zum Beispiel, wenn es eine Menge zusätzlicher Funktionalität haben soll) haben, fügen beide List
und Iterable
Schnittstellen zu seiner Definition.
- OOP (zumindest in Java und C#) ist für dieses Prinzip nicht sehr gut geeignet, weil sie versuchen, das ganze Objekt, das Verhalten während der anfänglichen Design zu kapseln, so dass es schwierig wird, mehr Funktionen ergänzen. In den meisten Fällen können Sie die fragliche Klasse erweitern und die benötigten Methoden in ein neues Objekt einfügen, aber 1) wenn jemand anders ihre eigene abgeleitete Klasse implementiert, ist sie nicht kompatibel mit Ihrer; 2) manchmal Klassen sind
final
oder alle Felder private
gemacht, so abgeleiteten Klassen haben keinen Zugang zu ihnen (beispielsweise neue Funktionen Klasse hinzuzufügen String
sollte implementieren zusätzliche Klasse StringUtils
). Dennoch machen die oben beschriebenen Regeln die Verwendung von MFUFA im OOP-Code wesentlich einfacher. Und das beste Beispiel ist Clojure selbst, das anmutig im OO-Stil implementiert ist, aber immer noch dem MFUFA-Prinzip folgt.
UPD. Ich erinnere mich an eine andere Beschreibung des Unterschieds zwischen objektorientierten und funktionalen Stilen, die vielleicht besser alles zusammenfasst, was ich oben gesagt habe: Programm in OO-Stil zu entwerfen ist Denken in Bezug auf Datentypen (Substantive), beim Entwerfen im funktionalen Stil ist Denken Geschäftsbedingungen (Verben). Sie können vergessen, dass einige Substantive ähnlich sind (z. B. Vererbung vergessen), aber Sie sollten immer daran denken, dass viele Verben in der Praxis das Gleiche tun (z. B. gleiche oder ähnliche Schnittstellen haben).
Die [Ausdruck Problem] (http://c2.com/cgi/wiki?ExpressionProblem) scheint zu sein, was Sie wollen. –
ein interessantes Video zum Thema: http://www.infoq.com/presentations/Clojure-The-Art-of-Abstraction – mikera
ich nicht dieses Zitat in dem Artikel –