Quels sont les avantages d'une méthode «combinée» Getter / Setter VS individuelle?


12

C'est ce que j'appelle une méthode getter / setter "combinée" (de 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")

C'est la même logique avec des méthodes (théoriques) distinctes:

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")

Ma question:

Lors de la conception d'une bibliothèque comme jQuery, pourquoi décideriez-vous de suivre la première voie et non la seconde? La deuxième approche n'est-elle pas plus claire et plus facile à comprendre en un coup d'œil?


6
Martin Fowler n'est pas un fan de ce qu'il appelle des "setters getter surchargés": martinfowler.com/bliki/OverloadedGetterSetter.html
vaughandroid

1
J'aimais la méthode de séparation get / set (pensant que cela rendait le code plus "évident"), mais je trouve le modèle getter / setter surchargé plus attrayant de nos jours. Cela peut rendre le code plus propre. Je ne me suis jamais retrouvé à aimer le compromis de M. Fowler. Il me semble que c'est le pire des deux mondes.
Brian Knoblauch

Le seul véritable argument de Martin Fowler contre cela est lorsque le «getter» passe un argument, auquel cas cela prête à confusion pour le lecteur en ce qu'il ne ressemble pas à un getter. Pour l'instant, j'ai conclu que si vous respectez la convention selon laquelle le getter ne prend aucun argument, et le setter en prend un, cela, avec des commentaires API clairs, l'approche jQuery / Angular devrait être très bien. Pour l'instant.
zumalifeguard

Réponses:


13

Purement spéculant ici, mais je serais porté à croire que les développeurs de jQuery qui ont utilisé beaucoup de style fonctionnel pour structurer jQuery ont clairement un penchant vers le paradigme fonctionnel.

Étant donné que, dans le paradigme fonctionnel, il existe une forte culture de réduction de la redondance, et on pourrait soutenir que la deuxième approche a une redondance inutile. La première approche peut ne pas être claire pour une personne habituée à tous les langages impératifs communs, mais elle fait incontestablement plus avec moins en n'ayant qu'une seule méthode au lieu de deux. Cela peut être dangereux, mais c'est un outil courant dans le paradigme fonctionnel et quelque chose auquel on s'habitue rapidement.

Pratiquez dans le paradigme fonctionnel et vous surmontez rapidement ce désir de cérémonie et apprenez à apprécier la capacité de faire plus avec moins. Bien que ce soit évidemment un choix subjectif basé sur la préférence de la même manière que beaucoup de gens ont des préférences concernant la gestion des espaces blancs. De cette façon, je ne dis pas qu'une façon est meilleure, mais plutôt que ce sont des choses auxquelles les gens s'habituent, ce qui explique probablement pourquoi jQuery a l'approche qu'il utilise.

Ce serait la raison pour laquelle je pense que les développeurs de jQuery l'ont fait et c'est généralement pourquoi quelqu'un pourrait adopter cette approche.


2
D'accord, et j'ajouterais le désir de réduire la taille de JS autant que possible.
Matt S

-1 pour les points impératifs / verbeux et fonctionnels / implicites.

3
@MattFenwick Je ne veux pas offenser, êtes-vous en train de dire qu'il est faux que le paradigme fonctionnel ait un penchant vers l'implicitation alors que le paradigme impératif a un penchant vers l'explicitation? Je ne dis pas non plus que c'est mieux, juste que l'un peut s'habituer à l'un ou à l'autre ce qui vous amènerait à faire automatiquement les choses de cette manière par opposition à l'autre (cela vaut pour les deux manières également)
Jimmy Hoffa

@Jimmy aucun problème; mon point était juste que dans mon expérience, j'ai trouvé implicitness / explicitness orthogonal à FP / impératif.

@MattFenwick pourrait l'être, mais je dirais qu'en dehors de l'inférence de type qui permet beaucoup d'implicitation et est commune au système de type HM, d'autres choses communes aux langages FP se tournent vers l'implicitation ainsi que tous les opérateurs en tant que fonctions où le La fonction n'a pas de nom explicite, juste un symbole que vous êtes censé apprendre et connaître implicitement, ou l'utilisation courante de listes ou de tuples nécessitant une connaissance implicite de la signification et de l'emplacement des membres au lieu des DU (pensez au fonctionnement de la monade de l'écrivain). J'ai également tendance à voir une communauté de noms de paramètres à une seule lettre, mais vous avez peut-être raison
Jimmy Hoffa

2

La forme

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

peut impliquer un certain nombre de choses. Le plus souvent, il suggère un fooobjet, avec une méthode appelée textaccepter une chaîne, qui fait quelque chose . Il n'y a aucune implication que c'est une propriété du tout.

Dans de nombreuses langues, cela peut être considéré comme une forme abrégée de

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

où le résultat est rejeté. Cette approche est donc trop ambiguë pour être un moyen efficace de définir une propriété (du point de vue de la lisibilité du code).


C'est un excellent point! Je mets mes lunettes FP lorsque je lis le javascript et les choses se présentent différemment, donc je n'y ai même pas pensé, mais si je voyais un code comme celui-ci en C #, j'aurais exactement la réaction à laquelle vous vous référez. ?? ".
Jimmy Hoffa

1

C'est un peu spéculatif, mais voici ma chance.

jQuery embrasse pleinement la nature fonctionnelle de javascript. C'est ce qui le rend si génial, mais cela peut laisser beaucoup de développeurs se gratter la tête lorsqu'ils viennent d'un langage plus purement OO tel que java. Il semble rompre toutes les conventions et bonnes pratiques.

Le langage fonctionnel a tendance à mettre l'accent sur une syntaxe déclarative. Il a tendance à se lire comme l'énoncé d'un fait plutôt que comme des commandes. Exemple

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

qui peut être lu comme "le client éligible est celui dont l'âge est supérieur à 30 ans". Par contraste, le langage impératif se lit comme une séquence de commandes

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

Cela peut être lu comme "Vérifiez chaque client, et si son âge est supérieur à 30 ans, ajoutez-le à la collection éligible"

L'ajout de aa setet d'une getopération donnerait à jQuery l'impression d'être une bibliothèque impérative. Vous pouvez comparer la façon de lire les déclarations suivantes

// 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();

En gardant le verbe d'actions hors de l'API jQuery, ils l'ont fait ressembler à une API déclarative. Il donne une sensation cohérente et fonctionnelle à la bibliothèque. C'est pourquoi je pense qu'ils ont surchargé les mots clés.


1

Cela le fait se comporter un peu plus comme des propriétés , qui n'ont été introduites que récemment dans JavaScript, et ne sont donc pas encore largement utilisées, en particulier dans les bibliothèques comme jQuery qui sont destinées à aider à éliminer les incompatibilités du navigateur.

Si vous avez déjà regardé une définition de classe remplie de telles propriétés, les préfixes "set" et "get" semblent superflus, car l'ajout du paramètre value vous indique déjà qu'il s'agit d'un setter. Martin Fowler fait un bon point sur les getters qui nécessitent un paramètre, mais même dans ce contexte, le paramètre de valeur supplémentaire désigne clairement un setter, ainsi que le fait qu'un setter apparaît rarement sur le côté droit d'une affectation. Et quand vous écrivez du code, vous devez quand même consulter la documentation de la bibliothèque.

Puisque vous n'avez demandé que des avantages, je ne couvrirai pas les inconvénients.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.