Exagg'itive Summary (TM)
Sie bekommen ein paar Dinge.
- Prototypische Vererbung und Klonen
- Dynamisches Hinzufügen neuer Eigenschaften
- Koexistenz von Objekten verschiedener Versionen (Spezifikationsebenen) derselben Klasse.
- Objekte, die zu den neueren Versionen (Spezifikationsebenen) gehören, haben zusätzliche "optionale" Eigenschaften.
- Introspektion alter und neuer Immobilien
- Introspektion von Validierungsregeln (weiter unten besprochen)
Es gibt einen fatalen Nachteil.
- Der Compiler sucht für Sie nicht nach falsch geschriebenen Zeichenfolgen.
- Automatische Refactoring-Tools benennen Eigenschaftsschlüsselnamen für Sie nicht um - es sei denn, Sie zahlen für die ausgefallenen.
Die Sache ist, Sie können Introspektion erhalten, indem Sie, ähm, Introspektion verwenden. Das ist was normalerweise passiert:
- Aktivieren Sie die Reflektion.
- Fügen Sie Ihrem Projekt eine große Introspection-Bibliothek hinzu.
- Markieren Sie verschiedene Objektmethoden und -eigenschaften mit Attributen oder Anmerkungen.
- Lassen Sie die Introspektionsbibliothek die Magie machen.
Mit anderen Worten, wenn Sie nie eine Schnittstelle zu FP benötigen, müssen Sie Rich Hickeys Rat nicht befolgen.
Last but not least (oder am schönsten), obwohl die Verwendung String
als Eigenschaftsschlüssel am einfachsten ist, müssen Sie nicht String
s verwenden. Viele ältere Systeme, einschließlich Android ™, verwenden im gesamten Framework ausführlich Ganzzahl-IDs, um auf Klassen, Eigenschaften, Ressourcen usw. zu verweisen.
Android ist eine Marke von Google Inc.
Sie können auch beide Welten glücklich machen.
Implementieren Sie für die Java-Welt die Getter und Setter wie gewohnt.
Implementieren Sie für die FP-Welt die
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
Innerhalb dieser Funktion, ja, hässlicher Code, aber es gibt IDE-Plugins, die das für Sie auffüllen, mit ... äh, einem intelligenten Plugin, das Ihren Code liest .
Die Java-Seite der Dinge wird genauso performant sein wie üblich. Sie werden diesen hässlichen Teil des Codes niemals verwenden . Vielleicht möchten Sie es sogar vor Javadoc verstecken.
Die FP-Seite der Welt kann jeden "leet" -Code schreiben, den sie wollen, und sie schreien Sie normalerweise nicht an, dass der Code langsam ist.
Im Allgemeinen ist die Verwendung einer Karte (Eigentumstasche) anstelle eines Objekts in der Softwareentwicklung üblich. Dies gilt nicht nur für die funktionale Programmierung oder bestimmte Arten von Sprachen. Es mag kein idiomatischer Ansatz für eine bestimmte Sprache sein, aber es gibt Situationen, die dies erfordern.
Insbesondere die Serialisierung / Deserialisierung erfordert oft eine ähnliche Technik.
Nur ein paar allgemeine Gedanken zu "Karte als Objekt".
- Sie müssen noch eine Funktion zur Validierung einer solchen "Karte als Objekt" bereitstellen. Der Unterschied besteht darin, dass "Karte als Objekt" flexiblere (weniger restriktive) Validierungskriterien ermöglicht.
- Sie können der "Karte als Objekt" problemlos weitere Felder hinzufügen.
- Um eine Spezifikation der Mindestanforderung eines gültigen Objekts bereitzustellen, müssen Sie:
- Listen Sie die "minimal erforderlichen" Schlüssel auf, die in der Karte erwartet werden
- Geben Sie für jeden Schlüssel, dessen Wert überprüft werden muss, eine Wertüberprüfungsfunktion an
- Wenn es Validierungsregeln gibt, die mehrere Schlüsselwerte prüfen müssen, geben Sie dies ebenfalls an.
- Was ist der vorteil Das Bereitstellen der Spezifikation auf diese Weise ist introspektiv: Sie können ein Programm schreiben, um den minimal erforderlichen Satz von Schlüsseln abzufragen und die Validierungsfunktion für jeden Schlüssel zu erhalten.
- In OOP werden alle diese Elemente im Namen der "Verkapselung" zu einer Blackbox zusammengefasst. Anstelle einer maschinenlesbaren Validierungslogik kann der Aufrufer nur eine von Menschen lesbare "API-Dokumentation" lesen (sofern diese glücklicherweise vorhanden ist).