"encapsular sus campos", así que aprendieron a crear la clase darle algunos campos, crear captadores, organismos
gente Python no hacen esto. Sin embargo, todavía están haciendo programación OO. Claramente, los getters y setters quisquillosos no son esenciales.
Son comunes, debido a las limitaciones en C++ y Java. Pero ellos no parecen ser esenciales.
Python personas usan properties
a veces para crear un getter y setter funciones que parecen un atributo simple.
El punto es que "Encapsulación" es una estrategia Diseño. Tiene poco o nada que ver con la implementación. Puede tener todos los atributos públicos, y aún así un diseño muy bien encapsulado.
También tenga en cuenta que muchas personas se preocupan por "otra persona" que "viola" el diseño al acceder directamente a los atributos. Supongo que esto podría suceder, pero luego la clase dejará de funcionar correctamente.
En C++ (y Java) donde no puede ver la fuente, puede ser difícil de entender la interfaz, por lo que necesita muchas sugerencias. métodos privados, captadores y definidores explícitos, etc.
En Python, donde se puede ver toda la fuente, es trivial comprender la interfaz. No necesitamos proporcionar tantos consejos. Como decimos "Use the source, Luke" y "We're all adults here". Todos somos capaces de ver la fuente, no necesitamos ser quisquillosos con la acumulación de getters y setters para proporcionar más pistas sobre cómo funciona la API.
Por ejemplo, mostrar/representar el objeto que es clase de "datos" - digamos Persona, que tiene nombre y fecha de nacimiento. ¿Debería la clase tener un método para mostrar el objeto donde algún Renderer se pasaría como argumento?
Buena idea.
¿No violaría eso que la clase solo debería tener un propósito (en este caso, almacenar estado) por lo que no debería importarle la presentación de este objeto.
Es por eso que el objeto Render está separado. Tu diseño es bastante agradable.
No hay motivo por el cual un objeto Persona no puede llamar a un procesador de propósito general y aún tiene un conjunto limitado de responsabilidades.Después de todo, el objeto Person es responsable de los atributos, y pasar esos atributos a un Renderer está dentro de sus responsabilidades.
Si es realmente un problema (y puede serlo en algunas aplicaciones), puede introducir las clases Helper. Entonces, la clase PersonRenderer
hace la representación de datos Person
. De esta forma, un cambio en Person también requiere cambios en PersonRenderer
, y nada más. Este es el patrón de diseño Objeto de acceso a datos.
Algunas personas harán que la Render sea una clase interna, incluida en Person, por lo que es Person.PersonRenderer
para imponer una contención más seria.
es necesario encontrar una mejor fuente de material de lectura, mi amigo. No todo lo que lees en los intertubos es cierto. Getters/Setters son lo opuesto al mal. Si hubieras publicado la fuente de esta joya de la sabiduría, podríamos separarla, pero, por desgracia, no hay ningún enlace ... aha-- enlace publicado. ya criticado noop. –
@Sky Todo depende del contexto, algunos usos de Getters/Setters son buenos y otros son "malvados" (aunque no habría usado esa palabra). Intento no ser tan dogmático. –
@Andreas - entendido. El uso indebido de cualquier construcción puede ser malo, pero caracterizar a los buscadores/establecedores como malvados en el mismo contexto que, por ejemplo, eval es simplemente tonto, IMO. –