1. Principi di design
Principio Open-Closed
Ogni modulo deve essere aperto alle estensioni, ma chiuso alle modifiche: le classi devono essere sempre espandibili, senza applicare modiche al codice già scritto.
I principi base usati per raggiungere questo obiettivo sono ereditarietà, overriding, polimorfismo e binding dinamico.
Principio di sostituzione di Liskov
Gli oggetti di una sottoclasse devono rispettare le specifiche dei metodi delle superclassi: il comportamento dei metodi delle sottoclassi devono essere compatibili con quelli dei metodi delle superclassi.
Le sottoclassi possono definire nuovi metodi e fare override di metodi ereditati (aggiungendo nuovi casi di comportamento rispetto a quelli già presenti).
Principio di inversione delle dipendenze
Per creare delle relazioni di dipendenza conviene instaurarle tra Interfacce/Classi Astratte e classi concrete, invece che tra classi concrete.
Altri principi
- Principio di segregazione delle interfacce: Avere più interfacce specifiche è meglio di avere una sola interfaccia generale
- Principio delle dipendenze acicliche: la struttura delle dipendenze tra componenti deve essere un grafo orientato aciclico.