É habitual gravar objetos de domínio Java / objetos de transferência de dados com variáveis ​​de membro público em plataformas móveis?

8

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 -

Sean Mickey
fonte
7
"Padrão específico de domínio" é uma das minhas desculpas favoritas para códigos ruins, e vem logo após "problemas de desempenho". Dito isto, não um desenvolvedor de dispositivos móveis, pode haver alguma verdade lá.
yannis
Por que existe uma tag Java e uma tag iphone? Essas duas tags não coincidem. Essa é uma pergunta de codificação genérica ou uma pergunta do Android / j2m.
Rig
1
@Rig Como a postagem original deveria incluir também o objetivo C, esse código exibe o mesmo estilo, mas fiquei sem tags para anexar à postagem. Eu deveria ter acrescentado clareza à postagem original ou removido a tag do iphone. Eu removi a etiqueta do iphone por uma questão de clareza.
6136 Sean Mickey
@SeanMickey Isso é legal. Apenas um comentário indireto ... as pessoas tendem a subestimar severamente o que os dispositivos móveis podem fazer hoje em dia. Quase soa como otimização prematura de velhos chapéus.
Rig

Respostas:

4

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

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.

mosquito
fonte
Eu realmente não chegaria a dizer "desenvolvedores subqualificados". Logicamente, faz sentido e simplesmente poderia ser uma ressaca de telefones realmente antigos (lento) com muito antigas versões Java (não otimizado)
TheLQ
@TheLQ esse padrão engraçado por si só não é seu problema; o problema é que eles não conseguem explicar. E não, melhoria de desempenho habitual para móvel não é uma explicação - não se pode apenas jogar um pesadelo de manutenção para estranhos e esperar que ele fique com justificação como essa
mosquito
3

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 é:

  1. para acertar antes de fazer se for rápido
  2. use métricas para dizer o que otimizar e novamente para determinar se seus esforços estão sendo bem-sucedidos
Kramii
fonte
2
Esta resposta adiciona uma perspectiva geral que é muito útil. É um ótimo complemento (não um elogio) para o @ gnat's e me permite entender o que foi feito de uma maneira mais ampla. Isso confirma minha avaliação inicial da abordagem. Obrigado
Sean Mickey
0

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)

Grahamparks
fonte
Obrigado por seus pensamentos. Mas não estou realmente fazendo uma suposição; Eu tenho uma mente aberta. Estou negociando com os benefícios do encapsulamento. E ter validação nos métodos setXyz.
Sean Mickey
0

Isso geralmente é verdade? Isso normalmente é feito em plataformas móveis pelos motivos mencionados acima?

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.

Stephen C
fonte
0

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.

NimChimpsky
fonte