Șase sfaturi pentru scrierea de cod mai ușor de citit

Cum să vă protejați de problemele cauzate de propriile lor programe

Dzheff Vogel. Președinte, Spiderweb Software

Am trecut printr-un drum dificil înainte de a învățat să scrie cod clar, permițând întreținerea ulterioară. De-a lungul ultimilor doisprezece ani, am făcut o viață crearea de jocuri pe calculator și le vinde pe Internet, în conformitate cu modelul de marketing numit shareware. Acest lucru înseamnă că eu stau în fața unui ecran gol și începe să scrie cod - și scriind doar câteva zeci de mii de linii de cod, am ceva pe care le poate vinde.







Cu alte cuvinte, dacă am crea un dezastru, am face acest lucru doar la propriul cuib. Când ora trei dimineața mă uit pentru o greșeală confuz ca un program de vis urat „macaroane“, și-mi spun: „? Oh, Doamne, ce retardat care cauzează endogamie a scris acest coșmar“, răspunsul la această întrebare nu poate fi decât: „Eu sunt eu“ .

Dezvoltarea, tehnici bune de programare comandat a devenit pentru mine o adevărată binecuvântare. Unele dintre aceste tehnici sunt descrise în acest articol. Mulți calificați, cu experiență și disciplinată intern programatori știu pe de rost multe dintre aceste tehnici. Tot ceea ce oamenii pot obține de la acest articol - este abilitatea de a se bucura de stilul meu literar încântător și amintiți-vă cât de teribil a fost viața lor înainte de a dobândit acces la conceptul de „cod curat“.

Ca o ilustrare, în acest articol, voi lua în considerare programul, care este un joc de calculator ipotetic numit Kill Bad Aliens (Kill străin rău). Membru al acestui joc este de a controla nava spatiala. Această navă se deplasează pe orizontală în partea de jos și fotografiază cochilii pe verticală. Gestionarea acestei nave spațiale va fi realizată, de exemplu, folosind tastatura.

Fig. 1. Jocul nostru ipotetic

Șase sfaturi pentru scrierea de cod mai ușor de citit

Jocul este împărțit în intervale de timp - așa-numitul „val“. De-a lungul fiecărui val în partea de sus a ecranului, unul după altul extraterestri care apar. Ele zboară pe ecran și arunca bombe. Extraterestri apar pe ecran pentru o perioadă de timp determinată. Wave se termină după ce jucătorul are o anumită cantitate de ET distruse.

Pentru fiecare jucător străin mort primește o anumită cantitate de puncte. După sfârșitul fiecărui val, jucătorul primește un anumit număr de puncte bonus - în funcție de cât de repede a fost capabil să finalizeze acest val.

Odată cu înfrângerea explodează nave spațiale cu bombă, apoi cealaltă navă apare pe ecran. În cazul în care o navă spațială explodează de trei ori, jocul se termină. Jucătorul cu cel mai mare număr de puncte este înscris în evaluarea generală. Pentru un număr mic de puncte care nu se întâmplă.

Deci, stai jos la un birou și începe să scrie cod Kill Bad Aliens jocuri în limba C ++. În primul rând, definiți obiectele care vor fi de nave spațiale, rachete Player, extraterestri, și bombe lor. Apoi, va scrie codul pentru reprezentarea grafică pe ecranul tuturor acestor obiecte. Apoi, va scrie codul pentru a muta obiecte de pe ecran, în funcție de timp. În cele din urmă, scrieți logica de joc, inteligenta artificiala, extraterestri, cod de program pentru introducerea comenzilor de la player-ul tastaturii, etc.

Se pune întrebarea inevitabilă - cum să facă toate cele de mai sus, astfel încât codul de final al jocului a fost evident, nu a creat dificultăți în susținerea ulterioară și nu reprezintă o mizerie ilizibile?

Și dacă vom ajunge la asta, o altă recomandare - nu face acest lucru:

Deci, tot ceea ce avem nevoie - o descriere la începutul și câteva „indicii“ în explicarea calea aleasă. Toate acestea se face foarte repede și pe termen lung, a salva o mulțime de timp.

Mai jos este un exemplu al jocului nostru ipotetic ucide Bad Aliens. Să considerăm un obiect care reprezintă scoici, care trage player-ul. Vei avea de multe ori pentru a apela o funcție care va muta obiectul în sus și pentru a determina unde a fost. Aș scrie procedura ca aceasta:

