Ist es üblich, Java-Domänenobjekte / Datenübertragungsobjekte mit öffentlichen Mitgliedsvariablen auf mobilen Plattformen zu schreiben?

8

Wir haben kürzlich eine Codeüberprüfung des Java-Codes für mobile Anwendungen durchgeführt, der von einem externen Auftragnehmer entwickelt wurde, und festgestellt, dass alle Domänenobjekte / Datenübertragungsobjekte in diesem Stil geschrieben sind:

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;
}

Natürlich wird auf diese Mitglieder dann direkt überall im Code zugegriffen. Als wir danach fragten, sagten uns die Entwickler, dass dies ein übliches Entwurfsmuster zur Leistungssteigerung ist, das auf mobilen Plattformen verwendet wird, da mobile Geräte ressourcenbeschränkte Umgebungen sind. Es scheint keinen Sinn zu ergeben; Der Zugriff auf private Mitglieder über öffentliche Getter / Setter scheint nicht viel Aufwand zu verursachen. Und die zusätzlichen Vorteile der Kapselung scheinen die Vorteile dieses Codierungsstils aufzuwiegen.

Ist das allgemein wahr? Wird dies normalerweise aus den oben genannten Gründen auf mobilen Plattformen durchgeführt? Alle Rückmeldungen willkommen und geschätzt -

Sean Mickey
quelle
7
"Domain-spezifisches Muster" ist eine meiner Lieblingsausreden für beschissenen Code und kommt direkt nach "Leistungsproblemen". Das heißt, kein mobiler Entwickler, da könnte etwas Wahres drin sein.
Yannis
Warum gibt es ein Java-Tag und ein iPhone-Tag? Diese beiden Tags stimmen nicht überein. Dies ist entweder eine generische Codierungsfrage oder eine Android / J2M-Frage.
Rig
1
@Rig Da der ursprüngliche Beitrag auch Ziel C enthalten sollte, weist dieser Code denselben Stil auf, aber mir gingen die Tags zum Anhängen an den Beitrag aus. Ich hätte dem ursprünglichen Beitrag Klarheit verleihen oder das iPhone-Tag entfernen sollen. Ich habe das iPhone-Tag aus Gründen der Übersichtlichkeit entfernt.
Sean Mickey
@ SeanMickey Das ist cool. Nur ein Kommentar auf der Strecke ... Die Leute neigen dazu, stark zu unterschätzen, was mobile Geräte heutzutage können. Klingt fast nach vorzeitiger Optimierung alter Hüte.
Rig

Antworten:

4

Die Entwickler sagten uns, dass dies ein übliches Entwurfsmuster zur Leistungssteigerung ist, das auf mobilen Plattformen verwendet wird, da mobile Geräte ressourcenbeschränkte Umgebungen sind

Unter der Annahme, dass sich die Autoren nicht die Mühe gemacht haben, maßgebliche Referenzen zur Rechtfertigung ihrer "Entwurfsentscheidung" anzugeben, können Sie dies als einen Hirnfurz unterqualifizierter Codierer betrachten.

Ich bin seit mehreren Jahren im mobilen Java-Racket (habe immer noch einen 2- oder 3K-SO-Ruf in verwandten Tags, weil ich damit die Grundlagen nicht vergesse), habe viel Code überprüft und geschrieben, mehrere Spezifikationen, Tutorials und Stile studiert Anleitungen - keine dieser Anleitungen erwähnte jemals einen Unterschied, den dieses Design möglicherweise im Vergleich zu Java SE hätte haben können. Wenn Sie daran interessiert sind, solche Tutorials und Anleitungen selbst zu finden, überprüfen Sie die SO-Tag-Wikis in relevanten Tags wie Java-Me , Midp usw.

Mücke
quelle
Ich würde wirklich nicht so weit gehen, "unterqualifizierte Entwickler" zu sagen. Logischerweise macht es Sinn und könnte einfach ein Kater von wirklich alten Telefonen (langsam) mit wirklich alten Java-Versionen (nicht optimiert) sein
TheLQ
@TheLQ dieses lustige Muster an sich ist nicht ihr Problem; Das Problem ist, dass sie es nicht erklären können. Und nein, die übliche Leistungssteigerung für Mobilgeräte ist keine Erklärung - man kann nicht einfach einen solchen Alptraum der Wartbarkeit auf Fremde werfen und erwarten, dass er bei dieser Rechtfertigung
Mücke
3

