"Bună, Amigo! Astăzi am să vă povestesc despre stilurile de cod și despre importanța stilului de cod."

"Voi începe cu ceea ce contează cel mai mult.  Codul Java ar trebui să fie ușor de citit.  Abordarea generală a codului este următoarea: codul este scris o dată, dar citit de o sută de ori."

„Să presupunem că tu și alți 10 programatori scrieți o aplicație. Lucrați la aplicație timp de trei ani, cu lansări intermediare la fiecare trei luni.”

— Atât de mult?

„Acesta este Java, tânăra mea lăcustă! „Ce zici de un sistem de întreprindere care rulează pe o duzină de servere și scris de 100 de oameni în mai bine de 6 ani? Și asta se întâmplă uneori.”

— Uau.

"Oricum, regula principală, principala cerință pentru cod este că trebuie să fie ușor de citit pentru alți dezvoltatori."

„În alte limbaje de programare, oamenii lucrează adesea ca echipe mici pe sarcini mici, așa că pot avea o altă regulă principală, cum ar fi „Funcționează? Excelent”.

„Pe parcursul a câțiva ani, toți membrii echipei tale vor face mai multe modificări codului pe care l-ai scris. Și de fiecare dată vor trebui să înțeleagă cum funcționează codul.”

„Și codul de neînțeles care funcționează perfect este greu de schimbat.  Îl vor arunca și îl vor rescrie în felul lor.  Deci, scrieți cod pe care alții îl pot înțelege.  Dacă vă puteți îmbunătăți codul, atunci îmbunătățiți-l. Dacă poate fi îmbunătățit, atunci trebuie îmbunătățit!

„Dacă scrii cod timp de 15 minute și apoi petreci două ore pentru a-l îmbunătăți, o faci corect. Cât timp economisești echipa?”

„„2 ore pentru a vă înțelege codul” x „cele 100 de ori când oamenii vor trebui să-l înțeleagă” = 200 de ore.”

"Am scos aceste cifre din aer, dar vreau să înțelegeți problema și sfera ei.  Codul dvs. este creat pentru a fi citit de alți programatori.  Toate celelalte sunt secundare."

"Codul nu funcționează corect? Îl vom remedia. Nu este optimizat? Îl vom optimiza. Nu este documentat? Vom adăuga comentarii."

" Este codul greu de citit? Aruncă prostiile alea la gunoi și scrie totul din nou de la zero! "

„Nu credeam că este o problemă atât de mare”.

„Unul dintre motivele pentru care Java este un limbaj de programare lider este că tot codul Java este scris pentru a fi citit de alți programatori.”

„Acum, să trecem la a doua întrebare: cum vă faceți codul cât mai ușor de citit posibil?

„Oricine poate înțelege când cineva rostește cuvinte familiare în limba sa maternă. Același lucru este adevărat și aici. Codul este ușor de citit atunci când un programator poate ghici cu ușurință:

A)  Ce face fiecare metodă

B)  Scopul fiecărei clase

C)  Exact ce stochează fiecare variabilă.

Toate acestea sunt comunicate în nume: nume de clase, nume de metode și nume de variabile. În plus, există stil atunci când vine vorba de denumirea variabilelor. Și există stilul de cod.”

— Sunt gata să ascult.

Programarea se bazează pe o engleză bună!  Un program bine scris citește ca o documentație tehnică obișnuită.

Să începem cu nume.

"Numele unei metode ar trebui să descrie pe scurt ceea ce face metoda. Apoi codul poate fi citit ca o simplă proză."

Program
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;
}

„Iată cum se citește un astfel de program”.

Linia 1.

„Metoda se numește „downloadPhoto”. Se pare că descarcă un fișier foto de pe Internet. Unde se descarcă? Nu știm încă. De unde? Metoda are un parametru numit url — probabil că acesta este adresa URL pentru descărcarea."

Linia 3.

„Variabila resultFileName este declarată și atribuită o valoare de către TempHelper.createTempFileName();”

Deci aceasta trebuie să fie calea locală către fișierul în care vom salva fișierul descărcat.

„Numele „TempHelper” nu ne spune nimic. Sufixul „Helper” spune că acesta este un fel de clasă de utilitate care nu conține o logică comercială importantă, ci mai degrabă este folosită pentru a simplifica sarcinile de rutină care apar frecvent.”

