Cum să scrieți în mod eficient metodele (traducerea unui articol)

Cum să scrieți în mod eficient metodele (traducerea unui articol)

Această notă face parte din cursul Advanced Java (Advanced Java.) Al Academiei noastre
Acest curs este conceput pentru a vă ajuta să faceți utilizarea Java mai eficientă. Aici sunt discutate teme mai complexe, cum ar fi crearea obiectelor, paralelizarea, serializarea, reflectarea și multe altele. Aceste cunoștințe vă vor îndruma în călătoria dvs. către înălțimile abilităților Java.

Cuprins

1. Introducere
2. Semnarea metodelor
3. Corpul metodei
4. Supraîncărcarea metodei
5. Înlăturarea metodei
6. Embedding
7. Recursion
8. Referințele metodelor
9. Invariabilitatea
10. Documentarea metodei
11. Parametrii metodei și valorile returnate
12. Metoda ca punct de intrare la o cerere
13. Ce urmează?
14. Descărcați codul sursă

1. Introducere

În această secțiune a tutorialului, vom petrece ceva timp discutând diverse aspecte legate de proiectarea și implementarea metodelor în Java. În partea anterioară a tutorialului a fost posibil să vă asigurați că metodele de scriere în Java sunt foarte simple, dar există multe lucruri care vă pot face metodele mai ușor de citit și mai eficace.

2. Semnături ale metodelor

După cum știți deja, Java este un limbaj orientat pe obiecte. În esență, fiecare metodă Java se referă la o parte a clasei (sau la clasa însăși în cazul unei metode statistice). Are reguli de vizibilitate (sau accesibilitate), poate fi declarat abstractă sau finală și așa mai departe. Cu toate acestea, probabil cea mai importantă parte a metodei - este semnătura lui: tipul de întoarcere și argumentele, plus o listă de excepții verificate la punerea în aplicare a fiecărei metode, care pot fi aruncate (dar această parte a fost folosit rar, și chiar mai rar aceste zile). Să începem cu un mic exemplu.

Metoda principală ia o serie de șiruri de caractere doar ca argument args și nu întoarce nimic. Ar putea fi foarte frumos - să facă toate metodele la fel de simple ca și cele principale. Dar, în realitate, semnătura metodei poate deveni irecuperabilă. Să aruncăm o privire la următorul exemplu:

Primul lucru care este de remarcat faptul că simbolurile utilizate inițial în numele metodelor Java, cum ar setTitleVisible.Imya bine alese și încearcă să descrie ceea ce metoda are dreptul de a face.
În al doilea rând, numele argumentelor spun (sau cel puțin sugestii) despre scopul lor. Este foarte important să găsim numele corect, inteligent pentru argumentele metodelor, în loc de int i, String s, boolean f (în cazuri foarte rare, acest lucru are sens).
În al treilea rând, metoda are doar trei argumente. Deși Java are o limită mult mai mare pentru numărul de argumente permise, este recomandat să nu se depășească numărul de argumente mai mari de 6. Depășirea acestui cadru face ca semnătura să fie greu de înțeles.
De la lansarea Java 5, metodele pot avea o listă diferită de argumente de același tip (numite varargs - argumente variabile) și pot folosi o sintaxă specială, de exemplu:

Următorul exemplu demonstrează utilizarea verificării excepțiilor ca parte a semnăturii metodei. În trecutul recent, verificarea excepției nu sa dovedit a fi la fel de utilă cum ar fi trebuit să fie, drept rezultat, codul șablonului a fost folosit mai mult pentru scriere decât pentru rezolvarea problemelor.

3. Corpul metodei