Sfat 2: Utilizați # define operatorul de multe ori. Ori de câte ori este posibil.

Să presupunem că, în jocul nostru ipotetic, ne dorim la fiecare contact cu player-ul străin primește zece puncte. Această problemă poate fi rezolvată în două moduri. mod Bad:

O modalitate buna: Într-un fișier la nivel mondial a scrie următoarea linie:

Acum, dacă vrem să atribuiți jucător mai multe puncte bonus, suficient pentru a scrie următoarele:

Cei mai mulți programatori vor ști cumva că este necesar să se facă acest lucru. Cu toate acestea, pentru punerea în aplicare consecventă a acestui concept necesită auto-disciplina. Aproape de fiecare dată când introduceți o constantă numerică, este necesar să se ia în considerare cu atenție - Nu-i cereți într-un „punct central“. De exemplu, să presupunem că doriți să aveți o zonă de joacă, cu dimensiuni de 800 x 600 pixeli. Vă recomandăm insistent să setați dimensiunea terenului, după cum urmează:

Atunci când se lucrează pe joc Kill Bad Străinii am nevoie pentru a decide cât de mulți străini trebuie să-l omoare pentru a finaliza val ca străini pot fi pe ecran, la o dată și modul în care străinii rapid apar pe ecran. De exemplu, dacă vreau ca fiecare val a avut același număr de străini care apar cu aceeași frecvență, cel mai probabil, voi scrie ceva de genul:

Este destul de clar cod. Apoi, când am ajuns la concluzia că valurile sunt prea scurte sau că intervalele dintre aparițiile străinilor sunt prea mici, pot schimba aceste valori și resetați instantaneu întregul joc.

Unul dintre avantajele majore ale unui astfel de mecanism pentru a seta parametrii de joc - astfel încât capacitatea de a face rapid schimbari plăcere și te face să te simți puternic. De exemplu, modificați textul de mai sus, după cum urmează:

Acum, doar un singur recompilarea - și jocul va fi mult mai distractiv, și chiar mai nebun.

Fig. 2. Joc Kill Bad Aliens înainte de constantele de schimbare

Șase sfaturi pentru scrierea de cod mai ușor de citit

Fig. 3. Joc Kill Bad Aliens după creșterea de constante (joc, poate fi dificil, dar interesant de văzut)

Șase sfaturi pentru scrierea de cod mai ușor de citit






Sfat 3: Nu da numele variabilelor care pot induce în eroare.

Scopul final este simplu: pentru a scrie cod, astfel încât un străin care nu are nici o idee despre ce face acest cod, ar putea înțelege cât mai repede posibil.

Este necesar să se respecte media de aur. Dă-vă numele de obiecte, care sunt suficient de lung și intuitiv pentru a înțelege sensul lor, dar nu atât de mult timp și greoaie, care este dificil de a citi codul.

De exemplu, în lumea reală, probabil că nu aș da nume constante atât de mult încât am folosit în secțiunea anterioară. Am făcut-o doar pentru cititorul să înțeleagă pe deplin semnificația lor fără context. În contextul programului în sine în loc de text:

Eu, probabil, ar fi scris următoarele:

Orice neînțelegere cauzată de nume mai scurt vor fi eliminate foarte repede, iar „lizibilitatea“ de cod îmbunătățește.

Acum ia în considerare fragmentul de cod care va fi folosit foarte des pentru a muta toate străinilor de pe ecran. Mi-ar fi aproape sigur în scris în acest fel:

Rețineți că șirul tuturor străinilor și se numește - extratereștri. Și e foarte bine. Acest nume transmite exact ceea ce am vrut să spun, dar în acest caz, este destul de scurt, astfel încât să pot intra de la tastatură mii de ori și nu merge nebun cu asta. După toate probabilitățile, veți folosi această matrice este foarte frecvente. Dacă apelați această matrice all_aliens_currently_on_screen. codul va fi de zece mile lungime și la fel de neînțeles.

Fără îndoială, denumirea variabilelor pot fi tratate mult mai serios. De exemplu, există așa-numitul notație maghiară. Acest concept are o mulțime de opțiuni, dar ideea de bază este că fiecare nume de variabilă trebuie să înceapă cu un prefix care indică tipul variabilei. (De exemplu, toate variabilele de tip unsigned ul variabil lung trebuie să înceapă cu un prefix, etc.). În opinia mea, este deja prea mult, dar trebuie să știți despre existența și astfel de opțiuni. Puteți petrece o mulțime de timp suficient pentru încercarea de a face lucrurile mai clare, dar soluția la această problemă necesită, de asemenea, un oarecare efort.

