"Ciao, Amigo! Oggi ti parlerò degli stili di codice e dell'importanza dello stile di codice."

"Inizierò con ciò che conta di più.  Il codice Java dovrebbe essere facile da leggere.  L'approccio generale al codice è questo: il codice viene scritto una volta ma letto cento volte."

"Supponiamo che tu e altri 10 programmatori stiate scrivendo un'applicazione. Lavori sull'applicazione per tre anni, con rilasci intermedi ogni tre mesi."

"Così lungo?"

"Questo è Java, la mia giovane cavalletta! "Che ne dici di un sistema aziendale in esecuzione su una dozzina di server e scritto da 100 persone in più di 6 anni? Succede anche questo a volte".

"Ehi."

"Comunque, la regola principale, il requisito principale per il codice è che deve essere facile da leggere per gli altri sviluppatori."

"In altri linguaggi di programmazione, le persone spesso lavorano come piccoli team su piccoli compiti, quindi potrebbero avere un'altra regola principale, come 'Funziona? Eccellente'."

"Nel corso di un paio d'anni, tutti i membri del tuo team apporteranno diverse modifiche al codice che hai scritto. E ogni volta dovranno capire come funziona il codice."

"E il codice incomprensibile che funziona perfettamente è difficile da modificare.  Lo scarteranno e lo riscriveranno a modo loro.  Quindi, scrivi codice che gli altri possano capire.  Se puoi migliorare il tuo codice, allora miglioralo. Se può essere migliorato, allora è da migliorare! "

"Se scrivi codice per 15 minuti e poi passi due ore a migliorarlo, lo stai facendo bene. Quanto tempo risparmi al team?"

"'2 ore per capire il tuo codice' x 'le 100 volte in cui le persone avranno bisogno di capirlo' = 200 ore."

"Ho tirato fuori queste cifre dal nulla, ma voglio che tu capisca il problema e la sua portata.  Il tuo codice è stato creato per essere letto da altri programmatori.  Tutto il resto è secondario."

"Il codice non funziona correttamente? Lo ripareremo. Non ottimizzato? Lo ottimizzeremo. Non documentato? Aggiungeremo commenti."

" Il codice è difficile da leggere? Butta quella merda nella spazzatura e riscrivi tutto da zero! "

"Non pensavo fosse un grosso problema."

"Uno dei motivi per cui Java è un linguaggio di programmazione leader è che tutto il codice Java è scritto per essere letto da altri programmatori."

"Ora passiamo alla seconda domanda: come rendi il tuo codice il più semplice possibile da leggere? "

"Chiunque può capire quando qualcuno pronuncia parole familiari nella sua lingua madre. Lo stesso vale qui. Il codice è facile da leggere quando un programmatore può indovinare facilmente:

A)  Cosa fa ciascun metodo

B)  Lo scopo di ogni lezione

C)  Esattamente ciò che ciascuna variabile memorizza.

Tutto questo viene comunicato nei nomi: nomi di classi, nomi di metodi e nomi di variabili. Inoltre, c'è stile quando si tratta di nominare le variabili. E c'è lo stile del codice."

"Sono pronto ad ascoltare."

" La programmazione si basa su un buon inglese!  Un programma ben scritto si legge come una normale documentazione tecnica. "

" Cominciamo dai nomi " .

"Un nome di metodo dovrebbe descrivere brevemente cosa fa il metodo. Quindi il codice può essere letto come una semplice prosa."

Programma
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

"Ecco come viene letto un programma del genere."

Linea 1.

"Il metodo si chiama 'downloadPhoto'. Sembra che scarichi un file di foto da Internet. Dove viene scaricato? Non lo sappiamo ancora. Da dove? Il metodo ha un parametro chiamato url — che è probabilmente l'URL per il download."

Linea 3.

"La variabile resultFileName è dichiarata e assegnata a un valore da TempHelper.createTempFileName();"

Quindi questo deve essere il percorso locale del file in cui salveremo il nostro file scaricato.

"Il nome 'TempHelper' non ci dice nulla. Il suffisso 'Helper' dice che si tratta di un tipo di classe di utilità che non contiene una logica aziendale importante, ma piuttosto viene utilizzata per semplificare le attività di routine che si verificano frequentemente."

