In Java, gli helper privati ​​dovrebbero andare al di sopra o al di sotto dei metodi pubblici? [chiuso]


24

Ho notato che un collega e io abbiamo pratiche opposte riguardo all'ordinamento dei metodi nelle nostre classi Java. Uno di noi inizia una lezione con i suoi principali metodi pubblici, e successivamente inserisce tutti gli aiutanti privati. L'altro si assicura che i metodi pubblici siano alla fine.

Chiaramente, questo è solo un problema di stile e non esiste una risposta giusta. Tuttavia, prima di decidere che questa faccenda è solo un'altra battaglia tra Yook e Zook e scegliere l'una o l'altra arbitrariamente, mi chiedevo se forse ci fosse una raccomandazione standard su una guida di stile Java o qualche motivo pratico per cui un approccio è migliore dell'altro.


13
Non importa Lanciare una moneta. Sceglierne uno. Insisti.


@KilianFoth - Questa domanda è stata posta 3 mesi prima e ha più risposte. Ciò non renderebbe la domanda in questione un duplicato di questa domanda?
Brandon Yarbrough,

Risposte:


25

Mentre si tratta di preferenza normalmente, dovresti certamente provare ad aderire a uno standard comune all'interno della tua organizzazione. Quindi, qualunque cosa tu decida, scegli uno standard e adottalo universalmente.

Per quanto riguarda quale scegliere, se dovessi seguire i suggerimenti offerti in Clean Code , saresti in grado di leggere il file dall'alto verso il basso come un articolo di giornale, il che suggerirebbe naturalmente che i metodi di aiuto compaiono dopo i metodi che sono aiutando. Ciò porterebbe alla massima leggibilità della struttura del codice. Quindi se dovessi avere

public void doSomething()
{
     helpMe();
     helpMeAgain();
}

Il tuo file sarebbe strutturato come

public void doSomething() { }
private void helpMe() { }
private void helpMeAgain() { }

Un altro effetto collaterale di questo è che scopri che i tuoi aiutanti hanno i loro aiutanti, e ti aiuta a capire che cosa hai veramente è un'altra classe che vive nel tuo file, e puoi refactificare in modo chiaro per estrarlo nella sua stessa classe poiché quei metodi sono già raggruppati in ordine. Ma questo è un vantaggio secondario.


Sono contento che tu l'abbia detto altrimenti avrei fatto. Ho chiesto a Bob Martin stesso come ordina le cose se 2 metodi usano ciascuno un terzo metodo. In quel caso mette il terzo sotto gli altri due.
Daniel Kaplan,

1
Il tuo esempio non lo mostra, ma questo porta a metodi pubblici mescolati tra i metodi privati. Uso questa tecnica, ma spesso mi sento strappato e voglio migliorare tutti i metodi pubblici, perché c'è anche molto da dire per leggere facilmente l'interfaccia pubblica.
Sean,

@Sean, beh, in genere cerco di limitare l'API pubblica della mia classe, o di lasciarla come facciata, se del caso, ma poi spingere gli aiutanti dell'implementazione in collaboratori. Test, refactor, estratto, ripetizione. Ma ovviamente dipende da quanto lontano vuoi andare. Preferisco le mie lezioni piccole.
Anthony Pegram,

11

I metodi pubblici sono l'interfaccia della classe. Qualcuno interessato ad usare la tua classe si preoccuperà solo dell'interfaccia. Dal punto di vista di un utente di classe, sarebbe utile disporre prima dei metodi pubblici per ridurre lo scorrimento.


5

In C e C ++, i metodi helper sono spesso messi al primo posto perché non è necessaria una dichiarazione. Molte persone hanno portato questa abitudine in altre lingue dove non importa.

Preferisco i metodi pubblici in cima perché di solito quando apro un file cerco la sua interfaccia pubblica. Non voglio scorrere oltre tutti i dettagli di implementazione. Capita anche di essere lo stile più popolare che abbia mai visto, quindi c'è da dire per le convention.


2

Mi piace che l'ordine dei metodi in una classe sia basato sulla leggibilità e sul contesto, non sulla visibilità.

cioè un metodo "aperto" probabilmente appartiene prima di un "vicino". Se due metodi pubblici "a" e "b" chiamano una "c" privata, e sono i soli a chiamarla, allora mi piace che "c" sia accanto a loro.

Non penso che una convenzione di ordinamento dei metodi basata sulla visibilità sia una buona cosa.


1

Tendo a preferire vedere le mie lezioni in cui i membri sono elencati in ordine di importanza / visibilità (qui per importanza intendo che hanno un impatto diretto sull'interfaccia pubblica).

Pertanto, le funzioni private hanno la tendenza ad essere spinte verso il basso.

Ci sono eccezioni a ciò in cui tenderò anche a raggruppare funzionalità simili, quindi è ancora possibile trovare piccole funzioni private mescolate a cose pubbliche.

Questa è, come hai detto, una questione di gusti.

Tuttavia, lavorando su un codice che non è mio, proverò e seguirò le convenzioni utilizzate nel progetto.

Un modo carino che ho trovato per tenere traccia di ciò è (supponendo che tu lavori con Eclipse) per creare una configurazione di formattazione del codice ed esportarla con la sorgente del progetto e impegnarla nel controllo del codice sorgente. In questo modo l'ultima e la più grande convenzione di codice per il progetto è a pochi clic di distanza per impostare e creare un habbit di CTRL-SHIFT-F prima di impegnarti, eviterà molti argomenti.

Il vantaggio aggiuntivo dell'utilizzo dei formattatori automatici è che puoi fare le cose in qualsiasi convenzione che ti renda felice e formattare semplicemente il codice prima del commit. YMMV a seconda della convenzione e dello strumento di formattazione.

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.