Combinazione di getter e setter


16

Le librerie JavaScript come jQuery, ad esempio, combinano "getter" e "setter" nell'interfaccia di programmazione:

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

imposterà il colore o

 $('element').css();

otterrà il CSS per un elemento.

Esiste un nome per tale modello ed è una buona pratica da utilizzare nelle applicazioni?

Risposte:


12

Martin Fowler lo ha recentemente nominato Getter e setter sovraccaricati in questo articolo :

Recentemente ho cercato in Javascript e una cosa che mi ha colpito è l'abitudine di usare lo stesso nome di funzione per un getter e un setter. Quindi, se vuoi scoprire l'altezza del tuo banner in jQuery, utilizzeresti $("#banner").height()e se vuoi cambiare l'altezza che useresti $("#banner").height(100).

Questa convenzione mi è familiare, poiché è stata utilizzata da Smalltalk. È possibile ottenere un valore con banner heighte modificarlo con banner height: 100. Sapere che era una convenzione di piccole dimensioni è sufficiente aspettarsi che mi piaccia, dal momento che ho un amore lontano ma costante per quella lingua. Ma anche le cose migliori hanno dei difetti e non posso nascondere la mia antipatia per questo stile di programmazione ...

Nonostante questa preferenza, devi seguire le convenzioni della lingua con cui hai a che fare. Se scrivessi di nuovo Smalltalk, lo userei comunque height:100per mantenere la coerenza con le convenzioni della lingua. Javascript, tuttavia, non è noto per avere convenzioni forti, quindi qui preferirei evitare questa convenzione, anche se viene utilizzata da jQuery ...


1
Mentre in genere sono d'accordo con la maggior parte di ciò che dice Fowler, non sono d'accordo con la sua antipatia per questo. Il suo ragionamento è che JavaScript non ha convenzioni forti come Smalltalk, il che lo rende utilizzabile lì. Tuttavia, jQuery ha convenzioni forti e JavaScript non è jQuery. jQuery è un framework.
CaffGeek,

@Chad, non sono d'accordo con la tua lettura. La sua tesi è che manca di esplicitazione e coerenza. Dice che lo usa in Smalltalk perché la coerenza con altri ha la meglio sulle sue preoccupazioni. Non sta sostenendo che le convenzioni di Smalltalk in qualche modo mitigano o eliminano il problema.
Winston Ewert,

2

Si chiama "metodo di sovraccarico" in linguaggi OO o "sovraccarico di funzioni" in linguaggi non OO.

Che sia o meno una buona pratica è un argomento di dibattito tanto quanto getter / setter contro membri pubblici. Quelli del lato pro e contro probabilmente si tagliano i denti sulle lingue che hanno questa caratteristica o no e sono impostate sulla loro strada. Lo uso e mi piace la pratica per una serie di motivi:

  • Il contesto in cui viene usato abbastanza bene separa l'uno dall'altro.
  • Prepending geto setal nome del metodo aggiunge verbosità.
  • Se ci sono più getter (ad esempio, uno per inte uno per double), cambiare il tipo nell'LHS di un compito ( int x = foo.bar()vs. double x = foo.bar()) non richiede una modifica del codice ( barAsInteger()vs. barAsDouble()) sul lato destro se la classe fornisce entrambi. Il lato negativo di questo è che a volte può essere difficile sapere esattamente quale metodo viene chiamato semplicemente guardando il codice.

Si chiama anche "sovraccarico di funzioni" in C ++.
DeadMG,

Entrambi i termini si applicano al C ++ perché ha sia metodi che funzioni nude.
Blrfl,

1

Poiché JavaScript non ha proprietà effettive (dove l'impostazione di un valore può effettivamente eseguire il codice), lo scalpiccio è uno che implementa il linguaggio delle proprietà. (Anche se lo chiami qualcos'altro.)

Quindi, nelle lingue che implementano proprietà reali, dovresti invece farlo:

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

Se dovessi usare il modello JavaScript in una lingua che gestisce le proprietà, dovresti fare qualcosa di anormale. Probabilmente non sarebbe una buona idea. Gestisci le proprietà come la lingua deve gestirle, in modo da non confondere le altre persone che lavorano con te.


"dove l'impostazione di un valore può effettivamente eseguire il codice". Questo non è più vero. Fa parte delle specifiche dall'ECMA 5
Demian Brecht,

@Demian: Ma JQuery funziona con browser che non implementano ECMA 5.
John Fisher,

Non ho menzionato nulla sulla compatibilità tra browser, solo che la citazione non è corretta come scritto.
Demian Brecht,

@Demian: il testo "JavaScript non ha proprietà effettive" è corretto se si presume che stia utilizzando le versioni più comunemente disponibili di JavaScript. Dato che stiamo discutendo in un contesto di implementazione di JQuery, l'affermazione sarebbe corretta. Grazie per aver sottolineato che le versioni più recenti di JavaScript hanno proprietà vere, però.
John Fisher,

0

Penso che tu stia cercando properties


Questo è il nome per la funzionalità fornita in C # (e forse altri linguaggi .NET?) Che è simile a questo, ma non è proprio la stessa cosa.
Thomas Owens

Wikipedia è d'accordo però: en.wikipedia.org/wiki/Property_(programming)
thekip

Grazie, in realtà non si potrebbe avere un caso per esempio in cui si imposta o ottenere uno stipendio persone in un'applicazione person.salary('10000')o di person.salary()o simile.
yannis,

1
Non vedo come. "Le proprietà vengono lette e scritte come campi", il che non è vero nell'esempio nel post originale. Qui vengono effettuate chiamate esplicite al metodo. È molto simile, ma non esattamente lo stesso.
Thomas Owens

1
@yannis Questo non è corretto. JavaScript ha una sintassi per le proprietà e non è affatto quello che hai descritto nella domanda originale. Vedi en.wikipedia.org/wiki/Property_(programming)#JavaScript per come implementare e utilizzare le proprietà in JavaScript.
Thomas Owens

0

Sono totalmente contrario a questo per un semplice motivo: una classe, un metodo o una funzione dovrebbero fare solo una cosa - secondo me, e combinare il metodo gettere setterviolerà quella regola. Come risultato:

  1. Il returnvalore della funzione varia in base all'esecuzione del blocco getter o setter . Questo può semplicemente condurti in un incubo di manutenibilità. Il tuo metodo dovrebbe restituire un solo tipo di dati / oggetto in ogni caso - o restituire null, falseo lanciare un exceptionin caso di errore.
  2. Scrivere test di unità sarà più difficile in quanto la funzione è responsabile di due funzionalità totalmente diverse.
  3. Scrivere documentazione per tale metodo o funzione è più difficile per ovvie ragioni.
  4. Non sarà coerente quando saranno necessari più metodi getter - come già menzionato nella Blrflrisposta.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.