In der Behauptung Ihres Auftragnehmers steckt ein Körnchen Wahrheit .

Für einige Zeit wurden Android-Spieleentwickler aufgefordert, interne Getter und Setter aus Leistungsgründen zu vermeiden . Dieser Rat gilt jedoch nur für Spieleentwickler, die Geräte an ihre Grenzen bringen müssen und andere Vorteile opfern müssen , um ihre Ziele zu erreichen. Mit der Veröffentlichung von Gingerbread profitiert dieses Spiel sogar wenig von dieser Praxis.

Mehr als einmal habe ich Entwickler getroffen, die "Best Practice" -Ratschläge gaben oder Richtlinien befolgten, die in einem Szenario (oft historisch) vollkommen gültig sind, aber einfach nicht auf den vorliegenden Fall zutreffen. Meistens liegt dies daran, dass der Entwickler die Gründe, warum sein Rat überhaupt angewendet wurde, vergessen hat (oder nie wusste) , sodass er davon ausgeht, dass er für alle Fälle jederzeit gültig sein muss. Nach meiner Erfahrung ist dies besonders häufig bei der Erörterung der Leistungsoptimierung der Fall. Das scheint hier der Fall zu sein.

Der richtige Ansatz für die Leistung ist:

  1. um es richtig zu machen, bevor Sie es schnell machen
  2. Verwenden Sie Metriken, um zu erfahren, was Sie optimieren müssen, und um erneut festzustellen, ob Ihre Bemühungen erfolgreich sind
Kramii
quelle
2
Diese Antwort fügt eine allgemeine Perspektive hinzu, die sehr hilfreich ist. Es ist eine nette Ergänzung (kein Kompliment) zu @ gnat's und ermöglicht mir zu verstehen, was auf eine breitere Art und Weise getan wurde. Es bestätigt meine erste Einschätzung des Ansatzes. Vielen Dank
Sean Mickey
0

Sie haben Recht, dass dies für sich genommen wahrscheinlich keinen signifikanten Leistungsunterschied darstellt, aber wenn dies ein Zeichen dafür ist, dass die Entwickler im Allgemeinen die Anzahl der Methodenaufrufe (die relativ teuer sind) und anderen Overhead im Auge behalten, bedeutet dies Sie machen einen guten Job.

Ich würde mit ihnen ausführlicher über ihre allgemeine Codierungsphilosophie sprechen, um zu sehen, ob dies das ist, was sie anstreben.

(Sie gehen auch davon aus, dass öffentliche Felder zweifellos schlecht sind und Getter / Setter der einzige Weg sind, für den Sie meiner Meinung nach selbst auf dieser Website keine 100% ige Unterstützung finden würden.)

Grahamparks
quelle
Danke für deine Gedanken. Aber ich gehe nicht wirklich davon aus; Ich bin offen. Ich tausche es gegen die Vorteile der Kapselung aus. Und Validierung in den setXyz-Methoden.
Sean Mickey
0

Ist das allgemein wahr? Wird dies normalerweise aus den oben genannten Gründen auf mobilen Plattformen durchgeführt?

Es mag wahr sein, dass es historisch so gemacht wurde; zB weil frühere mobile Plattformen besonders ressourcenbeschränkt sind ... oder besonders schlechte Optimierer haben (keine Namen nennen :-)).

Aber ich denke nicht, dass "übliche" oder "historische Praxis" relevant ist. Sie haben das uneingeschränkte Recht zu sagen, welche Codierungsstandards Ihr Auftragnehmer einhalten soll. Außerdem, wenn Ihre Plattform nicht ressourcenbeschränkt ist (oder was auch immer), ist die Begründung Ihres Auftragnehmers "übliche Praxis" leer ... weil die Bedingungen, die diese unglückliche Praxis akzeptabel machen, nicht existieren.

Stephen C.
quelle
0

Bei Domänenobjekten handelt es sich um Müllentwurf. Sie möchten, dass die Logik in den Domänenobjekten gekapselt ist, oder Sie möchten zumindest später problemlos Logik hinzufügen können .

Aber für DTOs verwende ich ein ähnliches Design, da sie keine Logik haben - sie sind DTOs.

Ich würde davon ausgehen, dass jeglicher Leistungsaufwand (der ohnehin winzig wäre) ohnehin von der virtuellen Java-Maschine optimiert wird.

NimChimpsky
quelle