Ich schreibe mehrere Methoden, die andere Methoden aufrufen.
Um die Informationen weiterzugeben, habe ich mehrere Möglichkeiten:
Übergeben Sie die Informationen als Parameter
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?
object-oriented
ruby
parameters
Michael Durrant
quelle
quelle
Antworten:
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.)
quelle
Lassen Sie mich Sie falsch zitieren, um meinen Standpunkt klar zu machen:
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 eineName
Klasse 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.
quelle