2010-06-09 13 views
12

¿No sería más específico y apropiado si solo guardo miembros "protegidos", "internos" y "privados" (campo, método, propiedad, evento) en una clase que se declara como "interna"?¿Es una mala práctica de programación tener miembros "públicos" dentro de una clase "interna"?

He visto esta práctica (tener miembros "públicos" en una clase "interna") en varios códigos, así que solo quería saber si es una mala práctica o si tiene algún beneficio o ventaja.

[Solo preocupado por C#] Gracias por su interés.

Respuesta

8

No necesariamente. Si desea implementar implícitamente una interfaz, los miembros públicos son más que aceptables.

En general, si la clase es interna, los miembros públicos no tienen mucho sentido. No te hará daño, ya que no podrás exponer la clase de una manera fuertemente tipada fuera del módulo en el que está definida, pero si no estás implementando implícitamente una interfaz, no hay mucha ventaja.

+0

+1; realmente me molesta que no podamos tener una implementación de interfaz interna implícita para interfaces internas. –

+0

Puede implementar los miembros de la interfaz como métodos privados. http://ebersys.blogspot.com/2009/04/did-you-know-interface-members-are.html – Justin

+0

@Julien Lebosquain: ¿Qué quiere decir con eso? No tiene mucho sentido tener una implementación que sea interna para una interfaz que sea más visible. Es como decir que una clase puede ser pública e interna al mismo tiempo. – casperOne

2

La especificación internal en la clase restringe el alcance de la declaración public en los miembros, por lo que todos sus miembros públicos son realmente internal. Dicho esto, public es mucho menos tipeo que internal, por lo que mi idioma habitual es declarar la clase como internal y los métodos expuestos como public. Solo marcó un miembro como internal si la clase es public y quiero restringir algunos miembros al mismo ensamblaje.

+2

'mucho menos tipeo' como argumento para elegir entre palabras clave de un idioma; Obviamente, esta respuesta no está patrocinada por Speed ​​Typists Association of America –

1

La única razón funcional de esto que conozco es la implementación implícita de interfaces. Todos los métodos de interfaz deben etiquetarse con public para coincidir con la interfaz. Esto es cierto incluso si el tipo o la interfaz no es pública.

Al margen de esta situación limitada, realmente no me gusta la práctica. Hacer esto hace que sea un poco más difícil grep para el área de superficie pública de su aplicación. En su lugar, debe hacer una búsqueda más avanzada.

Además, me molesta, probablemente de forma un poco irracional, que los miembros se marquen como públicos cuando en realidad no lo son.

+0

Hace que se pregunte por qué el compilador no está optimizado para degradar public to internal, o warn, cuando no se usa un método de interfaz. Ninguna advertencia o información del compilador proporcionada (Fx 3.5) me parece realmente extraña y me hace preguntarme si no hay otra razón por la que se permita que no hayamos alcanzado todavía. –

+0

@jdk, con suerte Eric estará más tarde para comentar por qué, pero mi suposición es que el compilador no advierte porque no es realmente incorrecto. La CLI permite este tipo de incoherencia de accesibilidad, por lo que, a menos que exista una justificación comercial específica para rechazarla, el equipo de C# decidió gastar sus recursos en otra parte. – JaredPar

+0

Necesitamos un botón de invocación de Eric como Batman, pero creo que sería abusado. –

0

Intento imaginar la posibilidad de que el modificador de acceso de clase cambie cuando establezco el modificador de método. Si un método necesita ser interno, incluso si la clase es pública, lo diré. Si no, entonces el método se escribe como público.

2

Eso es lo que hago. No puedo ayudarme a mí mismo, cuando mi cerebro piensa que "este miembro debe ser accesible", mis dedos comienzan a martillear incontrolablemente. No hay tal problema cuando declaro la clase sin embargo.

Una gran ventaja: una refactorización que hace que la clase interna sea pública (o al revés, preferiblemente) requiere cambiar solo una palabra. Y Microsoft también lo hizo, principalmente.

5

Es razonable suponer que estos miembros públicos todavía forman parte de la interfaz pública de la clase, incluso si la clase en sí tiene un alcance interno. Cuando veo internal en un miembro de la clase, esto me dice 'un acceso poco fiable de puerta trasera que expresa acoplamiento cerrado, mientras que public todavía implica responsabilidades de programación defensivas adecuadas en mi mente. Es puramente una distinción conceptual.

+2

+1 En mi humilde opinión, los miembros internos de las clases públicas están medio encapsulados. Los evito a menos que sea absolutamente necesario (que encuentro raro). –

+0

Cuando me encuentro usando miembros internos, generalmente significa que estoy mezclando datos que representan con actuar sobre esos datos de una manera compleja y con estado. Hace poco hice una refactorización importante para eliminar este tipo de procesamiento con estado (oculto como 'interno') que nunca debería haber sido almacenado como parte de las clases que se procesan. –

0

Yo diría que sí, es una mala práctica de programación.

No se trata solo de controlar el acceso. También se trata de hacer que el código sea más modular.

Si un consumidor de los datos de un objeto desea algunos de los datos de ese objeto, llama al método getter. Si, más tarde, los datos que se van a devolver deben ser diferentes, el programador solo necesita cambiar el código en un lugar en lugar de todos los lugares donde se leyeron esos datos (si el miembro era público). Esto es similar a por qué deberíamos escribir funciones/métodos y llamarlos en lugar de simplemente copiar y pegar el código sobre el lugar.

explicar con un ejemplo aquí: http://www.programmingincpp.com/private-versus-public-data-members-in-a-class.html

Cuestiones relacionadas