Ci sono ancora persone al mondo che non lo fanno usano i generici di jave nel "codice ordinario". Posso crederci con i modelli C ++, ma generici? Non sono nemmeno difficili da imparare / usare. Seriamente le migliori caratteristiche di Java e C ++ sono rispettivamente generici e template.
Il modo migliore per convincere la gente delle cose è di fare un argomento convincente, di non essere minaccioso e di avere ragione.
Finché non stai facendo qualcosa come usare i template come linguaggio di programmazione, il polimorfismo parametrico (generici / template) è quasi certamente buono.
1. Evita la duplicazione del codice.
Questo è ovvio, ma il codice polimorfico è un codice generale. Ecco perché si chiama generici.
2. Supporta un migliore controllo statico.
Senza polimorfismo parametrico finisci per scrivere cose come public Object clone()
o public boolean equals(object b)
che non sono solo abominazioni, hanno tipi che non forniscono informazioni su ciò che fanno e finiscono invariabilmente con l'eccezione. L'alternativa al polimorfismo parametrico è il cast dappertutto
3. Il polimorfismo non parametrico Il codice OOP non è sostanzialmente in grado di gestire i "metodi binari" in modo corretto.
Li usi spesso.
4. È la migliore pratica
In Java, l'uso dei generici è considerato la migliore pratica (vedi Effective Java di Josh Bloch). I maggiori pensatori del C ++ come Sutter e Alexandrescu incoraggiano anche l'uso di modelli per risolvere una varietà di problemi.
5. Si adatta al paradigma OO.
La gente spesso non se ne accorge, ma la combinazione di sotto-tipizzazione e generici produce un sistema MOLTO più potente espressivo e orientato agli oggetti di qualsiasi sistema con solo uno di essi.
Considera i mixin di Scala. Questa è una bella funzionalità che ti consente di riunire i tuoi oggetti dalle parti componenti. I generici e i modelli possono simulare alcuni di questi vantaggi. Ad esempio, supponiamo che uno dei tuoi oggetti utilizzi un database. Un buon design ti farebbe astrarre l'accesso al database in una classe separata. Se fatto bene, questo non solo ti consente di deridere il tuo archivio di dati (chiave per la testabilità), ma significa anche che puoi aggiungere implementazioni alternative come quel nuovo database no-sql. Qui, tuttavia, potresti avere un problema, indipendentemente dall'implementazione che utilizzerai, otterrai diverse funzionalità dell'oggetto aziendale.
Generici in soccorso!
public class Business<S extends Datastore>{
private S store; ...
}
Ora puoi iniziare a differenziare staticamente i tuoi Business
oggetti in base alla capacità di utilizzare funzionalità specifiche del database. Hai ancora bisogno di alcuni controlli di runtime e casting, ma puoi iniziare a costruire codice MOLTO migliore.
e
6. Il codice normale non esiste.
Ci sono solo tre cose nell'universo di programmazione:
- biblioteche,
- configurazioni e
- codice errato.
Se non pensi al tuo codice come se fosse una libreria, sei nei guai seri quando cambiano i requisiti per il tuo progetto. L'architettura è (probabilmente) l'arte di progettare buone API.
Trovo questo atteggiamento sbalorditivo. Dopo esserti abituato alla programmazione con tipi parametrizzati, non usarli rende tutto un problema. E, Java e C ++ hanno un sacco di punti difficili che aiutano a porre rimedio.