Presque toutes les normes de codage peuvent paraître très logique à quelqu'un et très étrange à quelqu'un d'autres. Il faut dire aussi que les raisons pour l'existence de certaines de ces normes peuvent être valables dans un certains contextes et beaucoup plus discutable dans d'autres (Cas de la notation hongroise ci-dessus).
On rencontre même des gens contre des règles très reconnues comme "goto c'est le mal". Genre moi.
(image de xkcd)
3 fois le même programme, qui copie le contenu d'un fichier vers un autre fichier :
Sans goto, traitement normal en premier :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #include <stdlib.h> #include <stdio.h> int main() { char* lpBuffer; FILE* lpInputFile; FILE* lpOutputFile; int nSize; int nRes; nRes = 1; /* Open input file */ lpInputFile = fopen("input.txt", "rb"); if (lpInputFile) { /* Open output file */ lpOutputFile = fopen("output.txt", "wb"); if (lpOutputFile) { /* Retrieve size of the file */ fseek(lpInputFile, 0, SEEK_END); nSize = ftell(lpInputFile); fseek(lpInputFile, 0, SEEK_SET); /* Allocate a buffer to store input file content */ lpBuffer = (char*)malloc(nSize); if (lpBuffer) { /* Read from input file to buffer */ if (fread(lpBuffer, 1, nSize, lpInputFile) == nSize) { /* Write from buffer to output file */ if (fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize) { nRes = 0; } else { perror("Failed to write to output file"); } } else { perror("Failed to read input file"); } free(lpBuffer); } else { perror("Failed to allocate buffer"); } fclose(lpOutputFile); } else { perror("Failed to open output file"); } fclose(lpInputFile); } else { perror("Failed to open input file"); } return nRes; }
Sans goto, traitement d'erreur en premier :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #include <stdlib.h> #include <stdio.h> int main() { char* lpBuffer; FILE* lpInputFile; FILE* lpOutputFile; int nSize; int nRes; nRes = 1; /* Open input file */ lpInputFile = fopen("input.txt", "rb"); if (!lpInputFile) { perror("Failed to open input file"); } else { /* Open output file */ lpOutputFile = fopen("output.txt", "wb"); if (!lpOutputFile) { perror("Failed to open output file"); } else { /* Retrieve size of the file */ fseek(lpInputFile, 0, SEEK_END); nSize = ftell(lpInputFile); fseek(lpInputFile, 0, SEEK_SET); /* Allocate a buffer to store input file content */ lpBuffer = (char*)malloc(nSize); if (!lpBuffer) { perror("Failed to allocate buffer"); } else { /* Read from input file to buffer */ if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize) { perror("Failed to read input file"); } else { /* Write from buffer to output file */ if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize) { perror("Failed to write to output file"); } else { nRes = 0; } } free(lpBuffer); } fclose(lpOutputFile); } fclose(lpInputFile); } return nRes; }
Avec goto :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #include <stdlib.h> #include <stdio.h> int main() { char* lpBuffer; FILE* lpInputFile; FILE* lpOutputFile; int nSize; int nRes; nRes = 1; /* Open input file */ lpInputFile = fopen("input.txt", "rb"); if (!lpInputFile) { perror("Failed to open input file"); goto the_end; } /* Open output file */ lpOutputFile = fopen("output.txt", "wb"); if (!lpOutputFile) { perror("Failed to open output file"); goto close_input_file; } /* Retrieve size of the file */ fseek(lpInputFile, 0, SEEK_END); nSize = ftell(lpInputFile); fseek(lpInputFile, 0, SEEK_SET); /* Allocate a buffer to store input file content */ lpBuffer = (char*)malloc(nSize); if (!lpBuffer) { perror("Failed to allocate buffer"); goto close_output_file; } /* Read from input file to buffer */ if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize) { perror("Failed to read input file"); goto free_buffer; } /* Write from buffer to output file */ if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize) { perror("Failed to write to output file"); goto free_buffer; } nRes = 0; free_buffer: free(lpBuffer); close_output_file: fclose(lpOutputFile); close_input_file: fclose(lpInputFile); the_end: return nRes; }
Franchement, avec la première solution, il est très difficile de vérifier que les ressources sont fermées correctement. Et la deuxième me semble moins lisible que la troisième, mais c'est un peu subjectif peut être.
Et pour rappel, Linux est bourré de goto...
Partager