OVH Cloud OVH Cloud

indentation switch

25 réponses
Avatar
Yalbrieux
Bonsoir,

Pour une question de lisibilité, j'ai l'habitude d'écrire les séquences
switch ainsi :

switch(..) {
case ... : {
... ;
break ;
}
...
}

(L'éditeur n'est évidemment pas d'accord avec cette indentation)

Qu'en pensez-vous ?
Yves

10 réponses

1 2 3
Avatar
drkm
"Yalbrieux" writes:

Pour une question de lisibilité, j'ai l'habitude d'écrire les séquences
switch ainsi :

switch(..) {
case ... : {
... ;
break ;
}
...
}


Je pense que c'est une solution fréquente (entre autres). Non ?

(L'éditeur n'est évidemment pas d'accord avec cette indentation)


Évidemment ? Pourquoi ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Fabien LE LEZ
On Thu, 26 Aug 2004 20:22:05 +0200, "Yalbrieux"
:

Qu'en pensez-vous ?


Si tu es de ceux qui ont choisi une indentation en

if (machin) {
truc;
}

ça me paraît totalement logique.

(L'éditeur n'est évidemment pas d'accord avec cette indentation)


Si l'éditeur n'est pas d'accord avec toi, il faut changer d'éditeur.


--
;-)

Avatar
Jean-Noël Mégoz
"Yalbrieux" a écrit dans le message de
news:cgl9uk$dms$
Bonsoir,

Pour une question de lisibilité, j'ai l'habitude d'écrire les séquences
switch ainsi :

switch(..) {
case ... : {
... ;
break ;
}
...
}



La lisibilité d'une indentation, sujet récurrent dans ce NG, reste très
subjective.
Ceci dit, dans le cas présent, pourquoi alourdir les "case" avec des
accolades alors qu'elles ne sont pas nécessaires ?

Avatar
drkm
"Jean-Noël Mégoz" writes:

"Yalbrieux" a écrit dans le message de
news:cgl9uk$dms$

Pour une question de lisibilité, j'ai l'habitude d'écrire les
séquences switch ainsi :

switch(..) {
case ... : {
... ;
break ;
}
...
}


La lisibilité d'une indentation, sujet récurrent dans ce NG, reste
très subjective.

Ceci dit, dans le cas présent, pourquoi alourdir les "case" avec des
accolades alors qu'elles ne sont pas nécessaires ?


Tout dépend de ce que représente « ... ». Que dire de :

switch ( ... ) {
case ... :
MyType my_object ;
... ;
break ;
case ... :
MyType my_object ;
... ;
break ;
}

comparé à :

switch ( ... ) {
case ... : {
MyType my_object ;
... ;
break ;
}
case ... : {
MyType my_object ;
... ;
break ;
}
}

? Je pense que c'est une bonne pratique, et généralement acceptée
comme telle, d'utiliser systématiquement des blocs, de manière à
éviter de mauvaises surprises.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html


Avatar
Michel Michaud
Dans news:,
Ceci dit, dans le cas présent, pourquoi alourdir les "case"
avec des accolades alors qu'elles ne sont pas nécessaires ?


Tout dépend de ce que représente « ... ». Que dire de :

switch ( ... ) {
case ... :
MyType my_object ;
... ;
break ;
case ... :
MyType my_object ;
... ;
break ;
}

comparé à :

switch ( ... ) {
case ... : {
MyType my_object ;
... ;
break ;
}
case ... : {
MyType my_object ;
... ;
break ;
}
}


Je trouve les deux très difficiles à lire et pas très logique.

switch ( ... )
{
case ... :
{
MonType monObjet;
...
break;
}

case ... :
{
MonAutreType monObjet;
...;
break;
}
}

:-) (je répète : :-) )

? Je pense que c'est une bonne pratique, et généralement
acceptée comme telle, d'utiliser systématiquement des blocs,
de manière à éviter de mauvaises surprises.


Si tu ne mets pas le bloc, dans ce cas-ci, tu auras une erreur.
J'ai l'impression (et James pourra confirmer, car il a vu plus
de standards de programmation différents que moi) que même ceux
qui mettent des {} dans tous les if/else/while/for n'en mettent
pas systématiquement dans les case... Alors je ne dirais pas
c'est une « bonne pratique, et généralement acceptée ... ».

En fait, je pense que si tu as besoin d'une variable dans le
bloc du switch, il vaut mieux appeler une fonction. Je crois
que mon switch idéal a toujours une seule instruction par
case, très semblable dans tous les cas. Je sais, on ne peut
pas toujours avoir l'idéal. :-(

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
drkm
"Michel Michaud" writes:

Dans news:,

Je pense que c'est une bonne pratique, et généralement
acceptée comme telle, d'utiliser systématiquement des blocs,
de manière à éviter de mauvaises surprises.


