Sommario exagg'itive (TM)
Ottieni alcune cose.
- Ereditarietà del prototipo e clonazione
- 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 specifiche) avranno proprietà extra "facoltative".
- Introspezione di proprietà, vecchie e nuove
- Introspezione delle regole di convalida (discusse di seguito)
C'è uno svantaggio fatale.
- Il compilatore non controlla le stringhe errate per te.
- Gli strumenti di refactoring automatico non cambieranno il nome delle chiavi di proprietà per te, a meno che non paghiate per quelli fantasiosi.
Il fatto è che puoi ottenere l'introspezione usando, uhm, l'introspezione. Questo è quello che succede di solito:
- Abilita riflessione.
- Aggiungi una grande libreria di introspezione nel tuo progetto.
- Contrassegna vari metodi e proprietà dell'oggetto con attributi o annotazioni.
- Lascia che la libreria di introspezione faccia la magia.
In altre parole, se non hai mai bisogno di interfacciare con FP, non devi prendere il consiglio di Rich Hickey.
Ultimo, ma non il minimo (né il più bello), anche se l'utilizzo di String
come chiave di proprietà rende il senso più diretto, non devi usare String
s. Molte eredità i sistemi, tra cui Android ™, utilizzano estensivamente 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, implementa getter e setter come al solito.
Per il mondo FP, implementa
-
Object getPropertyByName(String name)
-
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
-
List<String> getPropertyNames()
-
Class<?> getPropertyValueClass(String name)
All'interno di questa funzione, 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 come al solito. Non useranno mai quella brutta parte del codice. Potresti persino volerlo nascondere da Javadoc.
Il lato FP del mondo può scrivere qualunque codice "leet" che vogliono, e in genere non ti urla del fatto che il codice sia lento.
In generale, l'utilizzo di una mappa (sacchetto di proprietà) al posto dell'oggetto è comune nello sviluppo del software. Non è univoco per la programmazione funzionale o per particolari tipi di linguaggi. 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 "mappa come oggetto".
- Devi ancora fornire una funzione per convalidare una "mappa come oggetto". La differenza è che "mappa come oggetto" consente criteri di convalida più flessibili (meno restrittivi).
- Puoi facilmente aggiungere campi di addizione alla "mappa come oggetto".
- Per fornire una specifica del requisito minimo di un oggetto valido, dovrai:
- Elenca il set di chiavi "minimamente necessario" 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 questo.
- Qual è il vantaggio? Fornire la specifica in questo modo è introspettivo: è possibile scrivere un programma per interrogare il set di chiavi minimo necessario e ottenere la funzione di convalida per ogni chiave.
- In OOP, tutti questi sono arrotolati 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).