Frage

Wie entscheiden Sie, Jungs zwischen lokal Spur von etwas halten und dann übergeben Sie nur in Sie es zu jeder Methode aufrufen, oder eine Instanz Variable deklarieren und es bei den Verfahren mit?

Ich neige dazu, Instanzvariablen in einer Liste am Ende der Klasse gehalten bevorzugen. Aber als meine Programme mehr und mehr kompliziert, wird diese Liste länger und länger ... Ich vermute, dass, wenn etwas oft genug passiert immer sollte es nur für alle Jungen und Mädchen zu sehen sein, die es brauchen, aber dann frage ich anfangen, „warum nicht einfach alles öffentlich machen! Dann wird es gar nicht mehr braucht vorbei alles sein!“

War es hilfreich?

Lösung

Da Sie Instanzvariablen sich beziehen, ich gehe davon aus, dass Sie in einer objektorientierten Sprache arbeiten. Bis zu einem gewissen Grad, wenn Instanzvariablen verwenden, wie sie ihre Tragweite definieren, und wenn lokale Variablen zu verwenden, ist subjektiv, aber es gibt ein paar Faustregeln Sie folgen können, wenn Ihre Klassen zu schaffen.

  • Instanzvariablen werden in der Regel als Attribut einer Klasse sein. von diesen als Adjektiv des Objekts Denken Sie, die von Ihrer Klasse erstellt wird. Wenn die Instanz Daten verwendet werden können, um das Objekt zu helfen zu beschreiben, dann ist es wahrscheinlich sicher zu wetten, dass es zum Beispiel Daten eine gute Wahl ist.

  • Lokale Variablen werden im Rahmen der Methoden verwendet, um ihnen ihre Arbeit vollenden zu helfen. In der Regel sollte ein Verfahren einen Zweck hat einige Daten zu bekommen, einige Daten zurückkehren, und / oder verarbeitend / einen Algorithmus auf einige Daten ausgeführt wird. Manchmal hilft es, von lokalen Variablen wie Wege zu denken, ein Verfahren von Anfang an geholfen bekommen zu beenden.

  • Instanz Variablenbereich ist nicht nur für Sicherheit, sondern für die Verkapselung, wie gut. Gehen Sie nicht davon, dass das „Ziel, alle Variablen privat zu halten sein soll.“ In den Fällen der Vererbung, Variablen als geschützt zu machen ist in der Regel eine gute Alternative. Anstatt alle Instanzdaten öffentlichen Markierung erstellen Sie Getter / Setter für diejenigen, die nach außen zugegriffen werden muss. Sie nicht, sie alle zur Verfügung stellen - nur die, die Sie benötigen. Dies wird während des gesamten Entwicklungszyklus kommen -. Es ist schwer zu erraten, aus der sich gehen

Wenn es Daten um eine Klasse zu vorbei kommt, ist es schwer zu sagen, was Sie tun, ohne zu sehen, einigen Code gute Praxis ist. Manchmal direkt auf die Instanzdaten arbeitet, ist in Ordnung; andere Zeiten ist es nicht. Meiner Meinung nach, ist dies etwas, das kommt mit der Erfahrung - Sie etwas Intuition entwickeln werden als objektorientierte Denkfähigkeiten verbessern

.

Andere Tipps

Vor allem hängt dies von der Lebensdauer der Daten, die Sie in den Variablen speichern. Wenn die Daten nur während einer Berechnung verwendet wird, übergeben Sie es als Parameter. Wenn die Daten auf die Lebensdauer des Objekts gebunden ist, eine Instanzvariable verwenden.

Wenn Sie Ihre Liste von Variablen zu lang wird, vielleicht ist es ein guter Punkt, um Refactoring einige Teile der Klasse in eine neue Klasse zu denken.

Meiner Meinung nach, Instanzvariablen sind nur dann notwendig, wenn die Daten über Anrufe verwendet werden.

Hier ist ein Beispiel:

myCircle = myDrawing.drawCircle(center, radius);

Jetzt können Abbilden der myDrawing Klasse 15 Hilfsfunktionen verwendet das myCircle Objekt zu erstellen und jede dieser Funktionen wird das Zentrum und den Radius benötigen. Sie sollen nach wie vor nicht als Instanzvariablen der myDrawing Klasse eingestellt werden. Weil sie nie wieder benötigt werden.

Auf der anderen Seite, die myCircle Klasse wird sowohl den Mittelpunkt und Radius als Instanzvariablen speichern müssen.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Damit das myCircle Objekt zu wissen, was es ist Radius und Mittelpunkt, wenn diese neuen Anrufe getätigt werden, müssen sie als Instanzvariablen gespeichert werden, nicht nur auf die Funktionen übergeben, die sie benötigen.

Also im Grunde Instanzvariablen sind eine Möglichkeit, den „Zustand“ eines Objekts zu speichern. Wenn eine Variable nicht erforderlich ist, den Zustand eines Objekts zu kennen, dann sollte es keine Instanz variabel sein.

Und was alles öffentlich zu machen. Es könnte Ihr Leben leichter im Moment machen. Aber es wird wieder kommen zu Ihnen zu verfolgen. Wir fordern nicht.

IMHO:

Wenn die Variable bildet einen Teil des Standes der Instanz, dann sollte es eine Instanz variabel sein -. Classinstance HAS-A instancevariable

Wenn ich mich etwas gefunden vorbei wiederholt in eine Instanz Methoden, oder ich fand, dass ich eine große Anzahl von Instanzvariablen hatte ich wahrscheinlich versuchen würde und sehen Sie auf mein Design in Fall würde ich etwas verpasst oder machte eine schlechte Abstraktion irgendwo .

Hoffe, es hilft

Natürlich ist es leicht, eine große Liste von öffentlichen Variablen in der Klasse zu halten. Aber auch intuitiv, können Sie sagen, dass dies nicht der Weg zu gehen.

Definieren Sie die Variable rechts, bevor Sie es benutzen werden. Wenn eine Variable, die die Funktion einer bestimmten Methode unterstützt, verwenden sie nur im Rahmen des Verfahrens.

Denken Sie auch an die Sicherheit, eine öffentliche Klasse Variable ist anfällig für unerwünschte Änderungen von „außen“ Code. Ihr Hauptziel sollte alle Variablen privat zu halten sein, und jede Variable, die sollte einen sehr guten Grund zu sein, so nicht, haben.

über Parameter alles, was sie sich nach dem Stapel vorbei, kann dies sehr schnell hässlich. Die Faustregel ist Ihre Methode Signaturen sauber und elegant zu halten. Wenn Sie viele Methoden mit den gleichen Daten, entscheiden, ob, wenn es wichtig genug ist, ein Klassenmitglied zu sein, und wenn es nicht ist, Refactoring Code, um es mehr Sinn machen.

Es läuft darauf hinaus, den gesunden Menschenverstand nach unten. Denken Sie genau, wo und warum Sie jede neue Variable deklarieren, was es sollte Funktion sein und von dort aus eine Entscheidung treffen in Bezug auf die Tragweite sollte leben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top