"Il nome del metodo 'createTempFileName' indica che questo metodo crea e restituisce il nome di un file temporaneo (file temporaneo). Un file temporaneo è un file temporaneo che viene creato per un po' di tempo e poi solitamente eliminato quando il programma viene chiuso. "

Riga 5.

"Un oggetto SingleFileDownloader viene creato e assegnato al downloader variabile."

Questo è l'oggetto che scaricherà il nostro file da Internet.

"Un oggetto SingleFileDownloader è assegnato alla variabile downloader. Dal nome, possiamo presumere che il programma abbia diversi tipi di classi di downloader. Una è stata scritta per scaricare singoli file e probabilmente possiamo aspettarci di incontrare altri downloader nel codice per i gruppi di file con nomi come: MultiFileDownloader, FileGroupDownloader o DirectoryDownloader"

Riga 6.

"Impostiamo la proprietà resultFileName dell'oggetto downloader uguale al valore della variabile resultFileName. In altre parole, diciamo al caricatore dove salvare il file scaricato. Come ti aspetteresti. Quindi, in pratica stiamo prevedendo il codice!"

Riga 7.

"Noi chiamiamo il metodo start. Il download inizia. Ha senso. Mi chiedo come avvenga il download: in parti, su un thread separato o tutto qui? Se scarichiamo tutto qui, potrebbe volerci un po' di tempo. molto tempo e avere conseguenze”.

Linee 8-11.

"Ah. Qui vediamo il ciclo standard scritto da qualcuno che aspetta il completamento di un download. L'oggetto downloder ha una proprietà done, che viene restituita dal metodo isDone(). Perché il metodo si chiama isDone(), piuttosto che getDone( ), concludiamo che la variabile done è un booleano o forse un booleano."

Righe 13-14.

"Se si verifica un errore durante il download, il metodo downloadPhoto restituisce null. È positivo che gestisca gli errori. È negativo che restituisca solo null: non è chiaro quale sia l'errore. Sarebbe meglio lanciare un'eccezione con informazioni su l'errore."

Riga 16.

"Restituiamo il percorso al file locale che contiene il file scaricato."

"Ehi!"

"Il codice di questo programma rende assolutamente chiaro ciò che fa. Puoi persino fare ipotesi su come è organizzato il programma e quali altre classi/metodi troveremo."

"Ora capisco quanto siano importanti i nomi".

"Ulteriori informazioni sui nomi. Spesso puoi indovinare quali metodi ha un oggetto/classe. Ad esempio, se un oggetto è una raccolta, molto probabilmente avrà un metodo size() o count() per ottenere il numero di elementi. Inoltre , avrà probabilmente un metodo add() o insert(). Gli elementi vengono recuperati dalle classi di raccolta utilizzando i metodi get/getItem/getElement."

"Se una variabile si chiama i, j o ​​k, molto probabilmente è un contatore di cicli."

"Se una variabile si chiama m o n, molto probabilmente è la dimensione di un array/raccolta."

"Se una variabile si chiama nome, molto probabilmente è una stringa contenente il nome di qualcuno."

"Se una classe si chiama FileInputStream, allora è contemporaneamente un file e un flusso di input."

"Più codice vedi, più facile è leggere il codice degli altri."

"Ma a volte c'è un codice molto difficile da leggere. In questo caso, ecco un consiglio molto pratico:"

Mancia
Scrivi il codice come se fosse gestito da uno psicopatico violento che sa dove vivi .

"È divertente e non divertente allo stesso tempo."

"Ora un po' sugli stili usati per denominare le variabili."

"Gli sviluppatori Java cercano di dare nomi altamente informativi a variabili e metodi. Di conseguenza, i nomi sono spesso costituiti da più parole. Ci sono 4 stili per la maiuscola dei nomi composti."

1) Minuscolo  - Tutte le parole sono scritte con lettere minuscole. Per esempio:

La 'casa verde'  diventa 'serra'

"Hollywood Girl"  diventa  "Hollywood Girl"

Questo stile viene utilizzato per i nomi dei pacchetti.

