fundo
Estou lendo o livro "Código Limpo" e, paralelamente, estou trabalhando em objetos calistênicos Kata como a conta bancária, e estou preso a essa regra:
A 9ª regra dos objetos calistênicos é que não usamos getter ou setters.
Parece bem divertido, e eu concordo com esse princípio. Além disso, na página 98-99 do Código Limpo, o autor explica que os getters / setters quebram a abstração e que não precisamos perguntar ao nosso objeto, mas precisamos informar ao objeto.
Isso faz todo o sentido em minha mente e concordo plenamente com esse princípio. O problema vem na prática.
Contexto
Por exemplo, estou tendo um aplicativo no qual preciso listar alguns usuários e exibir os detalhes do usuário.
Meu usuário é composto por:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
Problema
Como posso fazer ou o que posso fazer para evitar getters quando preciso exibir apenas uma informação simples ( e tenho que confirmar que não preciso de operação extra nesse campo específico ) para exibir o valor do Nome de maneira simples ( aleatório) suporte de saída?
O que aparece em minha mente
Uma solução é fazer:
user.getName().getFirstName().getStringValue()
O que é totatally terrível, quebrando muitas regras de objetos calistênicos e violando a Lei Deméter.
Outro seria 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();
Mas não me sinto confortável com essa solução, que parece apenas um "acessador de ordem superior", como contornar o getter / setter padrão com um método que visa apenas corresponder à lei de Demeter ...
Qualquer ideia ?
fonte
Uma direção a pensar seria fornecer uma função-membro de formatação genérica de strings, em vez de fornecer acesso aos dados brutos. Algo assim:
Veja que, com essa abordagem, você não está restrito apenas a fornecer os dados completos, como pode ser, pode fornecer meios para transformar os dados de maneira conveniente e significativa. Por exemplo, você pode precisar fazer truques com maiúsculas e minúsculas:
Você também pode definir alguns formatos comumente usados, possivelmente complexos, uma vez, por exemplo, por exemplo
A vantagem dessa abordagem é que ela mantém as seqüências individuais internas da
User
classe, enquanto fornece uma funcionalidade significativamente maior ao código de chamada. No entanto, a desvantagem é que você precisa implementar o mecanismo de modelagem noformatDescription()
qual haverá algumas linhas de código.Como tal, isso pode ser um exagero total: nunca esqueça que os princípios de programação são apenas diretrizes. E sempre que seguir outro princípio viola o princípio do KISS, é melhor fazê-lo da maneira mais simples. Portanto, a menos que você tenha pelo menos alguma necessidade de um membro dessa formatação, eu não me incomodaria em implementá-lo por uma questão de simplicidade, usando a abordagem baseada em acessador.
fonte
User
objeto analisar e compilar / interpretar uma linguagem de modelos?User
classe precisa implementar essa funcionalidade. Se eu tivesse apenas duas classes que precisavam dessa funcionalidade, você poderia apostar em eu fatorar o mecanismo de substituição de modelo em sua própria classe. Isso deve ser um exemplo de como você pode elevar a abstração queUser
fornece a um nível em que na verdade é mais do que apenas um contêiner de dados. E eu acredito que é isso que é evitar os acessadores: fazer POO em vez de lidar com váriosstruct
s.