In che ordine definire getter e setter? [chiuso]

12

Esiste una best practice per l'ordine di definire getter e setter? Sembra che ci siano due pratiche:

  • coppie getter / setter
  • primi getters, quindi setter (o viceversa)

Per illuminare la differenza ecco un esempio Java di coppie getter / setter:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Ed ecco un esempio Java di primi getters, quindi setter:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Penso che l'ultimo tipo di ordinamento sia più chiaro sia nel codice che nei diagrammi di classe, ma non so se sia sufficiente per escludere l'altro tipo di ordinamento.

    
posta N.N. 09.10.2012 - 15:04
fonte

6 risposte

7

Il primo modo. Se è possibile raggruppare o restare sempre vicini alle funzioni correlate che operano sugli stessi membri.

Se disponi il tuo codice in questo modo lo rende più chiaro e più facile da refactoring, poiché se una classe può essere fattorizzata da un'altra che sta facendo troppo, il pezzo fattorizzabile ruota solitamente intorno a una specifica variabile membro.

In generale è più facile eseguire il debug, comprendere e manipolare il codice quando è possibile visualizzare tutti sulla stessa pagina l'intero ciclo di vita di un oggetto / variabile. Direi che il layout del codice basato principalmente su superfici come l'ambito e l'ordine alfabetico significano in realtà perdere opportunità di refactoring perché non puoi vederli.

    
risposta data 09.10.2012 - 17:01
fonte
25

Se sei in una squadra, fai ciò che di solito fanno. Altrimenti scegli quello che ti piace di più. Sulla scala di importanti scelte progettuali questo probabilmente è da qualche parte vicino a "quale pollice dovrei usare per colpire la barra spaziatrice?"

    
risposta data 09.10.2012 - 15:13
fonte
6

Può anche dipendere dalla lingua. In Java non c'è alcun vantaggio reale per entrambi gli ordini, ma in C #, ad esempio, si ha il concetto di "proprietà", che raggruppa il getter e il setter insieme, in modo tale da imporre l'ordinamento. In un linguaggio come il C ++, dove si potrebbe desiderare una visibilità diversa sui getter e setter (ad esempio, setter privato, getter pubblico), probabilmente si farebbe l'opposto, poiché il modificatore di visibilità viene dato una volta per più metodi, piuttosto che singolarmente per ogni .

    
risposta data 09.10.2012 - 16:29
fonte
4

Per quanto ne so, non esiste una singola convenzione. La sezione Oracle Convenzioni sui codici Java sull'organizzazione dei file non menziona esplicitamente il posizionamento di getter e setter, ma dice:

These methods should be grouped by functionality rather than by scope or accessibility.

Questo non fornisce alcuna indicazione - potrei sostenere che entrambi i posizionamenti soddisfano questi criteri.

Qualcosa da considerare è che gli IDE moderni ti permettono di avere più viste astratte della struttura dei tuoi file che come componente del codice testuale. Questo, insieme a potenti strumenti di ricerca, dovrebbe facilitare la navigazione dei file e trovare i metodi appropriati anche all'interno di file di grandi dimensioni.

Ad esempio, Eclipse fornisce una vista Struttura che consente di ordinare e filtrare metodi e campi in modi diversi e di navigare direttamente nel punto in cui si trovano nei file. NetBeans aveva funzionalità simili e sospetto che la maggior parte degli altri IDE facciano altrettanto.

L'unica volta che ciò potrebbe avere importanza è se stai leggendo il codice al di fuori del tuo IDE. Un esempio potrebbe essere l'utilizzo di uno strumento di revisione del codice esterno o la visualizzazione di delta dal proprio sistema di controllo della versione.

La soluzione migliore sarebbe semplicemente la coerenza tra i file in un progetto. Trova uno standard, documentalo e rispettalo.

    
risposta data 09.10.2012 - 15:17
fonte
1

Raggruppa il getter e il setter per un singolo campo insieme, a coppie.

Il raggruppamento di tutti i getter e di tutti i setter rende difficile stabilire quali campi hanno solo getter o solo setter.

Quando leggo il codice o cerco funzionalità specifiche, immagino che una classe abbia campi, con ogni campo che ha un getter e un setter. Non ha senso per me che una classe abbia un gruppo getter e un gruppo setter, ciascuno con campi.

    
risposta data 09.10.2012 - 17:11
fonte
0

IDE Ever Java può generare getter e setter per te. Basta usare quella funzionalità e lasciare l'ordine di quei metodi come l'IDE creato. Questo è il codice generato, non toccarlo inutilmente.

    
risposta data 09.10.2012 - 15:28
fonte

Leggi altre domande sui tag