Wikipedia dice
"las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas para la extensión, pero cerradas para la modificación"
La palabra funciones me llamó la atención, y ahora me pregunto si podemos suponer que crear una sobrecarga para un método puede considerarse como un ejemplo del principio Abierto / cerrado o no.
Déjame explicarte un ejemplo. Considere que tiene un método en su capa de servicio, que se utiliza en casi 1000 lugares. El método obtiene userId y determina si el usuario es administrador o no:
bool IsAdmin(userId)
Ahora considere que en algún lugar es necesario determinar si el usuario es administrador o no, según el nombre de usuario, no userId. Si cambiamos la firma del método mencionado anteriormente, entonces hemos roto el código en 1000 lugares (las funciones deben cerrarse para su modificación). Por lo tanto, podemos crear una sobrecarga para obtener el nombre de usuario, encontrar el ID de usuario basado en el nombre de usuario y el método original:
public bool IsAdmin(string username)
{
int userId = UserManager.GetUser(username).Id;
return IsAdmin(userId);
}
De esta manera, hemos ampliado nuestra función mediante la creación de una sobrecarga (las funciones deben estar abiertas a la extensión).
¿Es un ejemplo de principio abierto / cerrado?
fuente
Al sobrecargar su método, está ampliando la funcionalidad del módulo existente, satisfaciendo así las nuevas necesidades de su aplicación
No está realizando ningún cambio en un método existente, por lo que no está violando la segunda regla.
Me interesaría saber lo que otros tienen que decir sobre no permitir cambiar el método original. Sí, puede colocar modificadores de acceso apropiados y aplicar la encapsulación, pero ¿qué más se puede hacer?
Ref: http://www.objectmentor.com/resources/articles/ocp.pdf
fuente
El Principio Abierto-Cerrado es una meta, un caso ideal, no siempre una realidad. Particularmente cuando se busca refactorizar el código antiguo, el primer paso suele ser una gran modificación para hacer posible la OCP. La raíz del principio es que el código de trabajo ya funciona, y el cambio posiblemente introduce errores. Por lo tanto, el mejor escenario es no cambiar el código existente, solo agregar un código nuevo.
Pero digamos que tenía una función llamada
BigContrivedMethod(int1, int2, string1)
.BigContrivedMethod
hace tres cosas: cosa1, cosa2 y cosa3. En este punto, reutilizar BCM es probablemente difícil, porque hace demasiado. Refactorizándolo (si es posible) enContrivedFunction1(int)
,ContrivedFunction2(int)
yContrivedFunction3(string)
le brinda tres métodos más pequeños y más enfocados que puede combinar más fácilmente.Y esa es la clave de OCP en lo que respecta a métodos / funciones: composición. Usted "extiende" las funciones al llamarlas desde otras funciones.
Recuerde que OCP es parte de otros 5 principios, las pautas SÓLIDAS. El primero es clave, la responsabilidad única. Si todo en su base de código solo hiciera lo único que tenía que hacer, nunca necesitaría modificar el código. Solo necesitaría agregar un código nuevo o combinar el código viejo de formas nuevas. Dado que el código real rara vez cumple con esa directriz, a menudo tiene que modificarlo para obtener SRP antes de poder obtener OCP.
fuente
Está siguiendo el principio abierto-cerrado si está alterando el comportamiento de su programa escribiendo un código nuevo en lugar de alterar el código antiguo.
Dado que es bastante imposible escribir código que esté abierto a todos los cambios posibles (y no desea hacerlo porque ingresa la parálisis de análisis), escribe un código que responde a todos los diferentes comportamientos en los que está trabajando actualmente por extensión en lugar de modificación.
Cuando te encuentras con algo que necesitas cambiar, en lugar de simplemente alterar algo para permitir el nuevo comportamiento, descubres cuál es el punto de cambio, reestructura tu programa sin alterar su comportamiento para que luego puedas cambiar ese comportamiento escribiendo NUEVO código .
Entonces, cómo se aplica esto a su caso:
Si está agregando nuevas funciones a su clase, entonces su clase no está abierta / cerrada, pero los clientes de la función que está sobrecargando sí lo están.
Si simplemente está agregando nuevas funciones que funcionan en su clase, tanto ella como los clientes de su función están abiertos / cerrados.
fuente