Domanda

Questo fa scalpore qualcun altro là fuori? Preferirei di gran lunga vedere:

 block.key(newKey);  // set the key for this block

e

 testKey = block.key();  // look up the key for this block

di

 block.setKey(newKey); // set the key for this block
 testKey = block.getKey(); // look up the key for this block

Innanzitutto, il " set " e " ottieni " sono ridondanti (e quindi aggiungono rumore riducendo la leggibilità). L'azione (set / get) è definita dalla sintassi di ogni istruzione. Capisco il sovraccarico. In effetti, l'utilizzo dello stesso identificatore esatto rafforza che si tratta della stessa proprietà dell'oggetto. Quando leggo " getKey () " e " setKey () " Potrei non essere così sicuro.

In secondo luogo, se " ottieni " e "impostare" devono essere interpretati rigorosamente come setter e getter, quindi se altri semantici associati all'impostazione / acquisizione di un valore, ad esempio gli effetti collaterali, saranno sorprendenti.

Suppongo che questo pregiudizio provenga dal mio background di Smalltalk, ma in un mondo in cui il polimorfismo funziona bene, non staremmo meglio senza il "get" e "impostare" spruzzato dappertutto? Basti pensare a quanto più codice potremmo digitare se non dovessimo digitare più e più volte quelle tre lettere ?! (lingua un po 'sulla guancia)

Qualcuno là fuori la pensa allo stesso modo?

È stato utile?

Soluzione

Prefisso degli accessori con " get " e mutatori con " set " è una pratica che varia da una lingua all'altra e sembra essere prevalentemente diffusa in Java. Ad esempio:

  • In Python hai il concetto di proprietà, quindi un accessor potrebbe apparire come obj.foo e un mutatore potrebbe apparire come obj.foo = bar (anche sebbene i metodi siano chiamati dietro le quinte). Concetti simili esistono in lingue come Ruby. Pertanto, in molte lingue, le chiamate agli accessori e ai mutatori sembrano "chiamate" dirette. per istanze di variabili e non vedi mai niente come " setFoo " o " getFoo " ;.
  • Lingue come Objective-C scoraggiano la pratica del prefisso degli accessori con " get " ;, quindi in Objective-C vedresti chiamate come [obj foo] e [obj setFoo :. bar]

Non mi è mai piaciuta la pratica del prefisso degli accessori in Java con " get " ;, ma vedo il merito nel prefisso dei mutatori con " set " ;. Detto questo, poiché la pratica prevalente consiste nel prefisso "ottenere" / "impostare". in Java, continuo la tendenza nel mio codice.

Altri suggerimenti

Apparentemente i progettisti di C # sono d'accordo, e il tag 'C #' supera di gran lunga il prossimo linguaggio più popolare di 2: 1 su StackOverflow. Quindi sospetto che tu stia predicando al coro.

Diverse lingue hanno modi diversi di gestire getter e setter. In Java hai getName e setName, in Qt hai name e setName. Preferisco il modo Java per questi motivi:

  1. Cosa succede se si dispone di una funzione chiamata drive? Fa guidare la tua classe o imposta / ottiene un'unità?
  2. Con i suggerimenti attivati, puoi digitare get, quindi ottenere tutti i getter. Questo è molto utile se non ricordi il nome di un getter che ti serve.
  3. Partendo dal motivo uno, separa le funzioni in diversi gruppi. Hai le funzioni che fanno qualcosa, non iniziano con get o set (anche se forse dovrebbero iniziare con do?). Quindi hai le funzioni che ottengono una proprietà e iniziano tutte con get. Quindi hai le funzioni che impostano una proprietà e iniziano tutte con set.

Per me, i prefissi get e set mi fanno lavorare meno cervello durante la lettura del codice. Se usati in modo coerente, i metodi get / set semplificano il grep di un'intestazione, probabilmente rendendo la classe più facile da imparare & amp; uso. Trascorro una quantità sproporzionata di tempo a leggere il codice rispetto a scrivere il codice, quindi i caratteri extra per get e set vanno bene per me.

Il linguaggio Java al momento non ha proprietà, quindi la sintassi getter / setter è diventata lo standard di fatto. Se stai scrivendo il codice Java, sarai ben servito per usare la convenzione Java. Questo non è solo così altri programmatori possono leggere il tuo codice, ma soprattutto centinaia di altri framework Java sono costruiti per gestire oggetti che supportano Java Bean getter / setter di stile.

Ad esempio, nel motore di templating di velocità , potresti scrivere qualcosa del tipo:

The answer is $block.key

Quanto sopra tenterà di invocare:

block.getkey();
block.getKey();

Se hai definito block.getKey (), allora tutto funzionerà bene. Generalmente è meglio seguire le convenzioni della lingua.

In generale i nomi delle proprietà dovrebbero essere nomi mentre i nomi dei metodi dovrebbero essere verbi, quindi la proprietà nell'esempio sopra sarebbe chiamata 'driver' e il metodo sarebbe 'drive'. Naturalmente ci saranno casi in cui vi è sovrapposizione, ma in generale funziona e rende il codice più leggibile.

In C ++ uso solo il sovraccarico

int parameter() const { return m_param }
void parameter(int param) { m_param = param; }

Sì, get / set in java è essenzialmente una soluzione alternativa un problema nella lingua.

Confrontandolo con le proprietà c #

http://www.csharp-station.com/Tutorials/Lesson10.aspx

O pitone http: //blog.fedecarg .com / 2008/08/17 / non-bisogno-di-setget-metodi-in-python /

Penso che questo sia uno dei maggiori fallimenti di Java.

Getter e setter C # sono "di prima classe" entità e non assomigliano sinteticamente a chiamate di funzione (sebbene qualsiasi codice arbitrario possa essere eseguito nel contesto di un accessor).

Uso solo get / set in lingue che mi costringono a, come Objective-C.

Puoi facilmente cercare nella tua base di codice i riferimenti a getDrive () o setDrive () . Se il tuo metodo si chiama semplicemente "drive", otterrai molti più falsi positivi durante la ricerca.

Ascolta, ascolta.

Mi piace molto la notazione speciale per getter e setter. CLU ha fatto questo meglio:

  • L'uso di p.x in un'espressione era equivalente alla chiamata get_x(p).

  • L'uso di p.x: = e (assegnazione) equivaleva alla chiamata set_x (p, e) .

Se l'interfaccia per l'oggetto p non ha esportato get_x o set_x , ti è stato impedito di eseguire l'operazione corrispondente. Semplice.

Sentiamolo per lo zucchero sintattico!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top