Si tu ne mets pas le bloc, dans ce cas-ci, tu auras une erreur.
J'ai l'impression (et James pourra confirmer, car il a vu plus
de standards de programmation différents que moi) que même ceux
qui mettent des {} dans tous les if/else/while/for n'en mettent
pas systématiquement dans les case... Alors je ne dirais pas
c'est une « bonne pratique, et généralement acceptée ... ».


Ce n'était peut-être pas très clair, mais le « je pense » portait à
la fois sur le fait d'être une bonne pratique, et sur celui d'être
acceptée comme telle. Je sais pertinemment que je n'ai pas assez
d'expérience de ce que font les autres.

Remarque que le fait de ne pas utiliser systématiquement quelque
chose ne veut pas dire que l'on ne pense pas qu'il s'agit d'une bonne
pratique.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html


Avatar
Jean-Marc Bourguet
drkm writes:

Je sais pertinemment que je n'ai pas assez d'expérience de ce que
font les autres.


Quand je vois la variabilite de ce qui est fait dans ma propre boite,
je me demande comment on peut avoir une idee de ce qui est fait
"generalement". Qu'on ait ou non de l'experience. Meme quelqu'un
comme James ou meme faisant des interventions plus courtes ne voit que
ce qui se passent dans les projets qu'il visite. Et il peut y avoir
des effets de caracteristique locale (a une region, a un domaine
d'activite) et d'auto-selection (on a tendance a frequenter/engager
que des gens qui pensent comme nous sur les points qu'on considere
important).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
"Yalbrieux" writes:

Bonsoir,

Pour une question de lisibilité, j'ai l'habitude d'écrire les séquences
switch ainsi :

switch(..) {
case ... : {
... ;
break ;
}
...
}


Ca me semble une pratique possible et si elle est coherente avec le
reste, pourquoi pas? Perso je n'ai jamais vu des conventions imposant
systematiquement des accolades et generalement on a tendance a passer
a des fonctions si elles sont necessaires.

(L'éditeur n'est évidemment pas d'accord avec cette indentation)


Ce n'est pas evident du tout. En la matiere, mon editeur fait ce que
je veux, pas ce qu'il veut.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
kanze
"Michel Michaud" wrote in message
news:<SnvXc.30377$...

Dans news:,
Ceci dit, dans le cas présent, pourquoi alourdir les "case"
avec des accolades alors qu'elles ne sont pas nécessaires ?


Tout dépend de ce que représente « ... ». Que dire de :

switch ( ... ) {
case ... :
MyType my_object ;
... ;
break ;
case ... :
MyType my_object ;
... ;
break ;
}

comparé à :

switch ( ... ) {
case ... : {
MyType my_object ;
... ;
break ;
}
case ... : {
MyType my_object ;
... ;
break ;
}
}



Que la légalité du premier dépend du type MyType. Mais j'imagine que
c'était précisement pour ça que tu as présenté les deux.

Je trouve les deux très difficiles à lire et pas très logique.

switch ( ... )
{
case ... :
{
MonType monObjet;
...
break;
}

case ... :
{
MonAutreType monObjet;
...;
break;
}
}


Question d'habitude. En général, j'ai l'habitude de mettre le break en
dehors des {}. C-à-d comme si la syntaxe d'un cas était :

"case" <constante> ":" "{" statement_list "}" "break" ";"

Ou avec mon indentation habituelle :

case whatever :
{
code ;
}
break ;

L'idée de base, c'est que le break appartient au case, et non au code
régi par le case.

Note aussi que j'utilise un style rigueureusement SESO ; il n'y aura
donc jamais de break dans les {}.

Mais c'est une règle que j'effreinds assez souvent. La plupart des mes
case sont extrèmenent simple : ou bien une seule affectation, ou bien
l'appel d'une fonction.

:-) (je répète : :-) )

? Je pense que c'est une bonne pratique, et généralement acceptée
comme telle, d'utiliser systématiquement des blocs, de manière à
éviter de mauvaises surprises.


Si tu ne mets pas le bloc, dans ce cas-ci, tu auras une erreur.


Seulement si MonType ou MonAutreTypeu a un constructeur non trivial.

J'ai l'impression (et James pourra confirmer, car il a vu plus de
standards de programmation différents que moi) que même ceux qui
mettent des {} dans tous les if/else/while/for n'en mettent pas
systématiquement dans les case... Alors je ne dirais pas c'est une
« bonne pratique, et généralement acceptée ... ».


La structure et l'indentation varient énormement, mais je n'ai jamais
vu des règles de programmation C++ qui permettaient un case sans {...}.
Or que celles qui les exigent pour les if/else/while/for sont plutôt
l'exception.