„Numele metodei „createTempFileName” indică faptul că această metodă creează și returnează numele unui fișier temporar (fișier temporar). Un fișier temporar este un fișier temporar care este creat pentru o perioadă și apoi, de obicei, șters până când programul este închis. "

Linia 5.

„Un obiect SingleFileDownloader este creat și atribuit variabilei de descărcare.”

Acesta este obiectul care va descărca fișierul nostru de pe Internet.

„Un obiect SingleFileDownloader este alocat variabilei de descărcare. Din nume, putem presupune că programul are mai multe tipuri de clase de descărcare. Una a fost scrisă pentru descărcarea de fișiere individuale și probabil ne putem aștepta să întâlnim alți descărcatori în codul pentru grupuri. de fișiere cu nume precum: MultiFileDownloader, FileGroupDownloader sau DirectoryDownloader"

Linia 6.

„Setam proprietatea resultFileName a obiectului de descărcare egală cu valoarea variabilei resultFileName. Cu alte cuvinte, îi spunem încărctorului unde să salveze fișierul descărcat. După cum v-ați aștepta. Deci, în principiu, anticipăm codul!”

Linia 7.

„Noi numim metoda de pornire. Descărcarea începe. Asta are sens. Mă întreb cum se întâmplă descărcarea: în părți, într-un fir separat, sau totul chiar aici? Dacă descarcăm totul chiar aici, ar putea dura un mult timp și au consecințe.”

Rândurile 8-11.

„Ah. Aici vedem bucla standard scrisă de cineva care așteaptă să se termine descărcarea. Obiectul de descărcare are o proprietate done, care este returnată de metoda isDone(). Deoarece metoda se numește isDone(), mai degrabă decât getDone( ), concluzionăm că variabila realizată este o booleană sau poate o booleană."

Rândurile 13-14.

„Dacă apare o eroare în timpul descărcării, atunci metoda downloadPhoto returnează null. Este bine că tratează erorile. Este rău că returnează doar null — nu este clar care este eroarea. Ar fi mai bine să aruncați o excepție cu informații despre eroarea."

Linia 16.

„Returnăm calea către fișierul local care conține fișierul descărcat.”

"Uau!"

„Codul acestui program face să fie absolut clar ce face. Puteți chiar să presupuneți cum este organizat programul și ce alte clase/metode vom găsi.”

„Acum înțeleg cât de importante sunt numele”.

„Mai multe despre nume. Puteți ghici adesea ce metode are un obiect/clasă. De exemplu, dacă un obiect este o colecție, atunci cel mai probabil va avea o metodă size() sau count() pentru a obține numărul de elemente. , va avea probabil o metodă add() sau insert(). Elementele sunt preluate din clasele de colecție folosind metode get/getItem/getElement."

„Dacă o variabilă se numește i, j sau k, atunci cel mai probabil este un numărător de bucle.”

„Dacă o variabilă se numește m sau n, atunci este cel mai probabil dimensiunea unei matrice/colecție.”

„Dacă o variabilă se numește nume, atunci cel mai probabil este un șir care conține numele cuiva.”

„Dacă o clasă se numește FileInputStream, atunci este simultan un fișier și un flux de intrare.”

„Cu cât vezi mai mult cod, cu atât este mai ușor să citești codul altora.”

„Dar uneori există un cod care este foarte greu de citit. În acest caz, iată un sfat foarte practic:”

Bacsis
Scrie codul ca și cum ar fi întreținut de un psihopat violent care știe unde locuiești .

„Este amuzant și nu amuzant în același timp”.

„Acum puțin despre stilurile folosite pentru a denumi variabile.”

„Dezvoltatorii Java încearcă să dea nume foarte informative variabilelor și metodelor. Drept urmare, numele constau adesea din mai multe cuvinte. Există 4 stiluri pentru scrierea cu majuscule a numelor compuse.”

1) Litere mici  – Toate cuvintele sunt scrise cu litere mici. De exemplu:

„Casa verde”  devine „sera”

„Hollywood girl”  devine  „hollywoodgirl”

Acest stil este folosit pentru numele pachetelor.

2) Litere mari  – Toate cuvintele sunt scrise cu litere mari și separate prin liniuță. De exemplu:

