This shows you the differences between two versions of the page.
|
programare:tutoriale:good_practices [2022/01/24 16:19] stefan.popa99 [Exemplu] |
programare:tutoriale:good_practices [2025/11/04 15:37] (current) cpatrascu1910 [Good practices] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Good practices ====== | ====== Good practices ====== | ||
| - | + | {{:pa:new_pa:partners:bitdefender_masterbrand_logo_positive.png?190 |}} | |
| - | <note> | + | Bitdefender este un lider recunoscut în domeniul securității IT, care oferă soluții superioare de prevenție, detecție și răspuns la incidente de securitate cibernetică. Milioane de sisteme folosite de oameni, companii și instituții guvernamentale sunt protejate de soluțiile companiei, ceea ce face Bitdefender unul dintre cei mai de încredere experți în combaterea amenințărilor informatice, în protejarea intimității și datelor, a identității digitale și în consolidarea rezilienței la atacuri. Compania a inovat constant în domenii precum antimalware, Internetul Lucrurilor, analiză comportamentală și inteligență artificială, iar tehnologiile Bitdefender sunt licențiate către peste 180 dintre cele mai cunoscute branduri de securitate din lume. |
| - | {{:programare:partners:logo:logo-bitdefender.png?200 |}} | + | |
| - | Bitdefender este un lider recunoscut în domeniul securității IT, care oferă soluții superioare de prevenție, detecție și răspuns la incidente de securitate cibernetică. Milioane de sisteme folosite de oameni, companii și instituții guvernamentale sunt protejate de soluțiile companiei, ceea ce face Bitdefender cel mai de încredere expert în combaterea amenințărilor informatice, în protejarea intimității și datelor și în consolidarea rezilienței la atacuri. Ca urmare a investițiilor susținute în cercetare și dezvoltare, laboratoarele Bitdefender descoperă 400 de noi amenințări informatice în fiecare minut și validează zilnic 30 de miliarde de interogări privind amenințările. Compania a inovat constant în domenii precum antimalware, Internetul Lucrurilor, analiză comportamentală și inteligență artificială, iar tehnologiile Bitdefender sunt licențiate către peste 150 dintre cele mai cunoscute branduri de securitate din lume. Fondată în 2001, compania Bitdefender are clienți în 170 de țări și birouri pe toate continentele. Mai multe detalii sunt disponibile pe www.bitdefender.ro. | + | |
| - | </note> | + | |
| **Resposabili**: | **Resposabili**: | ||
| Line 262: | Line 259: | ||
| === De ce? === | === De ce? === | ||
| - | Dacă tot codul pentru o aplicație ar fi scris într-o singură funcție, el ar fi foarte de greu de extins în cazul în care s-ar implementa o funcționalitate nouă. Majoritatea aplicațiilor importante au câteva sute de mii de linii de cod, iar urmărirea modificări unei variabile de-a lungul programului ar presupune o perioadă lungă de timp. | + | Dacă tot codul pentru o aplicație ar fi scris într-o singură funcție, el ar fi foarte de greu de extins în cazul în care s-ar implementa o funcționalitate nouă. Majoritatea aplicațiilor importante au câteva sute de mii de linii de cod, iar urmărirea modificării unei variabile de-a lungul programului ar presupune o perioadă lungă de timp. |
| === Cum? === | === Cum? === | ||
| Line 278: | Line 275: | ||
| Numele funcțiilor ar trebui să definească cât mai bine scopul acesteia. | Numele funcțiilor ar trebui să definească cât mai bine scopul acesteia. | ||
| - | == Câti parametrii ar trebui să aibă o funcție? == | + | == Câti parametri ar trebui să aibă o funcție? == |
| - | Nu este recomadat ca o funcție să conțină un număr foarte mare de parametrii (majoritatea funcțiilor au cel mult 6-7 argumente). Dacă există prea mulți parametrii, este dificil să se înțeleagă scopul acelei porțiuni de cod. | + | Nu este recomadat ca o funcție să conțină un număr foarte mare de parametri (majoritatea funcțiilor au cel mult 6-7 argumente). Dacă există prea mulți parametri, este dificil să se înțeleagă scopul acelei porțiuni de cod. |
| == Când ar trebui să am un parametru declarat const într-o funcție? == | == Când ar trebui să am un parametru declarat const într-o funcție? == | ||
| - | Este de preferat ca toți parametrii care sunt nu sunt constanți într-o funcție să fie marcați ca și ''%%const%%''. Astfel, la încercarea eronată de modificare a acestora, se va genera o eroare de compilare. | + | Este de preferat ca toți parametri care nu sunt modificați într-o funcție să fie marcați ca și ''%%const%%''. Astfel, la încercarea eronată de modificare a acestora, se va genera o eroare de compilare. |
| - | == Când este bine să trimit variabile parametrii la o funcție și când nu? == | + | == Când este bine să trimit variabile parametri la o funcție și când nu? == |
| Limbajul ''%%C%%'' folosește transmiterea prin valoare și nu prin referință a parametrilor unei funcții. Astfel, la apelul unei funcții se face o copie **într-o altă zonă de memorie** a argumentelor. | Limbajul ''%%C%%'' folosește transmiterea prin valoare și nu prin referință a parametrilor unei funcții. Astfel, la apelul unei funcții se face o copie **într-o altă zonă de memorie** a argumentelor. | ||
| Line 304: | Line 301: | ||
| ar fi necesară copierea a 30 de bytes dacă se dorește pasarea unei structuri ''%%student_t%%'' ca parametru. O modalitate de a evita copierea, este pasarea unui pointer la această structură. (sizeof(''%%student_t *%%'') = 4). | ar fi necesară copierea a 30 de bytes dacă se dorește pasarea unei structuri ''%%student_t%%'' ca parametru. O modalitate de a evita copierea, este pasarea unui pointer la această structură. (sizeof(''%%student_t *%%'') = 4). | ||
| - | Așadar, pentru structurile în limbajul ''%%C%%''se recomandă pasarea lor ca pointer. | + | Așadar, pentru structurile în limbajul ''%%C%%'' se recomandă pasarea lor ca pointer. |
| ==== Tips & tricks ==== | ==== Tips & tricks ==== | ||
| Line 353: | Line 350: | ||
| { | { | ||
| if (file_name == NULL) { | if (file_name == NULL) { | ||
| - | return FILE_SUCCESS; | + | return FILE_NULL_FILENAME; |
| } | } | ||
| Line 474: | Line 471: | ||
| * un mecanism de interschimbare a două valori de orice tip; | * un mecanism de interschimbare a două valori de orice tip; | ||
| - | Pentru a interschimba două valori de orice tip, ar trebui să ne gândim ce înseamnă a interschimba un element ''%%v[i]%%'' cu un alt element ''%%v[j]%%''? Cum v este de tipul ''%%void*%%'', nu este permis să folosim ''%%v[i]%%'',deoarece printr-un pointer ''%%void*%%'' nu știm ce elemente avem. Însă, cunoaștem dimensiunea unui ''%%singur%%'' element din vector - ''%%elem_size%%'', putem determina adresa de început al celui de-al i-lea element din vector, care va fi la ''%%v + i * elem_size%%'' . Pentru a interschimba valorile, vom copia cu funcția ''%%memcpy%%'' un număr de''%%elem_size%%'' bytes de la adresa determinată pentru elementul ''%%i%%'' într-un buffer temporar (similar cu ''%%temp = v[i];%%''), apoi copiem de la adresa corespunzătoare lui ''%%j%%'' la cea a lui ''%%i%%'' (similar cu ''%%v[i] = v[j];%%'', apoi din bufferul temporar la adresa corespunzătoare lui j (similar cu ''%%v[j] = tmp;%%''). | + | Pentru a interschimba două valori de orice tip, ar trebui să ne gândim ce înseamnă a interschimba un element ''%%v[i]%%'' cu un alt element ''%%v[j]%%''? Cum v este de tipul ''%%void*%%'', nu este permis să folosim ''%%v[i]%%'',deoarece printr-un pointer ''%%void*%%'' nu știm ce elemente avem. Însă, cunoaștem dimensiunea unui ''%%singur%%'' element din vector - ''%%elem_size%%'', putem determina adresa de început al celui de-al i-lea element din vector, care va fi la ''%%v + i * elem_size%%'' . Pentru a interschimba valorile, vom copia cu funcția ''%%memcpy%%'' un număr de ''%%elem_size%%'' bytes de la adresa determinată pentru elementul ''%%i%%'' într-un buffer temporar (similar cu ''%%temp = v[i];%%''), apoi copiem de la adresa corespunzătoare lui ''%%j%%'' la cea a lui ''%%i%%'' (similar cu ''%%v[i] = v[j];%%'', apoi din bufferul temporar la adresa corespunzătoare lui j (similar cu ''%%v[j] = tmp;%%''). |
| O posibilă implementare a funcției este următoarea: | O posibilă implementare a funcției este următoarea: | ||