Antecedentes
Estoy leyendo el "Libro de código limpio" y, paralelamente, estoy trabajando en objetos calisténicos Kata como la cuenta bancaria, y estoy atascado en esa regla:
La novena regla de los objetos calisténicos es que no usamos getter o setters.
Parece bastante divertido, y estoy de acuerdo con este principio. Además, en la página 98-99 de Clean Code, el autor explica que los captadores / establecedores rompen la abstracción, y que no tenemos que preguntarle a nuestro objeto, sino que debemos decirle a nuestro objeto.
Esto tiene mucho sentido en mi mente, y estoy totalmente de acuerdo con este principio. El problema viene en la práctica.
Contexto
Por ejemplo, tengo una aplicación en la que tengo que enumerar algunos usuarios y mostrar los detalles del usuario.
Mi usuario está compuesto por:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
Problema
¿Cómo puedo hacer o qué puedo hacer para evitar captadores cuando solo necesito mostrar una información simple ( y tengo que confirmar que no necesito una operación adicional en ese campo en particular ) para mostrar el valor de Nombre en un simple ( aleatorio) soporte de salida?
Lo que viene a mi mente
Una solución es hacer:
user.getName().getFirstName().getStringValue()
Lo cual es terriblemente terrible, que rompe muchas reglas de objetos calisténicos y viola la Ley Demeter.
Otro sería algo como:
String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();
Pero no me siento cómodo con esta solución, que solo parece ser un "acceso de orden superior", como evitar el captador / configurador estándar con un método que solo tiene como objetivo coincidir con la ley de Demeter ...
Alguna idea ?
fuente
Una dirección para pensar sería proporcionar una función de miembro de formato de cadena genérica, en lugar de proporcionar acceso a los datos sin procesar. Algo como esto:
Verá, con este enfoque, no está limitado a proporcionar los datos completos tal como están, sino que puede proporcionar medios para transformar los datos de manera conveniente y significativa. Por ejemplo, es posible que deba jugar trucos con mayúsculas y minúsculas:
También podría definir algunos formatos comúnmente utilizados, posiblemente complejos, una vez, por lo que podría decir, por ejemplo
La belleza de este enfoque es que mantiene las cadenas individuales internas de la
User
clase, al tiempo que proporciona una funcionalidad significativamente mayor al código de llamada. Sin embargo, la desventaja es que debe implementar el mecanismo de plantilla dentro delformatDescription()
cual habrá algunas líneas de código.Como tal, esto podría ser una exageración total: nunca olvide que los principios de programación son solo pautas. Y siempre que seguir otro principio viole el principio de KISS, lo mejor es hacerlo de la manera más sencilla. Entonces, a menos que tenga al menos alguna necesidad de un miembro de formato de este tipo, no me molestaría en implementarlo por simplicidad, utilizando el enfoque basado en el descriptor de acceso.
fuente
User
objeto analizar y compilar / interpretar un lenguaje de plantillas?User
clase tiene que implementar esta funcionalidad por sí misma. Si solo tuviera dos clases que necesitaran dicha funcionalidad, podría apostar a que factorice el mecanismo de reemplazo de plantilla en su propia clase. Esto está destinado a ser un ejemplo de cómo puede elevar la abstracción queUser
proporciona a un nivel en el que en realidad es más que un simple contenedor de datos. Y creo que de eso se trata evitar los accesos: hacer OOP en lugar de manejar un montón destruct
s.