Il principio open-closed (OCP) afferma che un oggetto deve essere aperto per l'estensione ma chiuso per la modifica. Credo di capirlo e usarlo insieme a SRP per creare classi che facciano solo una cosa. E, provo a creare molti piccoli metodi che rendono possibile estrarre tutti i controlli di comportamento in metodi che possono essere estesi o sovrascritti in alcune sottoclassi. Così, finisco con le classi che hanno molti punti di estensione, sia attraverso: dipendenza da iniezione e composizione, eventi, delega, ecc.
Considera quanto segue una classe semplice ed estensibile:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Ora dì, per esempio, che OvertimeFactor
cambia in 1.5. Dal momento che la suddetta classe è stata progettata per essere estesa, posso facilmente sottoclasse e restituire un% diverso diOvertimeFactor
.
Ma ... nonostante la classe progettata per l'estensione e che aderisce a OCP, modificheremo il singolo metodo in questione, piuttosto che la sottoclasse e la sovrascrittura del metodo in questione e quindi il ricollegamento i miei oggetti nel mio contenitore IoC.
Di conseguenza ho violato parte di ciò che OCP tenta di realizzare. Mi sento come se fossi solo pigro perché quanto sopra è un po 'più facile. Sto fraintendendo l'OCP? Dovrei davvero fare qualcosa di diverso? Sfruttate i vantaggi dell'OCP in modo diverso?
Aggiornamento : in base alle risposte sembra che questo esempio forzato sia scadente per una serie di motivi diversi. L'intento principale dell'esempio era dimostrare che la classe era progettata per essere estesa fornendo metodi che, quando sottoposti a override, alteravano il comportamento dei metodi pubblici senza la necessità di cambiare interno o codice privato. Tuttavia, ho sicuramente frainteso OCP.