c# - method - ¿Puede tener demasiados métodos "protegidos virtuales"?
sealed c# (6)
Elegir protected
sobre private
es una decisión de diseño deliberada. Usted está afirmando que su clase apoya explícitamente el uso de esa función, con todos los gastos generales (esfuerzo de diseño e implementación) que viene con eso. Solo usaría protected
en aquellas situaciones en las que sé que es necesario, en gran parte porque lo hago yo mismo. (También encontrará comentarios de los desarrolladores de BCL en la misma línea que lo que dije).
La diferencia de rendimiento virtual
/ no virtual
es irrelevante en cualquier máquina que sea lo suficientemente potente como para ejecutar .NET Framework.
Aquí hay una pregunta para aquellos de ustedes con experiencia en proyectos más grandes y diseño API / framework.
Estoy trabajando en un marco que será utilizado por muchos otros proyectos en el futuro, por lo que quiero hacerlo agradable y extensible, pero al mismo tiempo debe ser simple y fácil de entender.
Sé que mucha gente se queja de que el .NET Framework contiene demasiadas clases selladas y miembros privados. ¿Debo evitar esta crítica y abrir todas mis clases con muchos miembros virtuales protegidos?
¿Es una buena idea hacer que tantos de mis métodos y propiedades estén protegidos de forma virtual como sea posible? ¿En qué situaciones evitarías la protección virtual y harías que los miembros sean privados?
Mi punto de vista es:
- Si puede
events
usuario, es preferible aprotected
métodosprotected
. - Intenta evitar
protected
métodosprotected
como sea posible, si no es posible, entonces tienes que usarlo ;-).
No, no puedes tener "demasiados". Sin embargo, la idea de que deberíamos hacer cada cosa protegida en lugar de privada o evitar "sellados" a toda costa es simplemente una tontería. Mantendría privados los "métodos de ayuda" y las estructuras internas de datos.
Tu clase incluye miembros de datos; los métodos que realizan operaciones internas básicas en aquellos miembros de datos donde la funcionalidad nunca debería cambiar siempre deben ser privados. Por lo tanto, los métodos que realizan operaciones básicas con sus miembros de datos, como la inicialización y la asignación, deben ser privados. De lo contrario, corre el riesgo de que las clases derivadas de "segundo orden" obtengan un conjunto incompleto de comportamientos habilitados; los primeros miembros derivados podrían potencialmente redefinir el comportamiento de la clase.
Dicho todo esto, creo que debes tener mucho cuidado al definir los métodos como "protegidos virtuales". Me gustaría tener mucho cuidado al definir los métodos como "virtuales protegidos", ya que al hacerlo no solo se declara la posibilidad de anular la funcionalidad, sino que de alguna manera se define una expectativa de funcionalidad anulada. Eso me suena a un conjunto de comportamientos subdefinidos para anular; Prefiero tener un conjunto de comportamientos bien definidos para anular. Si desea tener un gran conjunto de comportamientos sobresaturables, preferiría buscar en la Programación Orientada a Aspectos, que permite ese tipo de cosas de una manera muy estructurada.
Cuando marca un método con la palabra virtual, está permitiendo que los usuarios cambien la forma en que se ejecuta la pieza lógica. Para muchos propósitos, eso es exactamente lo que quieres. Creo que ya lo sabes.
Sin embargo, los tipos deben diseñarse para este tipo de extensión. Debe elegir activamente los métodos, donde tiene sentido dejar que el usuario cambie el comportamiento. Si solo aplica virtual en todas partes, corre el riesgo de arruinar la integridad del tipo, realmente no ayuda al usuario a entender el tipo, y puede presentar una serie de errores, incluidos los relacionados con la seguridad.
Prefiero el enfoque conservador. Marcó todas mis clases con sealed
menos que específicamente quiera habilitar la herencia y en esos (pocos) casos solo hago que los métodos necesarios sean virtuales.
Es fácil eliminar la etiqueta sealed
si la clase necesita cambiar para permitir la herencia en el futuro. Sin embargo, si desea cambiar una clase, que ya se está utilizando como clase base para otro tipo, corre el riesgo de romper la subclase cuando cambie la clase base.
¿Es una buena idea hacer que tantos de mis métodos y propiedades
protected virtual
como sea posible?
No es tan buena idea.
Los métodos virtuales protegidos proporcionan puntos de extensibilidad en el marco al agregar acoplamiento.
Existen técnicas más prometedoras para proporcionar extensibilidad: Composición y Delegación .