Estoy tratando de comprender el principio Abierto/Cerrado (en mi caso para PHP, pero eso realmente no debería marcar la diferencia).Principio abierto/cerrado - ¿Cómo llamar a las nuevas versiones?
La manera en que lo entiendo es que una clase es nunca abierto para la modificación. Solo para corregir errores. Si quisiera agregar un nuevo código a la clase, entonces tendría que crear uno nuevo y extender la clase 'vieja'. Esa es la única forma en que puedo agregarle un código nuevo.
De alguna manera puedo ver las ventajas de esto. Porque básicamente creas algún tipo de sistema de control de versiones, donde el código antiguo siempre funciona, pero siempre puedes intentar usar las nuevas clases también.
Pero, ¿cómo funciona esto en la práctica? Es decir, supongamos que tengo la siguiente clase:
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
Así que estoy en algún lugar, probablemente, una instancia de esta clase:
$obj = new MyObject();
Pero entonces decido que es bueno tener otro método de ese objeto. Entonces puedo hacer algo más también. De acuerdo con el OCP, no puedo modificar la clase. Entonces tengo que crear uno nuevo, que se extienda a uno viejo, ¿verdad?
Primer problema. ¿Cómo llamo a la nueva clase? Porque no es realmente un objeto completamente nuevo. Me gusta. un objeto Usuario es un objeto Usuario. No puedo darle un nombre completamente diferente simplemente porque necesita otro método. De todos modos, i crear la nueva clase:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
Ahora bien, esto también significa que tengo que cambiar la línea de código en el que crea una instancia de la clase "MiObjeto" y sustituirla por la clase "MyNewObject", a la derecha ..? Y si eso se hace en más de un lugar, entonces tengo que buscar a través de mi código fuente ... (Piense en un método en una clase de controlador, que casi siempre usa la palabra clave 'nueva' para crear instancias de ciertas clases).
Lo mismo aplica básicamente a la herencia. Tendría que encontrar que cada clase hereda la clase anterior y debo reemplazarla con la nueva clase.
Así que, básicamente, mis preguntas son:
¿Cómo se nombra las nuevas clases que tienen los nuevos métodos? Solo porque agregué algunas funcionalidades nuevas, no significa que pueda darle a la clase un nombre completamente nuevo ...
¿Y si las 'viejas' clases se instancian (o heredan) de múltiples lugares? Entonces tendría que encontrar todos esos lugares ... ¿Dónde está la ganancia?
'$ x = new MyObj_version_3.14159265()'? mmmmm. tarta. –
Tenga en cuenta que hay dos formas de interpretar el [Principio abierto/cerrado] (http://en.wikipedia.org/wiki/Open/closed_principle). Pareces estar pensando principalmente en el más antiguo (Meyers), mientras que ese caso de uso generalmente se maneja por delegación hoy en día. –
Sería más fácil responder a esta pregunta con un ejemplo más realista. Nombrar, etc. sería más obvio, creo. – Fuhrmanator