Il principio open-closed (OCP) afferma che un oggetto dovrebbe essere aperto per l'estensione ma chiuso per modifica. Credo di capirlo e di usarlo insieme a SRP per creare classi che fanno solo una cosa. E, provo a creare molti piccoli metodi che rendono possibile estrarre tutti i controlli comportamentali in metodi che possono essere estesi o sovrascritti in alcune sottoclassi. Quindi, finisco con le classi che hanno molti punti di estensione, sia attraverso: iniezione di dipendenza e composizione, eventi, delega, ecc.
Considera quanto segue una classe semplice ed estensibile:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Ora diciamo, ad esempio, che le OvertimeFactor
modifiche a 1.5. Poiché la classe sopra è stata progettata per essere estesa, posso facilmente sottoclassare e restituire una diversa OvertimeFactor
.
Ma ... nonostante la classe sia progettata per l'estensione e aderisca a OCP, modificherò il singolo metodo in questione, piuttosto che sottoclassare e sovrascrivere il metodo in questione e quindi ricollegare i miei oggetti nel mio contenitore IoC.
Di conseguenza, ho violato parte di ciò che OCP tenta di realizzare. Mi sembra di essere solo pigro perché quanto sopra è un po 'più facile. Sto fraintendendo OCP? Dovrei davvero fare qualcosa di diverso? Sfruttate i vantaggi dell'OCP in modo diverso?
Aggiornamento : in base alle risposte sembra che questo esempio inventato sia scarso per una serie di ragioni diverse. L'intento principale dell'esempio era dimostrare che la classe era progettata per essere estesa fornendo metodi che, se sottoposti a override, avrebbero modificato il comportamento dei metodi pubblici senza la necessità di modificare il codice interno o privato. Tuttavia, ho sicuramente frainteso l'OCP.