Pregunta

Tengo una clase con muchos miembros de tipo integrados con acceso de lectura/escritura.¿Debo convertirlos en miembros públicos y proporcionar métodos get/set para cada uno?¿Qué tal las estructuras?

¿Fue útil?

Solución

Si hay que hay que preservar, entonces sí. De lo contrario, no se moleste.

Otros consejos

Toda la razón para tener descriptores de acceso (getter) y modificadores (setters) es proporcionar a sí mismo con un nivel extra de indirección.

Este nivel extra de indirección le permite proporcionar un único punto de vista de su lectura variable a una interfaz pública, mientras que no permite el miembro de datos que desea cambiar. Aún se podía utilizar un regulador privada o protegida.

Setter le permiten hacer especial de error de verificación, validación y correcciones cuando se establece un valor. Por ejemplo SetDirectory (const std :: string & strPath), usted podría asegurarse de que hay una barra de terminación si el usuario no ha especificado una. Esto asegura que su estado de clase siempre será válida.

Compuestos absorbentes también pueden proteger a sus miembros de tener los expuso a los punteros permiten a ellos. Al no permitir que los punteros a ellos desde el exterior, se puede asegurar que si el objeto sale del ámbito que no dará lugar a un accidente.

El nivel extra de indirección para getters / setters también permitirá ser capaz de cambiar el miembro de datos que encapsulan.

Con un captador también se puede obtener diferentes vistas de los datos, por ejemplo:. GetMinutes, cuando el miembro de datos se almacena en el segundo

Esta no es la razón para usarlos, pero un bonito efecto secundario del uso de captadores y definidores es que se puede establecer un punto de interrupción dentro de su modificador, por ejemplo, para ver exactamente cuando se cambia.

Si se deben usar o no es una cuestión de criterio en función de su necesidad. Si usted tiene tantos miembros que es un dolor enorme para proporcionar captadores y ajustes que podría considerar el almacenamiento de los miembros de datos en una estructura y utilizar esa estructura dentro de su clase en lugar. Incluso se puede proporcionar getters / setters para un objeto para toda la estructura a la vez.

En primer lugar, si su clase tiene una gran cantidad de datos mamebers probablemente no es bien diseñado. Es posible que deba considerar dividir en múltiples clases o almacenar los datos en estructuras tales como mapas.

En cuanto a proporcionar métodos de acceso, la pregunta es ¿Alguna vez desee modificar el acceso, posiblemente prevenirla. Si la respuesta es sí, entonces usted necesita funciones de acceso. Por otro lado, si la clase es en realidad una bolsa de bits, sin comportamiento, a continuación, hacer que sea una estructura.

Debes utilizar datos públicos solo para miembros

  • en estructuras que no se exponen al código del cliente (p. ej.functores de estilo vinculante): es inútil proteger estructuras que nadie externo podrá obtener.
  • si sus tipos encapsulan la lógica de establecerlos/obtenerlos (por ejemplo.si creas una clase ObservableAttribute)
  • si son miembros constantes en una estructura inmutable (no puedes hacer mucho excepto leerlos si son inmutables)

Si crea un miembro de datos públicos, debe asegurarse de que su valor sea completamente ortogonal con otros miembros de la clase.Por ejemplo, desactivas las posibilidades futuras de

  • observar cambios en el miembro
  • hacer que el miembro desempeñe cualquier papel en el invariante de la clase
  • deshabilitar el acceso al miembro
  • cambiar la implementación del miembro (por ej.calculado vs.almacenado en caché vs.almacenado) si el rendimiento lo necesita

El uso de métodos get / set para los miembros de datos privados / protegido es un mal diseño.

Hace que el código de cliente a depender de los detalles de implementación de su clase.

Los cambios en su clase provoca cambios en el código del cliente.

Sin embargo GET / métodos set para miembros del público pueden ser utilizados. Pero siempre es bueno para evitarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top