Sfat 4. Verificați programul pentru erori. Faci face greșeli. Da, ești tu.

În cazul în care programul este suficient de mare, acesta va fi, probabil, o mulțime de funcții și proceduri. După cum se poate parea o corvoada, fiecare funcție / procedură ar trebui să fie verificate pentru erori.

Când creați orice proceduri / funcții trebuie să fie întotdeauna întrebat: „Să presupunem că un personaj negativ deranjate va da valori mai nepotrivite. Deoarece această bucată pufos de cod va fi în măsură să vă proteja și pentru a menține întregul program de a fi deteriorate? „Apoi scrie cod, astfel încât acesta verifică procedura / funcția în prezența unor astfel de date ostile și să le protejeze.

Luați în considerare următorul exemplu. Obiectivul principal al spațiului nostru minunat al jocului este de a ucide străinilor și de a câștiga puncte, așa că avem nevoie pentru a schimba procedura de puncte de un jucător. Mai mult decât atât, adunând punctele de jucător, am dori să numim o procedură care ar lumina scorul final destul de paiete. Primul exemplu de realizare este următoarea:

Până în prezent, atât de bine. Acum, întrebați-vă întrebarea: „Ce-i în acest cod nu poate fi atât“

În primul rând, un punct evident. Ce se întâmplă în cazul în care NUM_POINTS variabilă va avea o valoare negativă? Putem permite un cont de jucător a scăzut? Poate. Cu toate acestea, în descrierea jocului am avut anterior nu a menționat niciodată posibilitatea de a pierde puncte de jucător. În plus, jocul ar trebui să fie distractiv, iar acest lucru este contrar pierderea de puncte. Astfel, am ajuns la concluzia că un număr negativ de puncte - este o greșeală care trebuie să fie prins.

Acest exemplu a fost destul de simplu. Există, de asemenea, o problemă mai puțin evidentă (cu care ma confrunt în mod constant în jocurile lor). Ce se întâmplă dacă NUM_POINTS variabilă va fi zero?

Aceasta este o situație foarte plauzibilă. Nu uita că, la sfârșitul fiecărui val, vom da puncte bonus jucător în funcție de viteza de trecere sale. Ce se întâmplă dacă un jucător este prea lent pentru a acționa, și ne vom hotărî să-i dea 0 puncte? Este posibil ca, în timp ce lucrează la codul său de la 3am, vă decideți pentru a apela procedura change_score și îi conferă o valoare de 0.

În acest caz, problema este că vom cel mai probabil, nu doresc să decoreze scorul final de culoare festive, în cazul în care numărul de puncte nu este schimbat. Astfel, această situație este, de asemenea, necesitatea de a identifica. Să încercăm următorul cod:

Ei bine. Mult mai bine.

Vă rugăm să rețineți că a fost o functie foarte simpla. Este total lipsit de orice semne moderne, care sunt atât de pasionat de utilizarea impetuos programatori tineri. Dacă treci matrice sau indicii, cu siguranta ai nevoie pentru a oferi pentru identificarea unor erori sau date incorecte.

Avantajele acestei abordări nu sunt limitate la toleranța vina programului dumneavoastră. Bun pentru eroare de verificare a mecanismelor și accelerează depanare. Să presupunem că știi că undeva există o serie de date scrie în afară de unele matrice, și să vizualizați codul în căutarea unui loc în care acest lucru se poate întâmpla. Dacă sunt disponibile orice procedură toate mecanismele de control, nu trebuie să treacă prin ea pas cu pas în căutarea de erori.

Această abordare salvează o mulțime de timp și merită utilizarea regulată. Timpul - resursa cea mai valoroasă.

Sfat 5: "Optimizarea prematura - rădăcina tuturor relelor" - Donald Knuth (Donald Knuth).

Această frază nu este ideea mea. Cu toate acestea, este în Wikipedia, și așa mai departe, se pare, nu este lipsită de sens.

Nu Dacă obiectivul final este de a tortura oameni, că, atunci când scrierea de cod ar trebui să depună eforturi pentru a obține claritate maximă. simplu cod necesită mai puțin timp de scriere, înțelegerea data viitoare când este accesat, și depanare.

