Betrachten Sie die folgende Klasse:
%Vor% Ich habe nur 1 Integer und 2 Accessoren. Wenn ich eine Hilfsmethode erstellen möchte, die den Status der Objekte als String zurückgibt, wird empfohlen, auf die Klassenvariable als this.age
zu verweisen, oder sollte ich getAge()
?
Gibt es eine Best Practice, oder liegt es an der Entwicklerdiskriminierung?
Hängt davon ab. Für kleine schnelle Klassen, bei denen Accessoren nichts tun, würde ich sagen, die Felder direkt zu benutzen. Für größere Klassen, in denen Accessoren und Setter Nebenwirkungen haben könnten, würde ich Accessoren verwenden.
Auf der Android-Plattform scheint die Android-Dokumentation zu stimmen. Sie gehen sogar so weit, dass sie in bestimmten Fällen den Schutz auf Paketebene empfehlen. Siehe die Abschnitte mit dem Titel "Interne Getters / Setter vermeiden" und "Package Scope mit inneren Klassen verwenden" in Ссылка .
Alles hängt von der Umgebung, der Größe des Codes und davon ab, ob es aus Gründen der Codepflege "Standards" gibt. Ich weiß nur, dass es kleine Leistungsunterschiede gibt, aber letztendlich liegt es am Entwickler / Team.
Es ist eine gute Übung, weil Sie nie sicher sein können, wie Sie sich das Alter zu einem späteren Zeitpunkt ändern möchten. Es kann eine Validierung oder etwas anderes erfordern und es ist einfacher, es in einer Methode zu ändern, als überall, wo das Feld verwendet wird (und es ist viel einfacher, einen Ort zu übersehen, an dem es verwendet wird und somit Schwierigkeiten hat, einen möglichen Fehler ausfindig zu machen ).
Für die Liebe Gottes, verschmelzen Sie Ihren Code nicht mit einer oxymoronischen "Selbstverkapselung". Die Klasse ist dein Modul. Mach deine Klasse einfach.
Entwerfen Sie auch die Oberfläche Ihrer Klasse in Bezug auf das Verhalten anstelle von Daten. Lass die Methoden ablegen und setzen.
Ich benutze Getter und Setter auch für einfache Klassen, da es in Ihrem Code "Hooks" erzeugt, was das Erweitern erleichtert. Wenn Sie also jedes Mal, wenn ein Benutzer eine bestimmte Objekteigenschaft ändert, einen Prüfeintrag erstellen möchten, ist dies einfach. Dann, wenn ich am Ende meines Projekts angelangt bin, nehme ich mir einen Moment Zeit und lösche die Getter und Setter, die ich nicht benutzt habe. Ich finde das effektiv, weil die meisten IDEs die Accessoren für Sie generieren, so dass nicht viel Zeit verschwendet wird ...
Ich sehe Leute, die posten, "Wenn du es später ändern willst, kannst du es immer tun." . Dies ist in großen Projekten nicht immer trivial, wenn Sie im gesamten Code direkt auf Ihre Objekteigenschaften zugreifen.
Oft gehen Leute mit this.age in einer einfachen Klasse, aber überlegen Sie sich die Vorteile von Accessoren, wenn Sie sie bereits haben. Wenn Sie zum Beispiel einen Tag einführen möchten, sagen Sie, wenn jemand älter wird, müssen Sie ihn an jedem Ort ablegen, den Sie "this.age" nennen. Oder stattdessen können Sie es einfach in den Accessor legen. Code-Stil ist nicht immer festgelegt, aber normalerweise gibt es einen guten Grund, wenn Sie danach suchen.
Eine Sache, an die Sie sich erinnern sollten. Wenn Sie etwas wie Hibernate verwenden, ist die Verwendung der Accessoren in der Regel erforderlich ! Bin ein paar Mal von diesem gebissen worden. Hibernate verwendet die Bytecode-Generierung, um die Initialisierung zu verzögern. Wenn Sie direkt auf die Elementvariable zugreifen, übergehen Sie das verzögerte Laden und erhalten Nullwerte. Meine persönliche Best Practice ist also, den Accessor zu verwenden. Wie bei allen Best Practices gibt es natürlich Zeiten, in denen man es ignorieren kann, aber da gehts.
Ein paar Gründe, warum Accessoren "kann" eine bessere Option sein:
IMHO: Ich folge dem You-Aint-Gonna-Need-It-Prinzip, die Dinge einfach zu halten. Viele Entwickler sind besorgt, dass Sie eines Tages vielleicht einen Getter oder Setter brauchen, wenn das tatsächlich nie passiert.
Sie sollten tun, was Sie für am klarsten halten, vor allem für diejenigen, die Ihren Code pflegen müssen.
Ich würde empfehlen, int zu verwenden, es sei denn, der Wert muss null oder ein Objekt sein. Wenn Sie einen Wert von maximal Null benötigen, sollten Sie danach suchen.
d. entweder
%Vor%ODER
%Vor%Hinweis
%Vor%Während Accessoren Codezeilen zu Ihren Klassen hinzufügen, fügen sie wirklich Wert beim Refactoring von Code hinzu. Sie müssen eine andere Klasse benachrichtigen, dass sich eine Eigenschaft geändert hat? BAM! Es gibt ein Ereignis und triggert es innerhalb des Accessor-Codes.
Wenn Sie nur die Membervariable zugänglich machen, müssen Sie entweder den Accessor erstellen, wenn Sie das Ereignis erstellen müssen, oder daran denken, die Logik anzuhängen, um das Objekt jedes Mal zu benachrichtigen, wenn ein Objekt außerhalb Ihrer Klasse die Membervariable ändert.
Ich denke, Accessoren sind großartig für ihre Flexibilität bei Komplexitätsverhältnissen. Außerdem benötigen einige Frameworks wie Hibernate sie. Sprachen wie .net haben auch Code-Strukturen wie Attribute, die nicht auf Member-Variablen angewendet werden können (aka WCF DataMember).
hoffe das hilft!
Tags und Links java