Was sind die Vorteile eines "kombinierten" Getter / Setter im Vergleich zu einzelnen Methoden?

12

Das nenne ich eine "kombinierte" Getter / Setter-Methode (von jQuery):

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

Dies ist die gleiche Logik mit getrennten (theoretischen) Methoden:

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

Meine Frage:

Warum sollten Sie sich beim Entwerfen einer Bibliothek wie jQuery für den ersten Weg und nicht für den zweiten entscheiden? Ist der zweite Ansatz nicht auf einen Blick klarer und verständlicher?

Levi Hackwith
quelle
6
Martin Fowler ist kein Fan dessen, was er "überlastete Getter-Setter" nennt: martinfowler.com/bliki/OverloadedGetterSetter.html
vaughandroid
1
Früher mochte ich die get / set-Aufteilungsmethode (weil ich dachte, sie habe den Code "offensichtlicher" gemacht), aber heute finde ich das überladene get / set-Muster attraktiver. Es kann den Code sauberer machen. Ich fand es nie gut, wenn Mr. Fowler einen Kompromiss einging. Es scheint mir, dass es das Schlimmste von beiden Welten ist.
Brian Knoblauch
Martin Fowlers einziges wirkliches Argument dagegen ist, wenn der Getter ein Argument abgibt. In diesem Fall ist es für den Leser verwirrend, dass es nicht wie ein Getter aussieht. Ab sofort bin ich zu dem Schluss gekommen, dass, wenn Sie sich an die Konvention halten, dass der Getter keine Argumente akzeptiert und der Setter eines, der jQuery / Angular-Ansatz zusammen mit klaren API-Kommentaren in Ordnung sein sollte. Zur Zeit.
Zumalifeguard

Antworten:

13

Hier wird nur spekuliert, aber ich würde gerne glauben, dass die jQuery-Entwickler, die einen Großteil des funktionalen Stils für die Strukturierung von jQuery verwendet haben, eindeutig ein Hang zum funktionalen Paradigma haben.

In Anbetracht dessen, dass es im funktionalen Paradigma eine starke Kultur der Redundanzreduzierung gibt, und es könnte argumentiert werden, dass der zweite Ansatz unnötige Redundanz aufweist. Der erste Ansatz ist für jemanden, der mit allen gängigen imperativen Sprachen vertraut ist, vielleicht nicht klar, aber er führt unbestreitbar zu mehr mit weniger, indem er nur eine Methode anstelle von zwei Methoden verwendet. Das mag gefährlich sein, ist aber ein gängiges Werkzeug im Funktionsparadigma und etwas, an das man sich schnell gewöhnt.

Wenn Sie das Funktionsparadigma üben, werden Sie schnell über den Wunsch nach Zeremonie hinwegkommen und die Fähigkeit zu schätzen lernen, mit weniger mehr zu erreichen. Obwohl dies erkennbar eine subjektive Entscheidung ist, die auf Präferenzen beruht, haben viele Menschen Präferenzen in Bezug auf die Verwaltung von Leerzeichen. Auf diese Weise sage ich nicht, dass ein Weg besser ist, sondern dass es Dinge sind, an die sich die Leute gewöhnen. Deshalb hat jQuery wahrscheinlich den Ansatz, den es hat.

Aus diesem Grund glaube ich, dass die jQuery-Entwickler dies getan haben, und im Allgemeinen ist dies der Grund, warum jemand diesen Ansatz wählen könnte.

Jimmy Hoffa
quelle
2
Einverstanden, und ich würde den Wunsch hinzufügen, die JS-Größe so weit wie möglich zu reduzieren.
Matt S
-1 für die imperativen / wortreichen und funktionalen / impliziten Punkte.
3
@MattFenwick Ich möchte nicht beleidigen. Wollen Sie damit sagen, dass es nicht stimmt, dass das funktionale Paradigma implizit ist, während das imperative Paradigma explizit ist? Ich sage nicht, dass beides besser ist, nur, dass man sich an das eine oder andere gewöhnen kann, was dazu führen würde, dass Sie die Dinge automatisch auf diese Weise im Gegensatz zum anderen erledigen (dies gilt für beide Richtungen gleichermaßen)
Jimmy Hoffa
@ Jimmy kein Problem; Mein Punkt war nur, dass ich in meiner Erfahrung implizite / explizite Aussagen als orthogonal zu FP / imperativ befunden habe.
@MattFenwick könnte das sein, aber ich würde sagen, abgesehen von der Typinferenz, die eine Menge impliziter Aussagen zulässt und die für das HM-Typsystem typisch ist, tendieren andere Dinge, die für FP-Sprachen typisch sind, ebenso zur impliziten Aussage wie alle Operatoren als Funktionen, bei denen die Die Funktion hat keinen expliziten Namen, nur ein Symbol, das Sie implizit lernen und kennen müssen, oder die übliche Verwendung von Listen oder Tupeln, die implizite Kenntnisse über die Bedeutung und den Ort der Mitglieder erfordern, anstelle von DUs (denken Sie daran, wie die Autoren-Monade funktioniert). Ich sehe auch eine Gemeinsamkeit von Parameternamen mit einem Buchstaben, aber Sie haben vielleicht Recht
Jimmy Hoffa
2

