Ruby - Wann werden Instanzvariablen gegen Parameter zwischen Methoden verwendet?


8

Ich schreibe mehrere Methoden, die andere Methoden aufrufen.

Um die Informationen weiterzugeben, habe ich mehrere Möglichkeiten:

  1. Übergeben Sie die Informationen als Parameter

  2. Legen Sie Instanzvariablen fest, damit andere Methoden darauf zugreifen können

Wann sollte ich eine Option der anderen vorziehen?

Es scheint, dass die erste Option gut ist, da sie sehr spezifisch ist, was übergeben wird. Der Nachteil scheint zu sein, dass viele Werte weitergegeben werden.

Die zweite Methode erfordert nicht die Weitergabe aller Werte, scheint aber zu viel Magie zu führen, wenn Methoden Instanzvariablen "irgendwo" setzen.

Sollte ich immer sehr explizit darüber sein, ob es an andere Methoden in der Klasse übergeben wird? Gibt es so Ausnahmen?


2
Oft hatte ich die Gelegenheit, Änderungen vorzunehmen oder einen Fehler in einem Code zu beheben, den jemand mit Option 2 geschrieben hat. Es ist normalerweise ein Wirrwarr und die Änderungen werden sehr zeitaufwändig. Selbst wenn ich alles geklärt habe, ist es immer noch sehr anstrengend, Änderungen vorzunehmen, da ich genau wissen muss, wann und wo Variablen initialisiert oder aktualisiert werden.
Dr. Wily Lehrling

Antworten:


12

Dies hängt von der Rolle dieser Variablen in Bezug auf die gesamte Klasse ab .

Wenn Ihre Klasse klein ist und die Informationen, die diese Variablen transportieren, für alle oder fast alle relevant sind, ist es sinnvoll, sie als Instanzvariablen zu haben. Ein Bankkontoobjekt muss wahrscheinlich ohnehin seinen Inhaber für die meisten Aktionen kennen, daher ist es sinnvoll, es auf unbestimmte Zeit zu behalten.

Wenn die Daten für diese Methode und ihre Helfer sehr spezifisch sind, sollten sie als Parameter übertragen werden. Das Datum einer Transaktion ist weniger ein Merkmal des Kontos als vielmehr eine einzelne Aktion, die auf diesem Konto ausgeführt wird. (Wenn Sie mehr als einen dieser Parameter haben und diese in der Regel als Einheit weitergegeben werden (z. B. Datum, Uhrzeit und Zeitzone), ist es auch ratsam, sie in einem Hilfsobjekt zu bündeln, um die Anzahl der Parameter beizubehalten Nieder.)


14

Lassen Sie mich Sie falsch zitieren, um meinen Standpunkt klar zu machen:

Ich schreibe mehrere Funktionen, die andere Funktionen aufrufen. Um die Informationen weiterzugeben, habe ich zwei Möglichkeiten:

  1. Übergeben Sie die Informationen als Argumente.
  2. Verwenden Sie globale Variablen.

Wann sollte ich eine Option der anderen vorziehen?

Es ist allgemein anerkannt, dass ein nicht lokaler Staat eine schlechte Idee ist. Sie sollten die Informationen daher im Allgemeinen mithilfe von Parametern übergeben, nicht über Variablen in einem gemeinsamen Bereich. Dies wird einfacher, wenn Sie verwandte Informationen zu Objekten oder Strukturen zusammenfassen.

Das Übergeben zu vieler Parameter ist ein Codegeruch, und es kann wahrscheinlich überarbeitet werden, um einige weitere Klassen zu verwenden. Nehmen Sie einen pathologischen Fall an, in dem Sie ein Adressbuch schreiben und eine Methode haben add_contact(surname, firstname, fullname, ...). Es wäre besser, dies in eine NameKlasse zu gruppieren , ebenfalls für Teile einer Adresse : add_contact(name, address).

Wenn jedoch die für Ihre Funktion erforderlichen Parameter völlig unabhängig sind, versucht Ihre Methode möglicherweise zu viel und sollte in kleinere Teile umgestaltet werden.

Ich denke nicht, dass die Verwendung von Instanzvariablen eine gute Lösung ist: Sie ist eine unnötige Mutation des Zustands und bringt alle Probleme globaler Variablen in kleinerem Maßstab mit sich. Auf diese Weise liegt nicht debuggbarer Spaghetti-Code.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.