Quali sono i vantaggi di un metodo "combinato" Getter / setter VS individuale?

12

Questo è ciò che chiamo un metodo getter / setter "combinato" (da 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")

Questa è la stessa logica con metodi separati (teorici):

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

La mia domanda:

Durante la progettazione di una libreria come jQuery, perché dovresti decidere di seguire la prima via e non la seconda? Il secondo approccio non è più chiaro e facile da capire a colpo d'occhio?

    
posta Levi Hackwith 11.01.2013 - 17:03
fonte

4 risposte

13

Puramente speculando qui, ma sarei propenso a credere che gli sviluppatori di jQuery che hanno utilizzato molto stile funzionale nella strutturazione di jQuery abbiano chiaramente una tendenza verso il paradigma funzionale.

Dato che, nel paradigma funzionale esiste una strong cultura di riduzione della ridondanza, e si potrebbe sostenere che il secondo approccio ha ridondanza non necessaria. Il primo approccio potrebbe non essere chiaro a qualcuno abituato a tutti i linguaggi imperativi comuni, ma è indiscutibilmente fare di più con meno avendo un solo metodo invece di due. Questo può essere pericoloso, ma è uno strumento comune nel paradigma funzionale e qualcosa a cui ci si abitua rapidamente.

Esercitati nel paradigma funzionale e affronti rapidamente il desiderio verso la cerimonia e impara ad apprezzare la capacità di fare di più con meno. Sebbene questa sia una scelta soggettiva basata sulla preferenza, allo stesso modo molte persone hanno preferenze riguardo la gestione degli spazi bianchi. In questo modo non sto dicendo che un modo è meglio, piuttosto che sono cose a cui le persone si abituano, il che è probabilmente il motivo per cui jQuery ha l'approccio che fa.

Questo è il motivo per cui credo che gli sviluppatori di jQuery abbiano fatto questo ed è in generale il motivo per cui qualcuno potrebbe adottare questo approccio.

    
risposta data 11.01.2013 - 17:13
fonte
2

Il modulo

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

può implicare un numero di cose. Più comunemente, suggerisce un oggetto foo , con un metodo chiamato text che accetta una stringa, che fa qualcosa . Non c'è alcuna implicazione che questa sia una proprietà.

In molte lingue, questa può essere considerata una forma abbreviata di

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

dove il risultato è scartato. Quindi questo approccio è troppo ambiguo per essere un modo efficace per impostare una proprietà (dal punto di vista della leggibilità del codice).

    
risposta data 11.01.2013 - 17:26
fonte
1

È un po 'speculativo, ma qui è il mio colpo.

jQuery abbraccia pienamente la natura funzionale di javascript. Questo è ciò che lo rende così fantastico, ma può lasciare che molti sviluppatori si grattino la testa quando provengono da un linguaggio puramente OO come java. Sembra rompere tutte le convenzioni e le buone pratiche.

La lingua funzionale tende a porre l'accento su una sintassi dichiarativa. Tende a leggere come una dichiarazione di un fatto piuttosto che come comandi. Esempio

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

che può essere letto come "il cliente idoneo sono i clienti di età superiore ai 30". Per contrasto, la lingua imperativa viene letta come una sequenza di comando

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

Può essere letto come "Verifica di ogni cliente e se la loro età è superiore a 30, aggiungili alla raccolta idonea"

L'aggiunta di un'operazione a set e get farebbe sembrare jQuery una libreria imperativa. Puoi costringere il modo di leggere le seguenti dichiarazioni

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

Tenendo fuori dalle azioni jQuery api il verbo delle azioni, l'hanno fatto sentire come un'API dichiarativa. Dà un tocco coerente e funzionale alla biblioteca. Ecco perché penso che abbiano sovraccaricato le parole chiave.

    
risposta data 11.01.2013 - 17:53
fonte
1

Si comporta in qualche modo più come proprietà , che sono state introdotte solo di recente in JavaScript, e quindi non sono ancora ampiamente usati, specialmente nelle librerie come jQuery che hanno lo scopo di aiutare ad astrarre le incompatibilità del browser.

Se hai mai guardato una definizione di classe piena di tali proprietà, i prefissi "set" e "get" sembrano superflui, perché l'aggiunta del parametro value ti dice già che è un setter. Martin Fowler fa un buon punto sui getter che richiedono un parametro, ma anche allora, all'interno di quel contesto il parametro del valore aggiuntivo indica chiaramente un setter, così come il fatto che un setter appare raramente sul lato destro di un incarico. E quando scrivi scrivi , devi comunque controllare la documentazione per la libreria.

Poiché hai chiesto solo vantaggi, non coprirò gli svantaggi.

    
risposta data 11.01.2013 - 18:02
fonte

Leggi altre domande sui tag