Die Form

foo.text("This is a new value"); 

kann eine Reihe von Dingen implizieren. Am häufigsten wird ein fooObjekt vorgeschlagen, das mit einer Methode namens textAkzeptieren einer Zeichenfolge etwas bewirkt . Es gibt keine Implikation, dass dies überhaupt eine Eigenschaft ist.

In vielen Sprachen kann dies als abgekürzte Form von betrachtet werden

var result = foo.text("This is a new value"); 

wo das Ergebnis verworfen wird. Daher ist dieser Ansatz zu mehrdeutig, um eine Eigenschaft effektiv festzulegen (aus Sicht der Codelesbarkeit).

Robert Harvey
quelle
Das ist ein ausgezeichneter Punkt! Ich setzte meine FP-Brille auf, wenn ich Javascript las und die Dinge anders aussahen, also habe ich nicht einmal darüber nachgedacht, aber wenn ich Code wie diesen in C # sehen würde, hätte ich genau die Reaktion, auf die Sie sich beziehen: "Wth tut diese Methode? ?? ".
Jimmy Hoffa
1

Es ist ein bisschen spekulativ, aber hier ist mein Schuss drauf.

jQuery unterstützt die Funktionalität von Javascript. Das ist es, was es so großartig macht, aber es kann eine Menge Entwickler am Kopf kratzen lassen, wenn sie aus einer reineren OO-Sprache wie Java stammen. Es scheint gegen alle Konventionen und bewährten Praktiken zu verstoßen.

Funktionale Sprache tendiert dazu, den Schwerpunkt auf eine deklarative Syntax zu legen. Es liest sich eher wie eine Feststellung einer Tatsache als wie ein Befehl. Beispiel

var eligible = customers.where(c => c.age > 30);

was als "der berechtigte Kunde sind die Kunden, die über 30 Jahre alt sind" gelesen werden kann. Demgegenüber liest sich die imperative Sprache wie eine Befehlsfolge

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

Das kann gelesen werden als "Überprüfen Sie jeden Kunden, und wenn ihr Alter über 30 ist, fügen Sie sie der berechtigten Sammlung hinzu"

Durch Hinzufügen von aa setund einer getOperation würde sich jQuery wie eine imperative Bibliothek anfühlen. Sie können das Lesen der folgenden Anweisungen einschränken

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

Indem sie das Verb "actions" aus der jQuery-API heraushalten, fühlen sie sich wie eine deklarative API an. Es gibt der Bibliothek ein einheitliches, funktionales Gefühl. Deshalb haben sie meiner Meinung nach die Keywords überladen.

Laurent Bourgault-Roy
quelle
1

Dadurch verhält es sich eher wie Eigenschaften , die erst kürzlich in JavaScript eingeführt wurden und daher noch nicht häufig verwendet werden, insbesondere in Bibliotheken wie jQuery, die dazu beitragen sollen, Browser-Inkompatibilitäten zu beseitigen.

Wenn Sie sich jemals eine Klassendefinition mit solchen Eigenschaften angesehen haben, erscheinen die Präfixe "set" und "get" überflüssig, da Sie durch Hinzufügen des value-Parameters bereits wissen, dass es sich um einen Setter handelt. Martin Fowler macht eine gute Aussage zu Gettern, die einen Parameter erfordern, aber selbst dann kennzeichnet der zusätzliche Werteparameter in diesem Kontext eindeutig einen Setter sowie die Tatsache, dass ein Setter selten auf der rechten Seite einer Zuweisung erscheint. Und wenn Sie Code schreiben , müssen Sie sich sowieso die Dokumentation der Bibliothek ansehen.

Da Sie nur nach Vorteilen gefragt haben, werde ich die Nachteile nicht abdecken.

Karl Bielefeldt
quelle