2) Maiuscolo  - Tutte le parole sono scritte con lettere maiuscole e separate da un trattino basso. Per esempio:

"Valore massimo"  diventa MAX_VALUE

"Conteggio gatti"  diventa CAT_COUNT

"Questo stile è utilizzato per i nomi delle costanti (campi statici finali)."

3) CamelCase  - Tutte le parole sono scritte con lettere minuscole, tranne la prima lettera di ogni parola è maiuscola. Per esempio:

'Green house'  diventa  'GreenHouse'

"Hollywood girl"  diventa "HollywoodGirl"

Questo stile viene utilizzato per i nomi delle classi e delle interfacce.

4) Lower CamelCase (caso misto)  – Tutte le parole sono scritte utilizzando lettere minuscole, tranne la prima lettera di ogni parola, tranne la prima è maiuscola. Per esempio:

'Ottieni larghezza' diventa 'getWidth'

"Get Hollywood girl name" diventa  "getHollywoodGirlName"

"Questo stile è usato per i nomi di variabili e metodi."

"Quindi, non ci sono troppe regole."

1)  Tutto è scritto in Lower CamelCase.

2)  I nomi delle classi e delle interfacce sono sempre in maiuscolo.

3)  I nomi dei pacchetti sono sempre minuscoli.

4)  Le costanti sono sempre maiuscole.

"Ci sono un paio di sfumature, ma in generale è quello che è."

"Ora sui metodi.  "I nomi dei metodi iniziano quasi sempre con un verbo! 'count' è un brutto nome per un metodo. È meglio chiamarlo getCount(). Un metodo esegue un'azione sull'oggetto:  startDownload , interrupt  , sleep  , loadPirateMusic ."

"Come già sai, ci sono getter e setter per lavorare con le proprietà/i campi di un oggetto:  getName / setName , getCount / setCount , ecc."

"L'unica eccezione è per i booleani. Per i booleani, i nomi getter usano 'is', non 'get', ad esempio isDone, isEmpty. In questo modo è più vicino al discorso ordinario."

"Che ne dici di lavorare due ore al giorno invece di 8? Tentato?"

"SÌ!"

"Come dovresti essere. Per uno sviluppatore Java junior, il requisito di base è un'ottima conoscenza delle basi di Java, ovvero Java Core."

"Ho un'altra domanda. Perché abbiamo questi diversi metodi per ottenere il numero di elementi?"

Classe Metodo/proprietà per ottenere il numero di elementi
Corda lunghezza ()
Vettore lunghezza
Lista di array dimensione ()
ThreadGroup Conteggio attivo ()

"Prima di tutto, Java è stato inventato più di 20 anni fa, prima che fossero stabiliti requisiti come setCount / getCount , e c'era un approccio comune adottato dal linguaggio C per 'renderlo il più breve possibile'."

"In secondo luogo, qui gioca un ruolo la semantica. Quando si parla di un array, si parla della sua lunghezza. Quando si parla di una raccolta, si parla della sua dimensione."

"Che lezione interessante."

"Vorrei dirti di più, ma temo che non te lo ricorderai tutto in una volta. È meglio servirtelo in piccole porzioni."

"Ma voglio toccare lo stile per quanto riguarda l'uso delle parentesi graffe: {}. Ci sono due approcci:"

1)  La parentesi va su una nuova riga ogni volta

2)  La parentesi di apertura va alla fine della riga precedente, mentre la parentesi di chiusura va su una nuova riga. Questo stile è chiamato "parentesi graffe egiziane".

"Onestamente, puoi scegliere come codificare. Molte persone usano una graffa di apertura sulla stessa riga. Molte persone la mettono su una nuova riga. È come il dibattito su quale estremità dell'uovo rompere: l'estremità piccola o quella grande FINE."

"L'unica cosa che posso consigliare è di attenersi allo stile utilizzato nel progetto su cui stai lavorando. Non modificare il codice di qualcun altro in modo che corrisponda al tuo stile preferito.  Le persone sono imperfette. Te lo dico come Dottor Bilaabo. "

"Grazie per l'interessante lezione, Bilaabo. Vado a riflettere su quello che hai detto."