Getter und Setter kombinieren


16

JavaScript-Bibliotheken wie jQuery kombinieren 'getters' und 'setters' in der Programmierschnittstelle, zum Beispiel:

 $('element').css({'color','blue'});

stellt die Farbe oder ein

 $('element').css();

wird die CSS für ein Element erhalten.

Gibt es einen Namen für ein solches Muster und ist es eine gute Praxis, es in Anwendungen zu verwenden?

Antworten:


12

Martin Fowler nannte es kürzlich Overloaded Getter und Setter in diesem Artikel :

Ich habe mich in letzter Zeit in Javascript umgesehen und eine Sache, die mir aufgefallen ist, ist die Gewohnheit, für einen Getter und einen Setter denselben Funktionsnamen zu verwenden. Wenn Sie also die Höhe Ihres Banners in jQuery ermitteln möchten, verwenden Sie $("#banner").height()und wenn Sie die Höhe ändern möchten, die Sie verwenden möchten $("#banner").height(100).

Diese Konvention ist mir vertraut, da sie von Smalltalk verwendet wurde. Sie könnten einen Wert mit erhalten banner heightund ihn mit ändern banner height: 100. Zu wissen, dass es sich um eine Smalltalk-Konvention handelt, reicht aus, um zu erwarten, dass es mir gefällt, da ich eine entfernte, aber beständige Liebe für diese Sprache habe. Aber selbst die besten Dinge haben Fehler, und ich kann meine Abneigung gegen diesen Codierungsstil nicht verbergen ...

Trotz dieser Präferenz müssen Sie die Konventionen der Sprache befolgen, mit der Sie sich befassen. Wenn ich wieder Smalltalk schreiben würde, würde ich es trotzdem verwenden, height:100um die Übereinstimmung mit den Konventionen der Sprache zu wahren. JavaScript ist jedoch nicht für strenge Konventionen bekannt. Daher würde ich diese Konvention hier lieber vermeiden, selbst wenn sie von jQuery verwendet wird.


1
Während ich in der Regel mit den meisten Aussagen von Fowler einverstanden bin, stimme ich seiner Abneigung dagegen nicht zu. Er argumentiert, dass JavaScript keine strengen Konventionen wie Smalltalk enthält, sodass es dort verwendet werden kann. JQuery kennt jedoch strenge Konventionen, und JavaScript ist nicht jQuery. jQuery ist ein Framework.
CaffGeek

@Chad, ich muss Ihrer Lektüre nicht zustimmen. Sein Argument ist, dass es ihm an Klarheit und Konsequenz mangelt. Er sagt, er benutze es in Smalltalk, weil die Übereinstimmung mit anderen seine Bedenken übertrifft. Er argumentiert nicht, dass Smalltalks Konventionen das Problem irgendwie mildern oder beseitigen.
Winston Ewert

2

Es heißt "Methodenüberladung" in OO-Sprachen oder "Funktionsüberladung" in Nicht-OO-Sprachen.

Ob es sich um bewährte Verfahren handelt oder nicht, ist ein Thema, über das fast genauso viele Debatten geführt werden wie über Getters / Setters im Vergleich zu öffentlichen Mitgliedern. Diejenigen, die Pro und Contra sind, haben sich wahrscheinlich bei Sprachen, die diese Funktion hatten oder nicht hatten und auf ihre Art und Weise eingestellt sind, die Zähne geschnitten. Ich benutze es und mag die Praxis aus einer Reihe von Gründen:

  • Der Kontext, in dem es verwendet wird, trennt sich ziemlich gut voneinander.
  • Das Voranstellen von getoder setan den Methodennamen fügt Ausführlichkeit hinzu.
  • Wenn es mehrere Getter gibt (z. B. einen für intund einen für double), ist für das Ändern des Typs in der LHS einer Zuweisung ( int x = foo.bar()vs. double x = foo.bar()) keine Codeänderung ( barAsInteger()vs. barAsDouble()) auf der rechten Seite erforderlich, wenn die Klasse beide bereitstellt. Der Nachteil dabei ist, dass es manchmal schwierig sein kann, genau zu wissen, welche Methode aufgerufen wird, wenn man sich den Code ansieht.

