Riepilogo esagerato (TM)
Ottieni alcune cose.
- Eredità e clonazione prototipali
- Aggiunta dinamica di nuove proprietà
- Coesistenza di oggetti di versioni diverse (livelli di specifica) della stessa classe.
- Gli oggetti appartenenti alle versioni più recenti (livelli di specifica) avranno proprietà "opzionali" extra.
- Introspezione di proprietà, vecchie e nuove
- Introspezione delle regole di convalida (discusso di seguito)
C'è un inconveniente fatale.
- Il compilatore non controlla le stringhe errate per te.
- Gli strumenti di refactoring automatico non rinomineranno i nomi delle chiavi di proprietà per te, a meno che tu non paghi per quelli fantasiosi.
Il fatto è che puoi ottenere l'introspezione usando, um, l'introspezione. Questo è ciò che accade di solito:
- Abilita la riflessione.
- Aggiungi una grande libreria di introspezione al tuo progetto.
- Contrassegnare vari metodi e proprietà degli oggetti con attributi o annotazioni.
- Lascia che la biblioteca dell'introspezione faccia la magia.
In altre parole, se non hai mai bisogno di interfacciarti con FP, non devi seguire il consiglio di Rich Hickey.
Ultimo, ma non meno importante (né il più grazioso), sebbene l'utilizzo String
come chiave di proprietà abbia il significato più semplice, non è necessario utilizzare String
s. Molti sistemi legacy, incluso Android ™, utilizzano ampiamente gli ID interi attraverso l'intero framework per fare riferimento a classi, proprietà, risorse, ecc.
Android è un marchio di Google Inc.
Puoi anche rendere felici entrambi i mondi.
Per il mondo Java, implementare getter e setter come al solito.
Per il mondo FP, implementare il
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
All'interno di queste funzioni, sì, brutto codice, ma ci sono plugin IDE che lo riempiranno per te, usando ... uh, un plugin intelligente che legge il tuo codice.
Il lato Java delle cose sarà altrettanto performante del solito. Non useranno mai quella brutta parte del codice. Potresti anche volerlo nascondere a Javadoc.
Il mondo FP del mondo può scrivere qualsiasi codice "leet" che vuole, e in genere non ti urlano che il codice sia lento.
In generale, l'utilizzo di una mappa (borsa delle proprietà) al posto dell'oggetto è all'ordine del giorno nello sviluppo del software. Non è unico per la programmazione funzionale o qualsiasi tipo particolare di linguaggio. Potrebbe non essere un approccio idiomatico per una determinata lingua, ma ci sono situazioni che lo richiedono.
In particolare, la serializzazione / deserializzazione richiede spesso una tecnica simile.
Solo alcuni pensieri generali riguardanti "la mappa come oggetto".
- Devi ancora fornire una funzione per convalidare una "mappa come oggetto". La differenza è che la "mappa come oggetto" consente criteri di convalida più flessibili (meno restrittivi).
- È possibile aggiungere facilmente campi di aggiunta alla "mappa come oggetto".
- Per fornire una specifica del requisito minimo di un oggetto valido, dovrai:
- Elencare il set di chiavi "minimamente richiesto" previsto nella mappa
- Per ogni chiave il cui valore deve essere convalidato, fornire una funzione di convalida del valore
- Se esistono regole di convalida che devono controllare più valori chiave, fornire anche quello.
- Qual è il vantaggio? Fornire le specifiche in questo modo è introspettivo: è possibile scrivere un programma per interrogare il set di chiavi minimamente richiesto e ottenere la funzione di validazione per ogni chiave.
- In OOP, tutti questi vengono raggruppati in una scatola nera, nel nome di "incapsulamento". Al posto della logica di convalida leggibile dalla macchina, il chiamante può solo leggere "documentazione API" leggibile dall'uomo (se fortunatamente esiste).