Recentemente, realizamos uma revisão de código do código Java do aplicativo móvel desenvolvido por um contratado externo e observamos que todos os objetos de domínio / objetos de transferência de dados são gravados neste estilo:
public class Category {
public String name;
public int id;
public String description;
public int parentId;
}
public class EmergencyContact {
public long id;
public RelationshipType relationshipType;
public String medicalProviderType;
public Contact contact;
public String otherPhone;
public String notes;
public PersonName personName;
}
Obviamente, esses membros são acessados diretamente em qualquer outro lugar do código. Quando perguntamos sobre isso, os desenvolvedores nos disseram que esse é um padrão de design de aprimoramento de desempenho habitual usado em plataformas móveis, porque os dispositivos móveis são ambientes com recursos limitados. Não parece fazer sentido; acessar membros privados por meio de getters / setters públicos não parece adicionar muito custo. E os benefícios adicionais do encapsulamento parecem compensar os benefícios desse estilo de codificação.
Isso geralmente é verdade? Isso normalmente é feito em plataformas móveis pelos motivos mencionados acima? Todos os comentários são bem-vindos e apreciados -
fonte
Respostas:
Assumindo que os autores não se deram ao trabalho de fornecer referências autorizadas para justificar sua "decisão de design", é bastante seguro considerar isso um peido cerebral de codificadores subqualificados.
Estou na raquete Java móvel há vários anos (ainda com 2 ou 3K de reputação SO em tags relacionadas, porque o uso como forma de não esquecer o básico), revi e escrevi bastante código, estudei várias especificações, tutoriais e estilo guias - nenhum deles já mencionou nem uma sombra de diferença que esse tipo de design poderia ter comparado ao Java SE. Se você estiver interessado em encontrar esses tutoriais e se orientar, verifique as wikis das tags SO em tags relevantes como java-me , midp etc.
fonte
Há um grão de verdade na afirmação do seu contratante.
Por algum tempo, os desenvolvedores de jogos Android foram incentivados a evitar getters e setters internos por motivos de desempenho. No entanto, esse conselho se aplica apenas aos desenvolvedores de jogos que precisam levar os dispositivos ao limite e são obrigados a sacrificar outros benefícios para atingir seus objetivos. Além disso, com o lançamento do Gingerbread, isso ainda beneficia pouco desta prática.
Mais de uma vez, conheci desenvolvedores que oferecem conselhos sobre "melhores práticas" ou seguem diretrizes que são perfeitamente válidas em um cenário (geralmente histórico), mas que simplesmente não se aplicam ao caso em questão. Na maioria das vezes, isso ocorre porque o desenvolvedor esqueceu (ou nunca soube) as razões pelas quais seus conselhos se aplicavam em primeiro lugar; portanto, eles assumem que deve ser válido para todos os casos o tempo todo. Na minha experiência, isso é particularmente comum quando se discute o ajuste de desempenho. Esse parece ser o caso aqui.
A abordagem correta para o desempenho é:
fonte
Você está certo que, por si só, isso provavelmente não é uma diferença significativa no desempenho, mas se é um sinal de que, em geral, os desenvolvedores estão de olho em reduzir o número de chamadas de método (que são relativamente caras) e outras despesas indiretas, isso significa eles estão fazendo um bom trabalho.
Discutiria mais profundamente com eles sobre sua filosofia geral de codificação para ver se é isso que eles desejam.
(você também está assumindo que os campos públicos são inquestionavelmente ruins e os getters / setters são a única maneira, que eu acho que você não encontraria 100% de suporte, mesmo neste site)
fonte
Pode ser verdade que historicamente isso foi feito dessa maneira; por exemplo, porque as plataformas móveis anteriores são particularmente limitadas por recursos ... ou possuem otimizadores particularmente ruins (sem nomear nomes :-)).
Mas não acho que "prática habitual" ou "prática histórica" seja relevante. Você tem o direito absoluto de dizer a quais padrões de codificação deseja que seu contratado cumpra. Além disso, se a sua plataforma não tiver recursos limitados (ou o que seja), a justificação da "prática habitual" de seu contratante estará vazia ... porque as condições que tornam aceitável essa prática infeliz não existem.
fonte
Para objetos de domínio, isso é design de lixo - você deseja encapsular a lógica nos objetos de domínio ou, pelo menos, deseja poder adicionar lógica facilmente mais tarde .
Mas para os DTOs, eu uso design semelhante, pois eles não têm lógica - eles são DTOs.
Eu assumiria que qualquer sobrecarga de desempenho (que seria minúscula de qualquer maneira) será otimizada pela máquina virtual java de qualquer maneira.
fonte