En C, c'était plutôt exceptionnel d'exiger les {} dans un case.

En fait, je pense que si tu as besoin d'une variable dans le bloc du
switch, il vaut mieux appeler une fonction. Je crois que mon switch
idéal a toujours une seule instruction par case, très semblable dans
tous les cas. Je sais, on ne peut pas toujours avoir l'idéal. :-(


Disons que ou bien, tu n'as qu'une ou deux instructions dans le switch,
ou bien, tu n'as qu'assez peu de case pour que le switch tient dans une
dizaine de lignes. Mais je suis comme toi -- j'ai rarement des case
complexe, et malgré les règles, j'ai une tendance à les écrire sans les
{}, simplement parce qu'il ne contient qu'une seule instruction.

C'est ancien, et ça poserait des problèmes avec mon code actuel, mais je
me rappelle bien d'un compilateur qui appelait systèmatiquement le
destructeur pour tous les temporaires dans le bloc quand il quittait le
bloc. Y compris pour ceux qui était dans les cases non executés. Donc,
même quelque chose d'extrèmement simple pourrait poser des problèmes
s'il n'y avait pas les {}.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
drkm
writes:

"Michel Michaud" wrote in message
news:<SnvXc.30377$...

Dans news:,

Ceci dit, dans le cas présent, pourquoi alourdir les "case"
avec des accolades alors qu'elles ne sont pas nécessaires ?


Tout dépend de ce que représente « ... ». Que dire de :

switch ( ... ) {
case ... :
MyType my_object ;
... ;
break ;
case ... :
MyType my_object ;
... ;
break ;
}

comparé à :

switch ( ... ) {
case ... : {
MyType my_object ;
... ;
break ;
}
case ... : {
MyType my_object ;
... ;
break ;
}
}



Que la légalité du premier dépend du type MyType.


Ah bon. Je ne savais pas. Je pensais que le premier était illégal,
point. Quelle est la règle, ici ? J'ai vu que tu parles plus loin du
fait d'avoir un constructeur non-trivial. Est-ce en rapport avec le
chemin d'exécution, en plus de la portée identique ?

Mais j'imagine que
c'était précisement pour ça que tu as présenté les deux.


Oui. Enfin, pas « précisément », puisque je pensais plus simplement
que le premier exemple était illégal.

[...]

Question d'habitude. En général, j'ai l'habitude de mettre le break en
dehors des {}. C-à-d comme si la syntaxe d'un cas était :

"case" <constante> ":" "{" statement_list "}" "break" ";"

Ou avec mon indentation habituelle :

case whatever :
{
code ;
}
break ;

L'idée de base, c'est que le break appartient au case, et non au code
régi par le case.


Très intéressant.

Note aussi que j'utilise un style rigueureusement SESO ; il n'y aura
donc jamais de break dans les {}.


SESO ? J'imagine, d'après le contexte, que cela doit signifier
quelque chose comme « pas de multiples return ou break, pas de goto ».

Mais c'est une règle que j'effreinds assez souvent. La plupart des mes
case sont extrèmenent simple : ou bien une seule affectation, ou bien
l'appel d'une fonction.


[...]

Si tu ne mets pas le bloc, dans ce cas-ci, tu auras une erreur.


Seulement si MonType ou MonAutreTypeu a un constructeur non trivial.


Quelle est exactement cette règle ? J'aurais dit que l'on ne
pouvait pas avoir dans un même bloc deux objets de même noms. Il y
aurait donc des exceptions. Quelles sont-elles ?

[...]

En fait, je pense que si tu as besoin d'une variable dans le bloc du
switch, il vaut mieux appeler une fonction. Je crois que mon switch
idéal a toujours une seule instruction par case, très semblable dans
tous les cas. Je sais, on ne peut pas toujours avoir l'idéal. :-(


Disons que ou bien, tu n'as qu'une ou deux instructions dans le switch,
ou bien, tu n'as qu'assez peu de case pour que le switch tient dans une
dizaine de lignes.


Heu, je n'arrive pas à comprendre cette phrase. À moins que ... En
remplaçant le premier « switch » par « case ».

Mais je suis comme toi -- j'ai rarement des case
complexe, et malgré les règles, j'ai une tendance à les écrire sans les
{}, simplement parce qu'il ne contient qu'une seule instruction.

C'est ancien, et ça poserait des problèmes avec mon code actuel, mais je
me rappelle bien d'un compilateur qui appelait systèmatiquement le
destructeur pour tous les temporaires dans le bloc quand il quittait le
bloc. Y compris pour ceux qui était dans les cases non executés. Donc,
même quelque chose d'extrèmement simple pourrait poser des problèmes
s'il n'y avait pas les {}.


Plutôt sympa, le compilo ;-)

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html




1 2 3