Se si desidera un modo conforme a OCP di gestire un elenco non specificato di eccezioni, è possibile considerare la "catena di responsabilità". Ma non è chiaro dalla tua domanda se il tuo codice è specificato per gestire "un insieme arbitrario di eccezioni, ognuna in un modo diverso, ognuna delle quali sarà specificata in futuro ed è soggetta a modifiche", o se la lista fissa di tre che attualmente gestisce è una parte fondamentale e affidabile del design.
Aggiungere un'altra eccezione all'elenco di cose che il tuo codice deve gestire non sta "estendendo" il codice che hai, lo sta "modificando". Quindi, se sei nel primo caso flessibile, allora hai una violazione OCP nelle tue mani perché dovrai modificare il codice per gestire una modifica anticipata. Se ti trovi nell'ultimo caso, forse perché Foo
, Bar
e Biz
rappresentano le uniche tre classi di base legali per tutte le eccezioni che il tuo codice è autorizzato a gestire in modo diverso dal caso ...
, allora potresti va bene.
A patto che "qualcosa che getta" abbia un'interfaccia ben definita e stabile, non è necessario aggiungere all'elenco delle eccezioni gestite. Quindi il tuo codice non è di per sé una violazione di OCP. Parte di OCP è che non si apportano modifiche retroattive alle interfacce esistenti su cui le persone fanno affidamento su tutto il codice. Lanciare una nuova eccezione è un cambiamento di interfaccia incompatibile con le versioni precedenti, è una modifica.
Se "qualcosa che getta" ha un'interfaccia mal documentata, o una materia soggetta a modifiche in futuro, in modo che possa improvvisamente iniziare a lanciare qualcosa che non ha gettato prima, allora hai una violazione di OCP: "qualcosa" lo viola essendo aperto alle modifiche. Queste violazioni tendono a diffondersi, quindi il tuo codice dovrà anche violarlo.
Se "qualcosa" è ben specificato, ma il tuo codice utilizza informazioni su "qualcosa" che va oltre la sua interfaccia, allora hai un problema con un eccesso di accoppiamento tra i componenti. Non sono sicuro se considerare che anche una violazione OCP, non sono realmente in una posizione in cui la tassonomia delle questioni oltre la prima è importante per me; -)
Si noti che in ogni caso un impegno completo per OCP è uno standard ragionevolmente alto. Potresti scoprire che "Non scriverò il codice in questo modo perché viola il Principio Aperto / Chiuso" semplicemente non è adatto a te o ai tuoi colleghi. Il che non significa necessariamente che tu debba ignorare se stai violando o meno.