This shows you the differences between two versions of the page.
programare:tmp-acs-bd:tutoriale:good_practices [2022/01/21 01:12] darius.neatu created |
programare:tmp-acs-bd:tutoriale:good_practices [2022/01/21 01:29] (current) radu.nichita |
||
---|---|---|---|
Line 17: | Line 17: | ||
===== Cuprins ===== | ===== Cuprins ===== | ||
- | * [[#good-practices|Good practices]] | + | * [[#de_ce_cod_organizat|De ce cod organizat?]] |
- | * [[#cuprins|Cuprins]] | + | * [[#organizare_surse|Organizare surse]] |
- | * [[#de-ce-cod-organizat|De ce cod organizat?]] | + | * [[#exemplu|Exemplu]] |
- | * [[#organizare-surse|Organizare surse]] | + | * [[#coding_style|Coding-Style]] |
- | * [[#exemplu|Exemplu]] | + | * [[#modularizare_cod|Modularizare cod]] |
- | * [[#coding-style|Coding-Style]] | + | * [[#de_ce|De ce?]] |
- | * [[#modularizare-cod|Modularizare cod]] | + | * [[#cum|Cum?]] |
- | * [[#de-ce|De ce?]] | + | * [[#faq|FAQ]] |
- | * [[#cum|Cum?]] | + | * [[#când_fac_funcții|Când fac funcții?]] |
- | * [[#faq|FAQ]] | + | * [[#cum-aleg-numele-de-funcții|Cum aleg numele de funcții?]] |
- | * [[#când-fac-funcții|Când fac funcții?]] | + | * [[#câti-parametrii_ar_trebui_să_aibă_o_funcție|Câti parametrii ar trebui să aibă o funcție?]] |
- | * [[#cum-aleg-numele-de-funcții|Cum aleg numele de funcții?]] | + | * [[#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?]] |
- | * [[#câti-parametrii-ar-trebui-să-aibă-o-funcție|Câti parametrii ar trebui să aibă o funcție?]] | + | * [[#când_este_bine_să_trimit_variabile_parametrii_la_o_funcție_și_când_nu|Când este bine să trimit variabile parametrii la o funcție și când nu?]] |
- | * [[#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?]] | + | * [[#tips__tricks|Tips & tricks]] |
- | * [[#când-este-bine-să-trimit-variabile-parametrii-la-o-funcție-și-când-nu|Când este bine să trimit variabile parametrii la o funcție și când nu?]] | + | * [[#programare_defensivă|Programare defensivă]] |
- | * [[#tips--tricks|Tips & tricks]] | + | * [[#genericitate|Genericitate]] |
- | * [[#programare-defensivă|Programare defensivă]] | + | * [[#exemplu_de_funcție_generică|Exemplu de funcție generică]] |
- | * [[#genericitate|Genericitate]] | + | |
- | * [[#exemplu-de-funcție-generică|Exemplu de funcție generică]] | + | |
Materialul prezent își propune să prezinte câteva din modalitățile prin care putem face codul scris să poate fi ''%%înțeles%%'' și ''%%extins%%'' de o altă persoană, precum și câteva modalități de a scrie cod ''%%modularizat%%'', ce respectă un anumit stil de ''%%coding-style%%''. | Materialul prezent își propune să prezinte câteva din modalitățile prin care putem face codul scris să poate fi ''%%înțeles%%'' și ''%%extins%%'' de o altă persoană, precum și câteva modalități de a scrie cod ''%%modularizat%%'', ce respectă un anumit stil de ''%%coding-style%%''. | ||
Line 80: | Line 78: | ||
De multe ori, când lucrăm cu o funcție, dorim să cunoaștem **doar** ''%%modul de trimitere%%'' al parametrilor, nefiind necesară neapărat înțelegerea modului în care a fost scrisă funcția (de exemplu, pentru funcția ''%%fseek%%'' ne interesează rezultatul - că se mută cursorul în fișier, nu cum se face acest lucru în sistemul de operare). | De multe ori, când lucrăm cu o funcție, dorim să cunoaștem **doar** ''%%modul de trimitere%%'' al parametrilor, nefiind necesară neapărat înțelegerea modului în care a fost scrisă funcția (de exemplu, pentru funcția ''%%fseek%%'' ne interesează rezultatul - că se mută cursorul în fișier, nu cum se face acest lucru în sistemul de operare). | ||
- | Pentru a ''%%delimita%%'' partea de implementarea funcției de partea de întelegere a modului de apelare, folosim ''%%fișiere sursă%%'' (cu extensia ''%%.c%%'') și ''%%fișiere antet%%'' (sau header - cu extensia ''%%.h%%''). În ''%%fișierele header%%'' scriem: * ''%%semnăturile funcțiilor%%'' * tipuri noi de date definite de programator (structuri, uniuni, enum-uri) * constante / macrouri În ''%%fișierele sursă%%'' scriem: * ''%%implementările funcțiilor%%'' din header * implementările altor funcții care sunt folosite doar în fișierul curent (și declarate de obicei cu specificatorul ''%%static%%'') * alte tipuri de date / constante / macrouri care sunt folosite doar în fișierul în care sunt declarate | + | Pentru a ''%%delimita%%'' partea de implementarea funcției de partea de întelegere a modului de apelare, folosim ''%%fișiere sursă%%'' (cu extensia ''%%.c%%'') și ''%%fișiere antet%%'' (sau header - cu extensia ''%%.h%%''). În ''%%fișierele header%%'' scriem: |
+ | |||
+ | * ''%%semnăturile funcțiilor%%'' | ||
+ | * tipuri noi de date definite de programator (structuri, uniuni, enum-uri) | ||
+ | * constante / macrouri | ||
+ | |||
+ | În ''%%fișierele sursă%%'' scriem: | ||
+ | |||
+ | * ''%%implementările funcțiilor%%'' din header | ||
+ | * implementările altor funcții care sunt folosite doar în fișierul curent (și declarate de obicei cu specificatorul ''%%static%%'') | ||
+ | * alte tipuri de date / constante / macrouri care sunt folosite doar în fișierul în care sunt declarate | ||
Avantajele folosirii unei organizări logice și structurate în mai multe fișiere ne permite: | Avantajele folosirii unei organizări logice și structurate în mai multe fișiere ne permite: | ||
Line 125: | Line 133: | ||
} | } | ||
- | // print a vector | + | // print a vector |
// e.g. "[ 10, 20, 30 ]" | // e.g. "[ 10, 20, 30 ]" | ||
- | void print_vector(int n, int *v) | + | void print_vector(int n, int *v) |
{ | { | ||
printf("[ "); | printf("[ "); | ||
Line 136: | Line 144: | ||
} | } | ||
- | int main(void) | + | int main(void) |
{ | { | ||
int v[] = {2, 3, 5, 10}; | int v[] = {2, 3, 5, 10}; | ||
Line 182: | Line 190: | ||
} | } | ||
- | void sort_vector(int n, int* v) | + | void sort_vector(int n, int* v) |
{ | { | ||
for (int i = 0; i < n - 1; ++i) { | for (int i = 0; i < n - 1; ++i) { | ||
Line 195: | Line 203: | ||
} | } | ||
- | void print_vector(int n, int *v) | + | void print_vector(int n, int *v) |
{ | { | ||
printf("[ "); | printf("[ "); | ||
Line 222: | Line 230: | ||
#include "vector.h" | #include "vector.h" | ||
- | int main(void) | + | int main(void) |
{ | { | ||
Line 312: | Line 320: | ||
#include <stdlib.h> | #include <stdlib.h> | ||
- | int main(void) | + | int main(void) |
{ | { | ||
int n, *v; | int n, *v; | ||
Line 342: | Line 350: | ||
#define FILE_INNACESIBLE_FILE 2 | #define FILE_INNACESIBLE_FILE 2 | ||
- | int write_vector_file(int n, int *v, char* file_name) | + | int write_vector_file(int n, int *v, char* file_name) |
{ | { | ||
if (file_name == NULL) { | if (file_name == NULL) { | ||
Line 364: | Line 372: | ||
} | } | ||
- | int main(void) | + | int main(void) |
{ | { | ||
int v[] = {1, 2, 3, 4}; | int v[] = {1, 2, 3, 4}; | ||
Line 396: | Line 404: | ||
#include <stdlib.h> | #include <stdlib.h> | ||
- | int** alloc_matrix(int n, int m) | + | int** alloc_matrix(int n, int m) |
{ | { | ||
- | | + | |
int **mat = malloc(n * sizeof(int *)); | int **mat = malloc(n * sizeof(int *)); | ||
if (!mat) { | if (!mat) { | ||
Line 418: | Line 426: | ||
} | } | ||
- | void free_matrix(int n, int m, int** mat) | + | void free_matrix(int n, int m, int** mat) |
{ | { | ||
for (int i = 0; i < n; ++i) { | for (int i = 0; i < n; ++i) { | ||
Line 426: | Line 434: | ||
} | } | ||
- | int main(void) | + | int main(void) |
{ | { | ||
int n, m; | int n, m; | ||
Line 474: | Line 482: | ||
// generic_sort.c | // generic_sort.c | ||
- | void sort_vector(int n, void *v, int elem_size, int (*compare_function)(void *, void *)) | + | void sort_vector(int n, void *v, int elem_size, int (*compare_function)(void *, void *)) |
{ | { | ||
Line 480: | Line 488: | ||
if (!tmp) { | if (!tmp) { | ||
return; | return; | ||
- | } | + | } |
for (int i = 0; i < n - 1; ++i) { | for (int i = 0; i < n - 1; ++i) { | ||
for (int j = i + 1; j < n; j++) { | for (int j = i + 1; j < n; j++) { | ||
void *vi = (char *)v + i * elem_size; // address of the i-th element from vector <=> &v[i] | void *vi = (char *)v + i * elem_size; // address of the i-th element from vector <=> &v[i] | ||
- | void *vj = (char *)v + j * elem_size; // address of the j-th element from vector <=> &v[j] | + | void *vj = (char *)v + j * elem_size; // address of the j-th element from vector <=> &v[j] |
if (compare_function(vi, vj) > 0) { | if (compare_function(vi, vj) > 0) { | ||
memcpy(tmp, vj, elem_size); // tmp = v[j]; | memcpy(tmp, vj, elem_size); // tmp = v[j]; | ||
Line 537: | Line 545: | ||
} | } | ||
- | int main(void) | + | int main(void) |
{ | { | ||
int v[] = {2, 10, -3, 7}; | int v[] = {2, 10, -3, 7}; |