Que pensez-vous de la norme C imposée par certaines écoles ?
Posté le 31/12/2015 14:33
Plusieurs fois sur le forum ou le tchat ont éclaté des débats sur la norme de programmation en C qu'imposent certaines écoles d'informatique (42, Epitech, etc), qu'on peut appeler plus simplement la Norme. Pour rappel, en voici quelques points :
ne pas utiliser de boucle itérative (
for), mais les remplacer par des boucles conditionnelles (
while)
ne pas utiliser la forme
do { ... } while(...) mais seulement
while(...) { ... }
ne pas utiliser de
switch, mais selon le contexte des empilements de
if, ou des tableaux de pointeurs, etc
pas plus de 5 fonctions par fichier
pas plus de 25 lignes et 80 colonnes par fonction
pas d'opérateurs
++,
--,
+=,
-=,
*=,
/=, etc
+ diverses conventions d'espacement, indentation et nomination des variables
Et si vous avez le courage :
Norme de 42
Qu'en pensez-vous ? Pensez-vous qu'elle impose légitimement une rigueur, ou qu'au contraire elle bride inutilement les étudiants ?
NOTE : les premières réponses ont été importées d'un autre topic, d'où les dates antérieures.
Citer : Posté le 26/12/2015 17:28 | #
Ok, je n'aime pas les normes d'écriture mais je comprends qu'ils en utilisent une. Et puis pourquoi pas ?
Sauf que pour avoir lu la Leur et conversé avec un de ses auteurs, je trouve ça assez terrible que son but ne semble pas être de guider les élèves en leur donnant une syntaxe commune qui se ressemble globalement, mais de lister suffisamment de règles inutiles pour que tout le monde ait exactement le même programme au caractère près ! Alors que le C possède une telle liberté de syntaxe...
Ils défendent pour ça « guider les élèves, leur permettre de se relire les uns les autres » mais faut arrêter de déconner, les élèves qui font une piscine de deux semaines avec des pointeurs et des structures sont capables d'utiliser une boucle for et un switch -- tous deux interdits par la Norme.
Citer : Posté le 26/12/2015 17:47 | #
de lister suffisamment de règles inutiles pour que tout le monde ait exactement le même programme au caractère près !
Dans les faits, je vois peu de programmes/fonctions se répéter au caractère près à part ce qui est imposé au caractère près.
faut arrêter de déconner, les élèves qui font une piscine de deux semaines avec des pointeurs et des structures sont capables d'utiliser une boucle for et un switch -- tous deux interdits par la Norme
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses
Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme. Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction), mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...
Enfin, ce n'est qu'un détail de 42. Je préfère toujours ça que les devoirs relous (j'ai un pote qui est à la fac, je l'ai aidé sur deux-trois devoirs en Processing, je sais ce que c'est un peu o/)
Mon blog ⋅ Mes autres projets
Citer : Posté le 26/12/2015 18:14 | #
Dans les faits, je vois peu de programmes/fonctions se répéter au caractère près à part ce qui est imposé au caractère près.
Avec tout ce qui est imposé au caractère près... parlons concrètement : l'alignement du scope global. Voilà une règle typiquement inutile à mon regard... si tu arrives à me lui trouver une utilité, n'hésite pas à me tenir au courant.
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses
Oui, bien sûr, ça se défend. Mais alors qu'ils expliquent aux élèves comment le for, la stdlib et les entrées/sorties fonctionnent, qu'ils leur fassent réécrire printf() en entier s'ils le veulent, qu'ils leur fassent réimplémenter FILE, et puis une fois que tout ça est fait qu'ils leur laissent les utiliser ! Dans leur vie professionnelle il n'utiliseront jamais l'API d'Unix...
Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme.
Parce que j'ai une fois écrit un programme relativement conséquent (ben t'as dû le faire aussi non ? Le BSQ de l'année dernière) parfaitement fonctionnel sur ma machine et sur celle de la personne à 42 qui m'avait demandé de l'aider et qu'une fois ramené foireusement à le Norme, il ne fonctionnait plus qu'une fois sur deux sur ma machine, et une fois sur dix sur la sienne. Et je l'ai débuggué hein ! En long, en large, en travers et en détail... sans succès. Je dois avouer que ça a bien pourri cette Norme dans mon estime...
Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction)
Autant pour 5 fonctions par fichiers je ne comprends pas du tout l'intérêt. 5 ? Non, 4 arguments max par fonction -- du moins, avec la version avec laquelle je travaillais. C'est encore compréhensible parce que la justification se trouve, comme on me l'a exposé, dans les registres, mais empiler un argument n'est pas plus lent que le mettre dans un registre, et le C permettant de dépasser 4 arguments, je ne vois pas de raison de ne pas le faire (les élèves sont suffisamment intelligents pour comprendre si on leur dit qu'en général il vaut mieux se limiter à 4 arguments) : s'ils ne veulent absolument pas l'utiliser il faut faire du strict C89...
[...] mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...
Oui, mais elle fait beaucoup plus que ça -- beaucoup trop... pour l'anecdote, en-dehors du fait que je n'ai jamais vu dans une source un nom de structure/enum/typedef formaté selon la Norme, la moulinette elle-même possède un bug lié au passage de structures qui t'oblige à poser un typedef pour chaque structure. Ah ben bravo les bonnes habitudes !
Enfin, ce n'est qu'un détail de 42. Je préfère toujours ça que les devoirs relous (j'ai un pote qui est à la fac, je l'ai aidé sur deux-trois devoirs en Processing, je sais ce que c'est un peu o/)
C'est peut-être un peu fermé d'esprit de ma part de dire ça, mais même si je suis ouvert aux conventions et autres notations qui aident à progresser et/ou prendre des bonnes habitudes, ça fait 6 ans que je code en C, et je le fais beaucoup mieux sans leur Norme qu'avec. 25 lignes par fonction ? « Lol », aurais-je envie de leur répondre, « allez lire les sources de glibc, du moteur 3D Ogre, de Qt, ou de Webkit, et puis on en reparle ».
Citer : Posté le 26/12/2015 18:17 | #
Franchement, si les raccourcis existent, c'est pas pour rien… Qu'on vous apprenne à structurer un code, je trouve ça nécessaire, mais on a jamais appris l'histoire en oubliant volontairement (et refusant d'en parler) des évènements…
Enfin, je suis comme Lephe, je trouve ça bien d'imposer une "norme", par exemple indenter en K&R (même si je préfère le Allman) et utiliser la notation Snake. Mais de là à interdire l'utilisation de structures algorithmiques, je trouve ça profondément débile.
Citer : Posté le 31/12/2015 14:49 | #
ne pas utiliser de boucle itérative (for), mais les remplacer par des boucles conditionnelles (while)
Je trouve ça vraiment crétin. Les boucles itératives ont, pour moi, une utilisation complétement différente de celle de while. Devoir itérer un tableau avec un while est, pour moi, la manière la plus dégueulasse qui soit.
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... } (while)
Je n'utilise pas beaucoup do { ... } while(...) mais ça peux parfois être pratique
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc (while)
C'est crétin( j'adore ce mot ). J'ai déja fait un empilement de if et franchement, 1) c'est pas beau 2) ça prend de la place et même si on peut faire des else if() le switch reste beaucoup plus élégant.
pas plus de 5 fonctions par fichier (while)
Ben, du moment que les fonctions sont rangés logiquement, avoir un maximum me parait désuet En C++, il vont peut être dire pas plus de 5 méthodes par fichier
pas plus de 25 lignes et 80 colonnes par fonction
Heeeeeeeeeeeeeeeeeeeeeu..... Un fonction, pour ma part, est un code encapsulé suivant 2 règles, 1) elle est susceptible d'être appeler plusieurs fois et 2) elle doit faire une seul tâche.
Si la tâche requiert plus de 25 lignes, je vais devoir créer une autre fonction de moins de 25 lignes qui va n'être appeler qu'une seule fois( dans la fonction initiale) donc je trouve ça crétin. Car même si ça peut pousser à écrire du code minimal et très structuré, ça peut aussi créer de véritables merdes
pas d'opérateurs ++, --, +=, -=, *=, /=, etc
+ diverses conventions d'espacement, indentation et nomination des variables
Je trouve ça correct car ça uniformise un code. Il n'y a rien de plus dégueu qu'un code où les variables sont nommés à la j'en-ai-marre-de-vivre, etc
Citer : Posté le 31/12/2015 14:54 | #
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... } (while)
La forme do while est pratique dans le cadre où on effectue au moins un tour de boucle en l'utilisant. C'est une des bases du C, aucun intérêt de faire une norme concernant son interdiction.
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc (while)
Une fois de plus, le switch est une des bases du C, ça rend le code plus beau, plus lisible et plus optimisé qu'avec des if else, mais l'intérêt peut être d'utiliser les if et les else si ça peut aider à comprendre les bases mais bon...
pas d'opérateurs ++, --, +=, -=, *=, /=, etc
+ diverses conventions d'espacement, indentation et nomination des variables
Bon bah on va pas s'en plaindre, c'est mieux d'avoir cette norme que de commencer comme je l'ai fait, dégueulassement
En résumé, je trouve ça plutôt débile pour la plupart de ces normes, voilà tout...
Citer : Posté le 31/12/2015 14:54 | #
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... }
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses
C’est vrai, les raccourcis c’est sale et illisible ! on devrait faire ça proche du proco, on devrait seulement faire des sauts conditionnels avec de l’asm inline !
un switch peut toujours être remplacé par un tableau de pointeurs sur fonctions ! Par exemple, pour un :
switch(a){
case(3000) :
…
break;
case (0):
break;
default:
…
}
peut être avantagement remplacé par un tableau de pointeurs sur fonctions à 3001 cases, avec l’assurance d’un plantage si a valait plus de 3000 ! super non ?
et en plus même avec un empilement de if super propre : en faisant ça :
if (a==0 || a==3000){
if(a==3000) …
…
}
au lieu de
switch(a){
case(3000) :
…
case (0):
…
break;
default:
}
on gagne beaucoup en lisibilité et en vitesse vu qu’on fait plus de vérifications ! super !
Coïncidence ? Je ne pense pas.
Citer : Posté le 31/12/2015 15:05 | #
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses
Non tu ne peux pas comparer le for à des bibliothèques... Le for est une des entités de base de nombreux langages, et dans l'informatique impérative telle que je l'ai apprise, il est plus propre de servir du for dès qu'il y a une notion d'itération, et du while dès qu'il y a besoin d'une boucle avec un arrêt conditionnel, mais en aucun cas de mélanger les deux.
Ajouté le 31/12/2015 à 15:09 :
Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme. Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction), mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...
Tu l'as dit : "handicapante". Elle crée des contraintes, et plus on a de contraintes, moins on se concentre sur la réalisation d'un code propre et fonctionnel. Et non, ce n'est pas plus propre de coder avec la Norme. Au contraire un while pour une itération est sale à mon goût.
Citer : Posté le 31/12/2015 15:10 | #
Mais non voyons ! La "Norme", c'est juste parce qu'ils ont une flemme énorme de développer une moulinette correcte
Plus sérieusement, à l'IUT Info, on nous apprends le C au fur et à mesure, les "seules" règles (pour le moment du moins) :
Le programme doit fonctionner ()
Compiler sans Warnings avec la commande "gcc -std=c99 -Wall -Wextra -pedantic", et les quelques arguments nécessaires à chaque cas.
Le code source doit être arbitrairement lisible (tant qu'on indente, le prof se fiche qu'on mette 2,4 ou 8 espaces, qu'on utilise des tabulations...).
Respecter quelques conventions (surtout le nommage des variables, fonctions...).
Commenter.
Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi :
int fonction(int,int);
//Rôle : indique le rôle de la fonction.
//Pré-condition : conditions à remplir pour appeler cette fonction.
//Post-condition : ce que retourne la fonction selon les différents cas.
Citer : Posté le 31/12/2015 15:14 | #
+1 Louloux, nous on perd des points si on utilise à mauvais escient le for ou le while.
Et puis, c'est interessant de refaire les bases, ok. Mais à ce compte là pourquoi on refait pas les bases jusqu'à assembler le binaire à la main ?
Citer : Posté le 31/12/2015 15:20 | #
Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi :
int fonction(int,int);
[green]//Rôle : indique le rôle de la fonction.[/green]
[green]//Pré-condition : conditions à remplir pour appeler cette fonction.[/green]
[green]//Post-condition : ce que retourne la fonction selon les différents cas.[/green]
Je trouve pas ces commentaires très joli ni très explicite, pour ma part j'utilise:
Pour un fonction:
[green]
/*
* Rôle
*
* @param type nom fonction
* @return type fonction
* @throw exception condition
*/[/green]
int fonction(int,int);
Pour une variable:
[green]
/*
* Rôle
*
* @var type
*/[/green]
int variable;
C'est emprunté de PhpDoc que je trouve très bien structuré
Citer : Posté le 31/12/2015 16:17 | #
Je respecte juste les consignes du prof, et j'ai intérêt à le faire correctement
Après, on s'en fiche, tant qu'on comprend de quoi on parle.
Citer : Posté le 31/12/2015 18:05 | #
Mais non voyons ! La "Norme", c'est juste parce qu'ils ont une flemme énorme de développer une moulinette correcte
La moulinette de 42 possède des bugs d'ailleurs... exemple :
void f(struct s_object argument);
est invalide (outre le scope global). C'est respectueux de la Norme, mais pour que la moulinette passe il faut écrire :
typedef struct s_object t_object;
void f(t_object argument);
Le programme doit fonctionner ()
Compiler sans Warnings avec la commande "gcc -std=c99 -Wall -Wextra -pedantic", et les quelques arguments nécessaires à chaque cas.
Le code source doit être arbitrairement lisible (tant qu'on indente, le prof se fiche qu'on mette 2,4 ou 8 espaces, qu'on utilise des tabulations...).
Respecter quelques conventions (surtout le nommage des variables, fonctions...).
Commenter.
Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi [...]
Voilà enfin un peu de bon sens. Je trouve ça un peu bête de C99 (en C11 on a les variadic macros, les structures de données anonymes, plein de trucs utiles), et les définitions de fonctions un peu strictes peut-être, mais c'est presque du détail.
Citer : Posté le 31/12/2015 18:07 | #
Après, je sais pas si on va bosser que avec ça, là on fait des petits programmes tout simple, alors bon...
Citer : Posté le 31/12/2015 22:14 | #
A la fac c'est différent :
On peut utiliser les boucles for.
Dans un langage de programmation Orienté Objet, les professeurs nous obligent d'utiliser des COR ou des Abstract Factory à la place des switch.
pas plus de 25 lignes et 80 colonnes par fonction
Les fonctions doivent être courtes, mais il n'y a pas de valeur fixé
...lol
Bref la fac c'est moins stricte, mais ce n'est pas plus mauvais, on apprend quand même à bien programmer.
Citer : Posté le 31/12/2015 22:15 | #
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?
Citer : Posté le 31/12/2015 22:15 | #
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?
truc = truc + 1;
Citer : Posté le 31/12/2015 22:16 | #
Oh, bon, c'est pas si grave que ça, je pensais qu'on les utilisait pas du tout
Citer : Posté le 31/12/2015 22:17 | #
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?
truc = truc + 1;
Mais c'est con ?! En quoi c'est utile ? Ça ne donne pas plus de lisibilité, ça utilise plus de temps...
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 31/12/2015 22:18 | #
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?
truc = truc + 1;
Mais c'est con ?! En quoi c'est utile ? Ça ne donne pas plus de lisibilité, ça utilise plus de temps...
Je suis d'accord avec toi, après tu n'es pas obligé de respecter les normes.