Não faça isso; isso complicará demais as coisas e você não precisará disso
... é a resposta que eu teria escrito aqui há 2 anos. Agora, porém, não tenho tanta certeza; de fato, nos últimos meses, comecei a migrar códigos antigos para esse formato, não porque não tenho nada melhor para fazer, mas porque realmente precisava dele para implementar novos recursos ou alterar os existentes. Entendo as aversões automáticas que outras pessoas veem nesse código, mas acho que isso é algo que merece uma reflexão séria.
Benefícios
O principal entre os benefícios é a capacidade de modificar e estender o código. Se você usar
class Point {
int x,y;
// other point operations
}
em vez de apenas passar alguns números inteiros - o que, infelizmente, muitas interfaces fazem -, fica muito mais fácil adicionar outra dimensão posteriormente. Ou mude o tipo para double
. Se você usar List<Author> authors
ou em List<Person> authors
vez List<String> authors
disso mais tarde, será muito mais fácil adicionar mais informações ao que o autor representa. Anotá-lo dessa maneira, parece que estou dizendo o óbvio, mas, na prática, eu tenho sido culpado de usar strings dessa maneira muitas vezes, especialmente nos casos em que não era óbvio no começo, então eu precisaria de mais do que uma linha.
No momento, estou tentando refatorar uma lista de cadeias de caracteres que está entrelaçada em todo o meu código, porque preciso de mais informações e sinto a dor: \
Além disso, concordo com o autor do blog que ele carrega mais informações semânticas , facilitando a compreensão do leitor. Embora os parâmetros geralmente recebam nomes significativos e obtenham uma linha de documentação dedicada, isso geralmente não é o caso de campos ou locais.
O benefício final é a segurança do tipo , por razões óbvias, mas aos meus olhos é uma coisa menor aqui.
Desvantagens
Leva mais tempo para escrever . Escrever uma turma pequena é rápido e fácil, mas não exige esforço, especialmente se você precisar de muitas dessas aulas. Se você parar a cada 3 minutos para escrever uma nova classe de wrapper, também poderá ser um prejuízo real para sua concentração. Eu gostaria de pensar, no entanto, que esse estado de esforço geralmente só acontece no primeiro estágio de escrever qualquer parte do código; Normalmente, eu posso ter uma boa idéia rapidamente de quais entidades precisarão estar envolvidas.
Pode envolver muitos setters redundantes (ou construções) e getters . O autor do blog dá o exemplo realmente feio de em new Point(x(10), y(10))
vez de new Point(10, 10)
, e eu gostaria de acrescentar que um uso também pode envolver coisas como em Math.max(p.x.get(), p.y.get())
vez de Math.max(p.x, p.y)
. E código longo é geralmente considerado mais difícil de ler, e com justiça. Mas, com toda a honestidade, tenho a sensação de que muitos códigos movem objetos, e apenas métodos selecionados o criam, e menos ainda precisam acessar seus detalhes difíceis (o que não é OOPy).
Discutível
Eu diria se isso ajuda ou não a legibilidade do código é discutível. Sim, mais informações semânticas, mas código mais longo. Sim, é mais fácil entender o papel de cada local, mas é mais difícil entender o que você pode fazer com ele, a menos que leia a documentação.
Como na maioria das outras escolas de programação, acho que não é saudável levar essa ao extremo. Eu nunca me vejo separando as coordenadas xey para ser de um tipo diferente. Eu não acho que Count
é necessário quando um int
deve ser suficiente. Não gosto do unsigned int
uso em C - embora teoricamente bom, ele não fornece informações suficientes e proíbe estender seu código posteriormente para suportar esse -1 mágico. Às vezes você precisa de simplicidade.
Eu acho que o post do blog é um pouco extremo. Mas, no geral, aprendi por experiência dolorosa que a idéia básica por trás disso é feita com as coisas certas.
Tenho uma aversão profunda ao código de engenharia excessiva. Eu realmente faço. Mas, usado corretamente, não acho que isso exagere na engenharia.