Sto cercando di comprendere il principio Open/Closed (nel mio caso per PHP, ma questo non fa davvero la differenza).Principio aperto/chiuso - Come chiamare le nuove versioni?
Il modo in cui ho capito è che una classe è mai aperta per la modifica. Solo per correggere bug. Se volevo aggiungere un nuovo codice alla classe, dovrei crearne uno nuovo ed estendere la "vecchia" classe. Questo è l'unico modo in cui posso aggiungere un nuovo codice.
In un modo posso vedere i vantaggi di questo. Perché in pratica crei una sorta di sistema di controllo delle versioni, in cui il vecchio codice funziona sempre, ma puoi sempre provare a utilizzare anche le nuove classi.
Ma come funziona in pratica? Voglio dire, supponiamo di avere la seguente classe:
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
Così da qualche parte sto probabilmente istanziare questa classe:
$obj = new MyObject();
Ma poi decido che è bene avere un altro metodo di quell'oggetto. Quindi posso fare anche qualcos'altro. Secondo l'OCP non posso modificare la classe. Quindi devo crearne uno nuovo, che si estende al vecchio giusto?
Primo problema. Come chiamo la nuova classe? Perché non è davvero un nuovo oggetto completo. Piace. un oggetto Utente è un oggetto Utente. Non posso improvvisamente dargli un nome completamente diverso solo perché ha bisogno di un altro metodo. In ogni caso, creo la nuova classe:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
Ora, questo significa anche che devo modificare la riga di codice in cui i istanziato la classe "MyObject" e sostituirlo con la classe "MyNewObject", giusto ..? E se ciò avviene in più di un posto, allora devo cercare attraverso il mio codice sorgente ... (Pensa a un metodo in una classe controller, che usa quasi sempre la parola chiave 'new' per istanziare certe classi).
Lo stesso vale per l'ereditarietà. Dovrei trovare ogni classe che eredita la vecchia classe e sostituirla con la nuova classe.
Quindi, in pratica le mie domande sono:
Come si fa il nome delle nuove classi che hanno i nuovi metodi? Solo perché ho aggiunto alcune nuove funzionalità, non significa che posso dare alla classe un nome completamente nuovo ...
E se le classi "vecchie" sono istanziate (o ereditate) da più posti. Allora dovrei trovare tutti quei posti ... Dov'è il guadagno?
'$ x = new MyObj_version_3.14159265()'? mmmmm. torta. –
Nota che ci sono due modi per interpretare il [principio aperto/chiuso] (http://en.wikipedia.org/wiki/Open/closed_principle). Sembra che tu stia pensando principalmente a quello più vecchio (Meyers), mentre quel caso d'uso è solitamente gestito dalla delega al giorno d'oggi. –
Sarebbe più semplice rispondere a questa domanda con un esempio più realistico. Nominare, ecc. Sarebbe più ovvio, penso. – Fuhrmanator