Es wird in C ++ auch als "Funktionsüberladung" bezeichnet.
DeadMG

Beide Begriffe gelten für C ++, da es sowohl Methoden als auch nackte Funktionen enthält.
Blrfl

1

Da JavaScript keine tatsächlichen Eigenschaften hat (bei denen das Festlegen eines Werts tatsächlich Code ausführen kann), implementiert das Muster die Eigenschafts-IDiom. (Auch wenn du es etwas anderes nennst.)

In Sprachen, die echte Eigenschaften implementieren, würden Sie dies stattdessen tun:

element.css = ...
x = element.css

Wenn Sie das JavaScript-Muster in einer Sprache verwenden würden, die Eigenschaften behandelt, würden Sie etwas Ungewöhnliches tun. Das wäre wahrscheinlich keine gute Idee. Behandeln Sie Eigenschaften so, wie die Sprache sie behandeln soll, damit Sie die anderen Personen, die mit Ihnen arbeiten, nicht verwirren.


msgstr "wo das Setzen eines Wertes tatsächlich Code ausführen kann". Das stimmt eigentlich nicht mehr. Es ist Teil der Spezifikation seit ECMA 5
Demian Brecht

@Demian: JQuery funktioniert jedoch in Browsern, die ECMA 5 nicht implementieren.
John Fisher,

Ich habe nichts über die Cross-Browser-Kompatibilität erwähnt, nur dass das Zitat wie geschrieben falsch ist.
Demian Brecht

@Demian: Der Text "JavaScript hat keine aktuellen Eigenschaften" ist korrekt, wenn Sie davon ausgehen, dass die am häufigsten verfügbaren Versionen von JavaScript verwendet werden. Da wir im Kontext der JQuery-Implementierung diskutieren, wäre die Aussage korrekt. Vielen Dank, dass Sie darauf hingewiesen haben, dass neuere Versionen von JavaScript echte Eigenschaften haben.
John Fisher

0

Ich glaube, du suchst properties


Das ist der Name für die Funktionalität in C # (und vielleicht in anderen .NET-Sprachen?), Die dem ähnlich ist, aber nicht wirklich dasselbe ist.
Thomas Owens


Danke, nicht wirklich möglicherweise einen Fall sagen, wo Sie setzten oder Personen Gehalt in einer Anwendung erhalten person.salary('10000')oder person.salary()oder ähnlichem.
Yannis

1
Ich verstehe nicht wie. "Eigenschaften werden wie Felder gelesen und geschrieben", was im Beispiel des ursprünglichen Beitrags nicht zutrifft. Dort werden explizite Methodenaufrufe durchgeführt. Es ist sehr ähnlich, aber nicht genau das gleiche.
Thomas Owens

1
@yannis Das ist nicht richtig. JavaScript hat eine Syntax für Eigenschaften, und es ist überhaupt nicht das, was Sie in der ursprünglichen Frage beschrieben haben. Informationen zum Implementieren und Verwenden von Eigenschaften in JavaScript finden Sie unter en.wikipedia.org/wiki/Property_(programming)#JavaScript .
Thomas Owens

0

Ich bin aus einem einfachen Grund total dagegen: Eine Klasse, Methode oder Funktion sollte nur eines tun - meiner Meinung nach verstößt die Kombination von getterund settergegen diese Regel. Als Ergebnis:

  1. Der returnWert der Funktion hängt davon ab, ob der Getter- oder Setter- Block ausgeführt wird. Dieser kann Sie einfach in einen Alptraum der Wartbarkeit führen. Ihre Methode sollte nur eine Art von Daten / Objekt in jedem Fall zurückkehren - oder Rückkehr null, falseoder wirft eine exceptionim Fehlerfall.
  2. Das Schreiben von Unit-Tests wird schwieriger, da die Funktion für zwei völlig unterschiedliche Funktionen verantwortlich ist.
  3. Das Schreiben von Dokumentation für eine solche Methode oder Funktion ist aus offensichtlichen Gründen schwieriger.
  4. Es wird nicht konsistent sein, wenn mehrere Getter- Methoden benötigt werden - wie bereits in der BlrflAntwort erwähnt.
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.