No se puede escribir un buen código sin captadores.
La razón por la cual no es porque los captadores no rompen la encapsulación, lo hacen. No es porque los captadores no tienten a las personas a no molestarse en seguir OOP, lo que les haría poner métodos con los datos sobre los que actúan. Ellas hacen. No, necesitas captadores debido a los límites.
Las ideas de encapsulación y métodos de mantenimiento junto con los datos sobre los que actúan simplemente no funcionan cuando te topas con un límite que te impide mover un método y te obliga a mover datos.
Es realmente así de simple. Si usa getters cuando no hay límite, terminará sin objetos reales. Todo comienza a tender a lo procesal. Que funciona tan bien como siempre.
La verdadera OOP no es algo que pueda difundir en todas partes. Solo funciona dentro de esos límites.
Esos límites no son muy delgados. Tienen código en ellos. Ese código no puede ser OOP. No puede ser funcional tampoco. No, este código tiene nuestros ideales despojados de él para que pueda lidiar con la dura realidad.
Michael Fetters llamó a este código fascia después de ese tejido conectivo blanco que mantiene juntas secciones de una naranja.
Esta es una forma maravillosa de pensarlo. Explica por qué está bien tener ambos tipos de código en la misma base de código. Sin esta perspectiva, muchos programadores nuevos se aferran a sus ideales con fuerza, luego se les rompe el corazón y abandonan estos ideales cuando alcanzan su primer límite.
Los ideales solo funcionan en su lugar apropiado. No renuncies a ellos solo porque no funcionan en todas partes. Úsalos donde trabajan. Ese lugar es la parte jugosa que protege la fascia.
Un ejemplo simple de un límite es una colección. Esto contiene algo y no tiene idea de qué es. ¿Cómo podría un diseñador de colección posiblemente mover la funcionalidad de comportamiento del objeto retenido a la colección cuando no tiene idea de lo que va a retener? No puedes Estás contra un límite. Por eso las colecciones tienen captadores.
Ahora, si lo supiera, podría mover ese comportamiento y evitar el estado de movimiento. Cuando lo sepas, deberías. Simplemente no siempre lo sabes.
Algunas personas simplemente llaman a esto ser pragmático. Y es. Pero es bueno saber por qué tenemos que ser pragmáticos.
Usted ha expresado que no quiere escuchar argumentos semánticos y parece estar abogando por poner "captadores sensibles" en todas partes. Estás pidiendo que se desafíe esta idea. Creo que puedo mostrar que la idea tiene problemas con la forma en que la ha enmarcado. Pero también creo que sé de dónde vienes porque he estado allí.
Si quieres captadores en todas partes, mira Python. No hay una palabra clave privada. Sin embargo, Python funciona bien. ¿Cómo? Usan un truco semántico. Nombran todo lo que debe ser privado con un guión bajo destacado. Incluso puede leerlo siempre que asuma la responsabilidad de hacerlo. "Todos somos adultos aquí", dicen a menudo.
Entonces, ¿cuál es la diferencia entre eso y simplemente poner getters en todo en Java o C #? Lo siento pero es semántica. La convención de subrayado de Pythons le indica claramente que está hurgando detrás de la puerta de los empleados. Golpea a los captadores en todo y pierdes esa señal. Con la reflexión, de todos modos, podría haberse despojado de lo privado y aún no haber perdido la señal semántica. Simplemente no hay un argumento estructural que hacer aquí.
Entonces, lo que nos queda es el trabajo de decidir dónde colgar el letrero de "solo empleados". ¿Qué se debe considerar privado? Lo llaman "captadores sensibles". Como he dicho, la mejor justificación para un captador es un límite que nos aleja de nuestros ideales. Eso no debería resultar en captadores de todo. Cuando da como resultado un captador, debe considerar mover el comportamiento aún más hacia la parte jugosa donde puede protegerlo.
Esta separación ha dado lugar a unos pocos términos. Un objeto de transferencia de datos o DTO no tiene comportamiento. Los únicos métodos son getters y algunas veces setters, a veces un constructor. Este nombre es desafortunado porque no es un objeto verdadero en absoluto. Los captadores y establecedores son realmente solo códigos de depuración que le dan un lugar para establecer un punto de interrupción. Si no fuera por esa necesidad, solo serían un montón de campos públicos. En C ++ solíamos llamarlos structs. La única diferencia que tenían de una clase de C ++ era que estaban predeterminados en público.
Los DTO son buenos porque puedes arrojarlos sobre un muro de límites y mantener tus otros métodos de forma segura en un objeto de comportamiento agradable y jugoso. Un verdadero objeto. Sin getters para violar es encapsulación. Mis objetos de comportamiento pueden comer DTO al usarlos como objetos de parámetro . A veces tengo que hacer una copia defensiva para evitar un estado mutable compartido . No esparzo DTOs mutables dentro de la parte jugosa dentro del límite. Los encapsulo. Los escondo Y cuando finalmente me encuentro con un nuevo límite, giro un nuevo DTO y lo tiro sobre la pared, lo que lo convierte en un problema para otra persona.
Pero desea proporcionar captadores que expresen su identidad. Bueno, felicidades, has encontrado un límite. Las entidades tienen una identidad que va más allá de su referencia. Es decir, más allá de su dirección de memoria. Por lo tanto, debe almacenarse en algún lugar. Y algo tiene que ser capaz de referirse a esto por su identidad. Un captador que expresa identidad es perfectamente razonable. Una pila de código que usa ese captador para tomar decisiones que la Entidad podría haber tomado no lo es.
Al final, no es la existencia de captadores lo que está mal. Son mucho mejores que los campos públicos. Lo malo es cuando se usan para fingir que estás orientado a objetos cuando no lo estás. Los captadores son buenos. Ser orientado a objetos es bueno. Los captadores no están orientados a objetos. Use getters para forjar un lugar seguro para orientarse a objetos.