[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]![]() |
![]() |
![]() |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() |
![]() |
![]() |
In <sslug@sslug> Hans Schou <sslug@sslug> writes: >Må man have flere "return/exit" i en funktion? Må man udføre den sammme >operation to eller flere gange i samme funktion? Hvor mange indent må >der være i en funktion? Må en funktion være 2 skærmsider lang? Det er vel i stort omfang et spørgsmål om at skrive kode, der er let at læse - og forstå. Specielt hvad indentering angår er der jo flere forskellige religioner - og derfor kan mange editorer jo også automatisk re-formattere kildekode til den indentering man nu kan lide. Min erfaring er, at det især er i forbindelse med fejlhåndtering, at der bliver problemer. Det er jo også det, dit eksempel viser. Ved sådan noget fejl-håndtering kan selv den forkætrede "goto" jo være den pæneste løsning. F.eks. kunne dit eksempel jo også være skrevet: int ex3(void) { char *p1 = NULL, *p2 = NULL, *p3 = NULL; int n = 0; /* Alloker alle de buffere vi skal bruge */ p1 = malloc(256); if (!p1) goto cleanup; p2 = malloc(256); if (!p2) goto cleanup; p3 = malloc(256); if (!p3) goto cleanup; /* Generer data */ fill_with_data_1(p1); fill_with_data_2(p2); fill_with_data_3(p3); n = mixit(p1,p2,p3); cleanup: /* Ryd op */ if (p1) free(p1); if (p2) free(p2); if (p3) free(p3); return n; } hvilket efter min smag er lettere at læse. Det vigtige for mig er at det er let at se hvad denne funktion nu gør. Og i den forbindelse er fejl-håndterings kode "støj". Så kode i stil med dit eksempel 2 bliver meget let ulæseligt, hvis funktionen begynder at brede sig over mere end een skærmside - man mister simpelt hen overblikket over hvorfor man nu er indenteret ud i 8. niveau. Flere "return's" i een funktion - det er noget man skal være forsigtig med, ligesom "goto" fordi det bryder det normale flow i funktionen. Og hvis man finder ud af funktionen egentlig skal returnere med noget andet end man først troede, så kan det være svært at huske at få ændret alle return kaldene. Ja, en funktion må godt fylde mere end en skærmside - det er en helt arbitrær grænse. Hvilken skærmopløsning, f.eks. ? Hvorfor ikke "mere end een side print" ? På A0 papir, altså ... Det kommer igen tilbage til at skrive kode, der er til at forstå - og det betyder bl.a. at man skal kunne overskue funktionen. F.eks. bruger jeg ofte tilstands-maskiner i mine funktioner, og det er sjældent et problem når blot hvert "case" element er til at overskue. Blot mine 0.02 <whatever> Mvh, Henrik
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |