Închis. Această întrebare este
off-topic . În prezent, nu acceptă răspunsuri.
Comentarii
Răspuns
Dacă continuu scriind mai multe coduri, atunci va fi un moment în care îmi va fi dificil să organizez codul.
Aceasta este problema ta: corectează organizația, iar stilul ar trebui să curgă mai ușor.
Nu „așteptați pentru a vă organiza codul: mențineți codul organizat pe măsură ce mergeți. Deși limba nu o face pentru dvs., codul ar trebui totuși organizat în module cu cuplare redusă și coeziune ridicată.
Aceste module oferă în mod natural un spațiu de nume. Abreviați numele modulului (dacă este lung) și prefixați numele funcțiilor cu modulul lor pentru a evita coliziunile.
La nivelul identificatorilor individuali, acestea sunt aproximativ în ordine crescândă de subiectivitate:
- alegeți o convenție și rămâneți cu ea
- de exemplu,
function_like_this(struct TypeLikeThis variable)
este obișnuit
-
evitați cu siguranță notația maghiară (scuze JNL)
-
dacă nu sunteți dispus să o folosiți așa cum a fost intenționat inițial, ceea ce înseamnă mai degrabă notația aplicații a lui Simonyi decât versiunea teribilă a sistemelor
De ce? Aș putea scrie un eseu despre acest lucru, dar vă voi sugera, în schimb, să citiți acest articol de Joel Spolsky și apoi să vânați în jurul altora dacă vă interesează. În partea de jos „există un link către hârtia originală a lui Simonyi.
-
evitați tipurile de pointer cu excepția cazului în care acestea sunt„ tipuri de cookie cu adevărat opace – doar ele confundați lucrurile
struct Type *ok; typedef struct Type *TypePtr; TypePtr yuck;
Ce vreau să spun cu un tip cookie opac ? Adică ceva folosit în interiorul unui modul (sau bibliotecă sau orice) care trebuie transmis către codul clientului, dar codul clientului respectiv nu poate utiliza direct. Doar îl trimite înapoi la bibliotecă.
De exemplu, o bibliotecă de baze de date ar putea expune o interfață precum
/* Lots of buffering, IPC and metadata magic held in here. No, you don"t get to look inside. */ struct DBContextT; /* In fact, you only ever get a pointer, so let"s give it a nice name */ typedef struct DBContexT *DBContext; DBContext db_allocate_context(/*maybe some optional flags?*/); void db_release_context(DBContext); int db_connect(DBContext, const char *connect); int db_disconnect(DBContext); int db_execute(DBContext, const char *sql);
Acum, contextul este opac pentru codul clientului, deoarece nu puteți „privi înăuntru. Pur și simplu îl trimiteți înapoi în bibliotecă. Ceva de genul FILE
este, de asemenea, opac și un descriptor de fișiere întregi este, de asemenea, un cookie , dar nu este opac.
O notă despre design
Am folosit fraza cuplare redusă și coeziune ridicată de mai sus fără explicații și mă simt puțin rău în legătură cu asta. Îl puteți căuta și, probabil, veți găsi câteva rezultate bune, dar voi încerca să îl abordez pe scurt (din nou, aș putea scrie un eseu, dar voi încerca să nu).
Biblioteca DB schițată mai sus arată cuplare redusă deoarece expune o interfață mică către lumea exterioară. Prin ascunderea detaliilor sale de implementare (parțial cu trucul opac al cookie-urilor), împiedică codul clientului să depindă de aceste detalii.
Imaginați-vă în locul cookie-ului opac, declarăm structura contextului astfel încât conținutul său să fie vizibil și care include un descriptor de fișier socket pentru o conexiune TCP la baza de date. Dacă modificăm ulterior implementarea pentru a accepta utilizarea unui segment de memorie partajată atunci când DB rulează pe aceeași mașină, clientul trebuie să fie recompilat, nu doar re-legat. Și mai rău, clientul ar fi putut începe să utilizeze descriptorul de fișiere, de exemplu apelând setsockopt
pentru a schimba dimensiunea tamponului implicit, iar acum are nevoie și de o modificare a codului. Toate aceste deta ar trebui să fie ascunse în interiorul modulului nostru acolo unde este practic, iar acest lucru oferă o cuplare redusă între module.
Exemplul arată, de asemenea, coeziune ridicată , în sensul că toate metodele din modul se referă la aceeași sarcină (acces DB). Aceasta înseamnă că numai codul care are nevoie să știe despre detaliile implementării (adică conținutul cookie-ului nostru) are de fapt acces la acestea, ceea ce simplifică depanarea.
Puteți vedea, de asemenea, că, având o singură preocupare, a fost ușor să alegeți un prefix pentru a grupa aceste funcții.
Acum, a spune că acest exemplu este bun este ușor (mai ales că nu este „chiar completat), dar nu te ajută imediat. Trucul este să urmăriți, pe măsură ce scrieți și extindeți codul, pentru funcții care fac lucruri similare sau care funcționează pe aceleași tipuri (care ar putea fi candidați la modulul lor), precum și pentru funcții care fac o mulțime de lucruri separate care nu sunt ” Este într-adevăr legat și ar putea fi candidați la divizare.
Comentarii
Răspuns
În opinia mea 90 % din problema numirii este rezolvată dacă aveți în vedere trei lucruri: a) faceți ca variabilele și funcțiile să fie descriptive ca posibil, b) să fie consecvent în întregul cod (adică, dacă o funcție este numită addNumbers, a doua funcție ar trebui să fie numită multiplyNumbers și nu numbersMul) și c) încercați să faceți numele scurte, dacă este posibil, deoarece trebuie să le tastăm.
Acestea fiind spuse, dacă doriți să aruncați o privire asupra altor aspecte pe acest subiect, pagina Wikipedia din Convenții de numire are o listă bună de lucruri pe care ar trebui să le ține minte. De asemenea, are o secțiune pe C și C ++:
În C și C ++, cuvintele cheie și identificatorii de bibliotecă standard sunt în mare parte minuscule. În biblioteca standard C, denumirile prescurtate sunt cele mai frecvente (de exemplu, isalnum pentru o funcție care testează dacă un caracter este alfanumeric), în timp ce biblioteca standard C ++ folosește adesea o subliniere ca separator de cuvinte (de ex. Out_of_range). Identificatorii care reprezintă macrocomenzi sunt, prin convenție, scrise utilizând numai litere mari și caractere de subliniere (acest lucru este legat de convenție în multe limbaje de programare de a utiliza identificatori cu majuscule pentru constante). Numele care conțin subliniere dublă sau care încep cu o subliniere și o literă majusculă sunt rezervate pentru implementare (compilator, bibliotecă standard) și nu ar trebui folosite (de ex. Acest lucru este asemănător superficial cu stropping, dar semantica diferă: sublinierile fac parte din valoarea identificatorului, mai degrabă decât citând caractere (așa cum este stropping): valoarea lui __foo este __foo (care este rezervată), nu foo (dar într-un spațiu de nume diferit).
Comentarii
Răspuns
Singura constrângere dură din C este că nu există spații de nume. Prin urmare, trebuie să găsiți o modalitate de a face funcția rename()
a bibliotecii sistemul de fișiere distinctă de rename()
funcția bibliotecii dvs. media . Soluția obișnuită este un prefix, cum ar fi: filesystem_rename()
și media_rename()
.
Celelalte sfaturi generale sunt: rămâneți consecvent în cadrul unui proiect sau al unei echipe. Citibilitatea va fi îmbunătățită.
Comentarii
Răspuns
DACĂ CĂUTĂȚI UN GLOBAL FORMAT ACCEPTAT
MISRA / JSF / AUTOSAR acoperă aproape 100% din orice standard industrial pentru denumirea și organizarea codului C / C ++. Problema este că acestea nu vor fi gratuite pentru a obține, adică fiecare dintre ghiduri costă niște bani. Știu că cartea standard de codificare MISRA 2008 C / C ++ costă probabil aproximativ 50 USD.
Vă puteți gândi la acestea ca referințe Harvard pentru bibliografie și citire suplimentară atunci când scrieți un jurnal. Am folosit MISRA și este o modalitate bună de a vă numi funcțiile și variabilele și de a le organiza pentru o utilizare adecvată.
DACĂ CĂUTAȚI CEVA TEMPORAR
Referințele pe care le-ați furnizat pentru Python și Java sunt în regulă, cred. Am văzut oameni adoptând stilul javadoc comentând, denumind și organizând codul. De fapt, în ultimul meu proiect, a trebuit să scriu cod C ++ în funcții Java / nume de variabile. Două motive care stau la baza acestui fapt:
1) Se pare că era mai ușor de urmat.
2) Cerințele privind codul de producție nu au atins temeiul standardelor de sistem software critice pentru siguranță.
3) Codul vechi era (cumva) în acel format.
4) Doxygen a permis comentariile Javadoc. În acel moment, foloseam doxygen pentru a genera documentație pentru tipii de producție.
Mulți programatori vor fi contrariul acestui lucru, dar eu personal cred că nu este nimic în neregulă cu adoptarea funcției de stil javadoc / denumirea variabilelor în C / C ++. DA CURS, practicile de organizare a controlului debitului, siguranța firului etc. trebuie abordate indiferent. Cu toate acestea, nu sunt solicitant aici. De asemenea, nu știu cât de stricte sunt cerințele dvs. privind formatul codului de producție. Fără să îl redirecționați către un domeniu care nu este subiect, vă sugerez să vă examinați cerințele, să aflați cât de dependenți sunteți de o anumită convenție de numire și să mergeți cu o soluție în răspunsurile mele și ale altora „
Sper că acest lucru a ajutat !?
Comentarii
Răspuns
Puține lucruri importante care trebuie luate în considerare în timpul numirii ar fi;
-
Uită-te la tipul actionObject sau ObjectAction. (Obiectul nu este pentru C. Dar, în general, când mergi la alte limbi orientate pe obiecte) Acest lucru ar trebui să vă ajute
-
Restul va fi CONSTANT, scurt și descriptiv sigur.
- De asemenea, aveți un singur scop al fiecărei variabile și funcții definite, de exemplu: dacă este pentru a stoca temporar o valoare, denumiți-o ca nTempVal pentru int
- Variabilele ar trebui să fie substantive, iar metodele ar trebui să fie verbale.
Comentarii
Răspuns
Majoritatea răspunsurilor sunt bune, dar vreau să spun câteva lucruri despre numire convenții pentru biblioteci și fișiere incluse, similar cu utilizarea spațiilor de nume în alte limbi precum C ++ sau Java:
Dacă construiți o bibliotecă, găsiți un prefix comun pentru simbolurile exportate, adică funcții globale, tipuri de caractere și variabile. Acest lucru va preveni ciocnirile cu alte biblioteci și va identifica funcțiile ca venind de la dvs. Acesta este un pic de notații maghiare în aplicații.
Poate mergeți mai departe și grupați simbolurile exportate: libcurl folosește curl_ * pentru simboluri globale, curl_easy_ *, curl_multi_ * și curl_share_ * pentru diferitele interfețe.Deci, pe lângă utilizarea curl_ * pentru toate funcțiile, au adăugat un alt nivel de „spații de nume” pentru diferitele interfețe: apelarea unei funcții curl_easy_ * pe un mâner curl_multi_ * pare acum greșit, consultați numele funcțiilor la http://curl.haxx.se/libcurl/c/
Păstrând regulile pentru simbolurile exportate, ar trebui să le utilizați pentru funcțiile statice din #include
fișiere ed: Încercați să găsiți un prefix comun pentru aceste funcții. Poate aveți funcții utilitare de șir static într-un fișier numit „șirul_meu”? Prefixați toate acele funcții cu my_string_ *.
Comentarii