„Valoarea maximă”  devine MAX_VALUE

„Numărul de pisici”  devine CAT_COUNT

„Acest stil este folosit pentru numele constantelor (câmpurile statice finale).”

3) CamelCase  – Toate cuvintele sunt scrise cu litere mici, cu excepția că prima literă a fiecărui cuvânt este majuscule. De exemplu:

„Casa verde”  devine  „Casa de sera”

„Hollywood girl”  devine „HollywoodGirl”

Acest stil este folosit pentru numele claselor și interfețelor.

4) Lower CamelCase (majuscule mixte)  – Toate cuvintele sunt scrise cu litere mici, cu excepția primei litere a fiecărui cuvânt, cu excepția primei litere mari. De exemplu:

„Get width” devine „getWidth”

„Get Hollywood Girl Name” devine  „getHollywoodGirlName”

„Acest stil este folosit pentru numele variabilelor și metodelor.”

— Deci, nu există prea multe reguli.

1)  Totul este scris în Lower CamelCase.

2)  Numele claselor și interfețelor sunt întotdeauna scrise cu majuscule.

3)  Numele pachetelor sunt întotdeauna cu litere mici.

4)  Constantele sunt întotdeauna majuscule.

„Sunt câteva nuanțe, dar, în general, asta este.”

„Acum despre metode.  „Numele metodelor încep aproape întotdeauna cu un verb! „count” este un nume prost pentru o metodă. Este mai bine să-l numiți getCount(). O metodă efectuează o acțiune asupra obiectului:  startDownload , interrupt  , sleep  , loadPirateMusic ."

„După cum știți deja, există aplicații de captare și setare pentru lucrul cu proprietățile/câmpurile unui obiect:  getName / setName , getCount / setCount , etc.”

„Singura excepție este pentru booleeni. Pentru booleeni, numele getter folosesc „is”, nu „get”, de exemplu isDone, isEmpty. În acest fel, este mai aproape de vorbirea obișnuită.”

"Ce-ar fi să lucrezi două ore pe zi în loc de 8? Ispitit?"

"Da!"

„Așa cum ar trebui să fii. Pentru un dezvoltator Java junior, cerința de bază este o înțelegere excelentă a elementelor de bază ale Java, adică Java Core.”

"Am o altă întrebare. De ce avem aceste metode diferite pentru a obține numărul de elemente?"

Clasă Metodă/proprietate pentru obținerea numărului de elemente
Şir lungime ()
Matrice lungime
ArrayList dimensiune ()
ThreadGroup Număr activ ()

„În primul rând, Java a fost inventat cu mai bine de 20 de ani în urmă, înainte ca cerințe precum setCount / getCount să fi fost stabilite și a existat o abordare comună luată din limbajul C pentru a „scurca cât mai mult posibil”.

"În al doilea rând, semantica joacă un rol aici. Când vorbim despre o matrice, vorbim despre lungimea acesteia. Când vorbim despre o colecție, vorbim despre dimensiunea ei."

— Ce lecție interesantă.

"Aș vrea să vă spun mai multe, dar mi-e teamă că nu vă veți aminti totul dintr-o dată. Este mai bine să vi-l serviți în porții mici."

„Dar vreau să ating stilul în ceea ce privește utilizarea parantezelor: {}. Există două abordări:”

1)  Paranteza merge pe o linie nouă de fiecare dată

2)  Paranteza de deschidere merge la sfârșitul liniei anterioare, în timp ce paranteza de închidere merge pe o linie nouă. Acest stil se numește „brete egiptene”.

„Sincer, poți să alegi cum să codificăm. Mulți oameni folosesc un bretele de deschidere pe aceeași linie. Mulți oameni îl pun pe o linie nouă. Este ca și dezbaterea despre ce capăt al oului să rupă: capătul mic sau cel mare. Sfârşit."

"Singurul lucru pe care îl pot recomanda este să rămâneți la orice stil folosit în proiectul la care lucrați. Nu schimba codul altcuiva pentru a se potrivi cu stilul dvs. preferat.  Oamenii sunt imperfecți. Vă spun asta ca Doctor Bilaabo. "

— Mulțumesc pentru lecția interesantă, Bilaabo. Voi merge să reflectez la ceea ce ai spus.