Optimizare - inamicul de claritate. Trebuie remarcat, totuși, că, în unele cazuri, este nevoie de optimizare. Acest lucru este valabil mai ales pentru jocuri. Cu toate acestea - și acest lucru este foarte important - aproape niciodată nu știu dinainte ce are nevoie de îmbunătățiri, atâta timp cât nu testați codul real de funcționare cu ajutorul unui instrument numit un profiler. (Profiler - este un program care monitorizează programul și estimează timpul necesar pentru a efectua anumite provocări Există un program minunat de acest tip găsi și de a folosi ...)

De fiecare dată când iau pentru optimizarea oricare din jocul lui, am venit mereu în uimire. Codul, care am fost îngrijorat mai presus de toate, funcționează întotdeauna perfect - și inhibă codul, pe care nu m-am gândit la asta. Din moment ce am avut nici o idee de cod ce va fi mai rapid, și ceea ce - este lent, timpul petrecut pe optimizarea pentru a obține date reale este irosit. În realitate, situația este chiar mai rău - în plus față de deșeuri inutile de timp această optimizare duce la un cod incurcate.

Urmați această regulă nu este ușor. Pe de altă parte, în caz contrar nu ar fi regula. „Bună“ cod de programare incomode enervant, chiar daca ruleaza mai repede.

Cu toate acestea, bucurați-vă! După predicile mele lungi pe care ar trebui să petreacă mai mult timp și mai mult timp pe ea, a venit o rară, de neprețuit atunci când vă spun că un pic de lene este destul de acceptabil!

Scrie program clar și de lucru. După aceea vei avea timp suficient să-l denatureze prin optimizare. Cu toate acestea, nu o fac, atâta timp până când sunteți absolut sigur că faci ceea ce trebuie.

Și, în sfârșit, din moment ce vorbim despre dureros, aici este piesa mea finală de sfat:

Sfat 6. Nu te inteligent.

Este posibil să fi auzit despre existența evenimentului sub numele ascuns pentru cod C Concursul Internațional - un concurs internațional pentru cele mai complicate codul software în C. Faptul este că limbile C și C ++, cu toate avantajele sale, se poate crea un cod de coșmar încurcat. Acest concurs demonstrează avantajul clar „pe contrară“ codului - prin acordarea de programatori mai nebuni. Grozavă idee.

Cu rezultatele acestui concurs este în valoare de lectură, dacă numai pentru a înțelege ce pagube mari pot fi aplicate prin intermediul unor cunoștințe enciclopedice a limbajului de programare, completată de lipsa rușinii de bază. Dacă există suficiente cunoștințe aveți posibilitatea să ghiftui zece linii de cod normale pe o singură linie. Pretul pentru acest lucru va fi redus - doar o incapacitate completă de a stabili rapid un bug în codul.

Principala lecție este aceasta. În cazul în care codul generat necesită cunoștințe detaliate a regulilor complicate de prioritate sau te face sa te uiti la ultimul capitol al unei cărți, pentru a înțelege exact ceea ce faci - înseamnă că ați început să filozofeze.

Fiecare programator are un nivel acceptabil de complexitate a codului generat. Personal, am scrie programele mele ca șoferi bunica tipic. În opinia mea, în cazul în care codul C necesită o înțelegere a diferențelor subtile între expresii i ++ și ++ i, atunci este prea complicat.

Dacă doriți, puteți lua în considerare mine plictisitor. Aveți dreptate. Cu toate acestea, am cheltui pe înțelegerea codul mult mai puțin timp decât ar fi altfel.

concluzie

Cu toate acestea, nu ar trebui să creadă că toate cele de mai sus este evident pentru toată lumea. De fapt, nu este. Cod apare prost scrise din nou și din nou - chiar și fără ca am fi putut face.

Dacă se face cu cantități mari de cod și nu doresc să moară sub sarcina lui, sper sincer că sfaturile mele te va ajuta. Straduiti pentru simplitate și claritate - aceasta vă va salva o mulțime de timp și de a scăpa de suferință inutilă.

Obțineți produse și tehnologii

  • Utilizați versiuni de încercare de produse software IBM. disponibil pentru descărcare direct de la developerWorks, următorul proiect de dezvoltare pe Linux.
  • Ia parte la forumul de discuții.
  • Alăturați-vă comunității developerWorks și citiți blogurile noastre dezvoltatori, forumuri, podcast-uri și subiecte comunitare în noul nostru portal de locuri de developerWorks.