Fiecare metodă are propria realizare și scop de existență. Cu toate acestea, există câteva recomandări generale care ajută cu adevărat la scrierea unor metode clare și ușor de înțeles.
Probabil cel mai important principiu este principiul responsabilității unice: trebuie să încercați să implementați metoda în așa fel încât fiecare metodă să facă un lucru și o face bine. În conformitate cu acest principiu, este posibil să se umfle numărul de metode de clasă și este important să se găsească echilibrul corect.
Un alt lucru important în procesul de codificare și proiectare este de a face ca metodele implementate să fie scurte. Pentru metode scurte este ușor de înțeles motivul pentru care sunt făcute, plus de obicei se potrivesc pe ecran și astfel pot fi înțelese foarte rapid de cititorul codului.
Ultimul în ordine (dar nu în sensul de) consiliul este legat de utilizarea operatorilor de retur. Dacă metoda returneaza o valoare, încercați să reducă la minimum numărul de locuri în care valoarea returnată ar fi datorată (unii oameni merg chiar mai departe și recomandă utilizarea doar o singură valoare de întoarcere, în toate cazurile. Cu cât valoarea returnată este o metodă atât devine mai dificil să urmeze logica lui și să modifice (sau să optimizeze) implementarea.

4. Supraîncărcarea metodei

Metodele de supraîncărcare a tehnicilor sunt adesea utilizate pentru a oferi o specializare a versiunilor metodelor pentru diferite tipuri de argumente sau combinații ale acestora. Deși numele metodei de același computer selectează alternativa corectă pentru a se aventurează în valorile curente ale argumentelor apelului (cel mai bun exemplu este Java designeri suprasarcinii: numele este întotdeauna același, dar diferite argumente), sau cauzează o eroare de compilator, în cazul în care o astfel de variantă a metodei nu este găsit. De exemplu:

Metoda Supraîncărcarea este parțial similar cu generice (mai multe informații despre medicamentele generice pot fi găsite în partea 4 din tutorial Cum și când să utilizați Generice (Cum și când să folosească generice)), dar suprasarcina este utilizat în cazul în care abordarea utilizării generice nu funcționează bine și toată lumea sau mai Tipurile de argumente care sunt generice necesită implementări proprii. Cu toate acestea, combinarea celor două metode de congestie generice și poate fi foarte productiv, dar de multe ori acest lucru nu este posibil în Java, deoarece tipul este șters (mai multe detalii în partea 4 din tutorial Cum și când să utilizați Generice (Cum și când să folosească generice)). Să examinăm un exemplu:

Deși acest cod de cod ar putea fi scris fără utilizarea de generice, nu contează pentru demonstrațiile noastre. Interesant este ca metoda numberToString este supraincarcata cu o implementare speciala a BigDecimal iar versiunea generica este pentru toate celelalte numere.

5. Înlăturarea metodei

Am vorbit mult despre metodele imperative în partea 3 din tutorial (Cum de a proiecta clase și interfețe (Cum de a proiecta clase și interfețe). În această secțiune, știm deja despre supraîncărcarea metode, vom arăta de ce utilizarea de adnotări @ Suprascriere atât de important. Nostru exemplu arată diferența subtilă între metoda supracomandată și metoda de suprasarcină într-o ierarhie de clasă simplă.

Clasa părinte are o singură metodă toObject. Să creați o subclasă din această clasă și să încercați să veniți cu o versiune a metodei pentru conversia numerelor în șiruri de caractere (în loc de obiecte brute).

Cu toate acestea, metoda semnăturii toObject în clasa derivată nu este cu mult diferit (a se vedea tipuri de metode de returnare covarianță (tipuri de returnare covariant metode) pentru mai multe detalii), și nu-l suprascrie din superclasa în clasă, compilatorul Java nu emite nici o eroare și avertismente. Acum, să adăugăm încă o metodă la clasa copil.

Din nou, există doar o mică diferență în semnătura metodei (Double în loc de Number), dar faptul că aceasta este o versiune supraîncărcată a metodei nu suprascrie metoda override. Adică atunci când instrucțiunile de la compilatorul Java și adnotările @Override se suprapun: metoda cu adnotarea din ultimul exemplu cu @ Override va provoca o eroare de compilator.

6. Embedding

Embedding este optimizarea efectuată de Java JIT (exact la timp) compilatorul pentru a elimina o anumită metodă de apel și a le înlocui direct cu implementarea metodei. Folosirea compilatorului JIT pentru o euristică depinde de două lucruri: cât de des se numește metoda în acest moment și cât de mare este. Metodele care sunt prea mari nu pot fi construite în mod eficient. Embedding-ul poate oferi o creștere semnificativă a performanței codului și avantajul stocării unor metode cât mai scurte pe care le-am discutat în secțiunea Body of Method.

7. Recursion


Recurgerea în Java este o tehnică în care metoda se numește, efectuând calcule. De exemplu, să aruncăm o privire la următorul exemplu, care rezumă numărul matricei:

Aceasta este o implementare foarte ineficientă, dar demonstrează destul de bine recurența. Există o problemă bine-cunoscut cu metoda recursiv: în funcție de cât de adânc lanțul de apel, acestea pot inunda stiva și cauza StackOverflowError excepție. Dar nu totul este la fel de rău cum pare, pentru că există o tehnică care poate elimina supraîncărcarea stivei, numită optimizarea apelurilor coadă. Se poate aplica, în cazul în care metoda este coada recursiv (metode coada recursive sunt metode în care toate apelurile recursive sunt coada el). De exemplu, să rescriem algoritmul precedent utilizând recursionarea coadă:

Din păcate, în acest moment Java compilator (și compilator JIT JVM) nu are suport pentru coada de optimizare apel optimizare coadă, dar încă aceasta este o tehnică foarte utilă, și este necesar să se cunoască și să ia în considerare atunci când scrie algoritmi recursivi în Java.

8. Referințele metodelor

Java 8 face un uriaș pas înainte introducând concepte funcționale în limba Java. Baza, care se ocupă cu metodele de date, un concept care nu este acceptată în limba înainte (cu toate acestea, din moment ce Java 7 este lansat, JVM și standard de biblioteca Java a fost deja unele realizări, pentru a face acest lucru posibil). Din fericire, având metode de legare, acum este posibil.

Să aruncăm o privire la un mic exemplu al modului în care metodele pot fi folosite ca argumente pentru alte metode.

În ultima linie a metodei principale, metoda folosește o referință la metoda println pentru a imprima fiecare element din colecția șir la consolă, este trecut ca argument la o altă metodă, pentru fiecare.

9. Invariabilitatea

Fiecare apel la obiectul LocalDateTime, care trebuie să-și schimbe starea, returnează o nouă instanță a LocalDateTime și menține originalul neschimbat. Aceasta este o schimbare mare în paradigma de proiectare API comparativ cu vechiul calendar și dată (care, pentru a spune ușor, nu au fost foarte plăcut de utilizat și au provocat multe dureri de cap).

10. Documentarea metodei

Aceasta este o documentație destul de detaliată pentru o metodă simplă, cum ar fi parsarea, dar prezintă câteva caracteristici utile furnizate de instrumentul Javadoc, inclusiv link-uri către alte clase, fragmente de eșantion și formatare avansată. Acesta este modul în care documentația acestei metode se reflectă în Eclipse, unul dintre cele mai populare IDE-uri Java.
Privind doar imaginea de mai sus, orice dezvoltator Java de la nivelul junior la cel superior poate înțelege scopul metodei și poate să o folosească în mod corespunzător.

11. Parametrii metodei și valorile returnate

Documentarea metodelor dvs. este un lucru minunat, dar, din păcate, acest lucru nu împiedică cazurile când se numește o metodă utilizând valori incorecte sau neașteptate ale argumentelor. Din această cauză, de regulă, toate metodele publice ar trebui să-și confirme argumentele și nu ar trebui să fie siguri că tot timpul când apelul este dat valorilor corecte (modelul este mai bine cunoscut sub numele de controale de sănătate).
Revenind la exemplul nostru din secțiunea anterioară, metoda parsei ar trebui să testeze singurul argument înainte de a face ceva cu el:

Java are o versiune diferită a controalelor de validare și de sanatate, utilizând afirmații afirmative. Cu toate acestea, cele care ar putea fi dezactivate în timpul execuției și nu pot fi executate. Este de preferat să se efectueze întotdeauna aceste verificări și să se producă excepții corespunzătoare.
Chiar având metode documentate și verificându-le argumentele, vreau să fac mai multe comentarii legate de valorile returnate. Înainte de a ieși Java 8, cel mai simplu mod de a spune că metoda în acest moment nu contează este să o returnați pur și simplu pentru a reveni la zero. De aceea Java este atât de rău în obținerea NullPointerException. Java 8 încearcă să rezolve această problemă cu introducerea clasei opționale. Să aruncăm o privire la acest exemplu:

Opțional oferă multe metode utile și elimină complet necesitatea revenirii în metoda nulă și vă poluează codul peste tot cu verificări nul. Singura excepție este, probabil, colecția. Ori de câte ori o metodă returnează o colecție, este întotdeauna mai bine să returnați null în loc de null (și chiar opțional), de exemplu:

12. Metoda ca punct de intrare la o cerere

Chiar dacă sunteți un dezvoltator simplu care scrie o aplicație în organizația dvs. sau un participant într-unul dintre cele mai populare cadre sau biblioteci Java, deciziile de proiectare pe care le luați joacă un rol foarte important în modul în care va fi utilizat codul.
Deși instrucțiunile metodologice pentru proiectarea API sunt în valoare de mai multe cărți, această parte a tutorialului se ocupă de multe dintre ele (modul în care metodele devin un punct de intrare la API), astfel încât prezentarea generală va fi foarte utilă:
• Utilizați nume semnificative pentru metode și argumentele acestora (semnături de metode)
Încercați să păstrați numărul de argumente care trebuie să fie mai mici de 6 (secțiunea Semnăturile metodei)
• Țineți-vă metodele scurte și lizibile (secțiunea Metoda corp și Inlining)
• Documentați întotdeauna metode deschise, inclusiv precondiții și exemple, dacă acest lucru are sens (secțiunea Documentația metodelor)
• Verificați întotdeauna argumentele și verificările de sănătate (secțiunea Parametrii metodei și valorile de returnare)
• Încercați să evitați valoarea nulă ca valoare de returnare (secțiunea Parametrii metodei și valorile returnate)
• Ori de câte ori are sens, încercați să proiectați metode imuabile (care nu afectează starea internă, secțiunea Immutabilitate)
• Utilizați reguli de vizibilitate și accesibilitate pentru a ascunde metodele care nu ar trebui să fie publice (Partea 3 din tutorial, Cum se proiectează clasele și interfețele)

13. Ce urmează?

Această parte a tutorialului vorbește mai puțin despre Java ca limbă, dar mai multe despre cum să utilizați limba Java în mod eficient, în special, scriind metode clare, curate, documentate și eficiente. În următoarea secțiune, vom continua cu aceeași idee de bază și vom discuta despre principiile generale de programare care sunt concepute să vă ajute ca dezvoltator Java să devină mai bun.

14. Descărcați codul sursă

Aceasta a fost o lecție dedicată modului de a scrie în mod eficient metode. Puteți descărca codul sursă aici: advanced-java-part-6

Articole similare