Não faça isso; isso vai complicar demais as coisas e você não vai precisar disso
... é a resposta que eu teria escrito aqui há dois anos. Agora, porém, não tenho tanta certeza; Na verdade, nos últimos meses, comecei a migrar código antigo para esse formato, não porque não tenha nada melhor a fazer, mas porque realmente precisava disso para implementar novos recursos ou alterar os existentes. Eu entendo as aversões automáticas que outros aqui têm visto esse código, mas eu acho que isso é algo que merece um pensamento sério.
Benefícios
O principal benefício é a capacidade de modificar e estender o código. Se você usa
class Point {
int x,y;
// other point operations
}
ao invés de apenas passar um par de inteiros ao redor - o que é algo que, infelizmente, muitas interfaces fazem - então fica muito mais fácil adicionar outra dimensão. Ou altere o tipo para double
. Se você usar List<Author> authors
ou List<Person> authors
em vez de List<String> authors
, mais tarde será mais fácil adicionar mais informações ao que um autor representa. Escrevendo assim, parece que estou afirmando o óbvio, mas na prática eu tenho sido culpado de usar strings dessa maneira muitas vezes, especialmente em casos em que não era óbvio no início, então eu precisaria de mais do que isso. uma string.
Atualmente, estou tentando refatorar algumas listas de strings que estão interligadas em todo o meu código porque preciso de mais informações e sinto a dor: \
Além disso, eu concordo com o autor do blog de que ele carrega mais informações semânticas , facilitando o entendimento do leitor. Embora os parâmetros geralmente recebam nomes significativos e obtenham uma linha de documentação dedicada, isso geralmente não acontece com campos ou locais.
O benefício final é o tipo de segurança , por razões óbvias, mas aos meus olhos é uma pequena coisa aqui.
Desvantagens
Demora mais tempo a escrever . Escrever uma pequena turma é rápido e fácil, mas não sem esforço, especialmente se você precisar de muitas dessas classes. Se você parar a cada 3 minutos para escrever uma nova classe de wrappers, isso pode ser um verdadeiro prejuízo para a sua concentração também. Eu gostaria de pensar, no entanto, que esse estado de esforço geralmente só acontecerá no primeiro estágio de escrever qualquer pedaço de código; Eu geralmente consigo uma boa ideia rapidamente sobre quais entidades precisarão estar envolvidas.
Pode envolver muitos setters (ou construções) e getters redundantes . O autor do blog dá o exemplo realmente desagradável de new Point(x(10), y(10))
em vez de new Point(10, 10)
, e gostaria de acrescentar que um uso também pode envolver coisas como Math.max(p.x.get(), p.y.get())
em vez de Math.max(p.x, p.y)
. E o código longo é muitas vezes considerado mais difícil de ler e com justiça. Mas com toda honestidade, tenho a sensação de que um lote de código movimenta objetos, e somente métodos selecionados o criam, e menos ainda precisam acessar seus detalhes corajosos (o que não é OOPy de qualquer maneira). / p>
Debatable
Eu diria se isso ajuda ou não com a legibilidade do código é discutível. Sim, mais informação semântica, mas mais código. 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 você leia a documentação dele.
Como acontece com a maioria das outras escolas de pensamento de programação, acho que não é saudável levar isso ao extremo. Eu não 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. Eu não gosto do uso de unsigned int
em C - apesar de teoricamente bom, ele simplesmente não fornece informações suficientes, e proíbe estender seu código mais tarde para suportar esse -1 mágico. Às vezes você precisa de simplicidade.
Acho que o post do blog é um pouco extremo. Mas, no geral, aprendi com a dolorosa experiência que a ideia básica por trás disso é feita a partir das coisas certas.
Tenho uma profunda aversão ao código superengenharia. Eu realmente faço. Mas acertou, não acho que isso seja engenharia excessiva.