 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Fabien LE LEZ Guest
|
Posted: Wed Sep 14, 2005 9:39 am Post subject: Supprimer "private" |
|
|
Bonjour,
Soit une classe, avec un certain nombre de membres privés ou protégés,
dans un programme donné, terminé, qui fonctionne.
À cause d'un "friend" illégal[*], que gcc n'accepte pas, je souhaite
supprimer la ligne "friend XXX" et les "private:" et "protected:"[**].
Il me semble que cette modification ne changera pas le fonctionnement
du programme.
Quelqu'un pourrait-il confirmer ?
Merci d'avance.
[*] <http://www.comeaucomputing.com/techtalk/templates/#friendclassT>
[**] Oui, je sais, ce n'est pas forcément une idée géniale, mais comme
je ne compte pas pondre du code qui utilise directement ces classes,
je ne pense pas avoir besoin de la protection apportée par "private"
et "protected".
|
|
| Back to top |
|
 |
Laurent Deniau Guest
|
Posted: Wed Sep 14, 2005 10:14 am Post subject: Re: Supprimer "private" |
|
|
Bertrand Lenoir-Welter wrote:
| Quote: | A mon avis, les notions "public", "private" et "protected" sont surtout
utiles pour créer des librairies publiques ou pour travailler en groupe.
Pour un développeur seul sur un projet, je trouve leur intérêt limité
sinon nul, et j'ai tendance à tout mettre public dans mes classes.
Ceci n'est que mon opinion, hein.
De toute façon, ces définitions ne servent qu'à la compilation et au
link. A l'exécution, il n'y a pas de différence, du moins pas que je sache.
|
sauf dans l'heritage.
a+, ld.
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Wed Sep 14, 2005 10:14 am Post subject: Re: Supprimer "private" |
|
|
A mon avis, les notions "public", "private" et "protected" sont surtout
utiles pour créer des librairies publiques ou pour travailler en groupe.
Pour un développeur seul sur un projet, je trouve leur intérêt limité
sinon nul, et j'ai tendance à tout mettre public dans mes classes.
Ceci n'est que mon opinion, hein.
De toute façon, ces définitions ne servent qu'à la compilation et au
link. A l'exécution, il n'y a pas de différence, du moins pas que je sache.
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Sep 14, 2005 10:39 am Post subject: Re: Supprimer "private" |
|
|
"Bertrand Lenoir-Welter" <bertrand.2004 (AT) galaad (DOT) net> a écrit dans le message
de news:4327f7d1$0$17219$8fcfb975 (AT) news (DOT) wanadoo.fr...
| Quote: | A mon avis, les notions "public", "private" et "protected" sont surtout
utiles pour créer des librairies publiques ou pour travailler en groupe.
Pour un développeur seul sur un projet, je trouve leur intérêt limité
sinon nul, et j'ai tendance à tout mettre public dans mes classes.
Ceci n'est que mon opinion, hein.
|
Je pense que c'est une erreur.
Si ton projet est petit, probablement que cela ne te génera pas.
Mais si ton projet est conséquent ( même si tu es seul à bosser dessus ),
tu as tout intérêt à encapsuler correctement ton code, et là, la
notion de publique/private est très importante.
N'oublie pas que si tu dois te re-plonger dans ton code plusieures semaines,
voir
plusieurs mois après, si ton code n'est pas bien conçu à l'origine tu
t'arracheras les cheveux.
--
-Stan
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Sep 14, 2005 11:33 am Post subject: Re: Supprimer "private" |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | Bonjour,
Soit une classe, avec un certain nombre de membres privés ou protégés,
dans un programme donné, terminé, qui fonctionne.
À cause d'un "friend" illégal[*], que gcc n'accepte pas, je souhaite
supprimer la ligne "friend XXX" et les "private:" et "protected:"[**].
Il me semble que cette modification ne changera pas le fonctionnement
du programme.
Quelqu'un pourrait-il confirmer ?
|
A priori, pour un changement de fonctionnement du programme, tu veux
du code correct avant et apres. Je ne vois que la resolution de
surcharge (en y mettant les conversions implicites) et les templates
pour arriver a cela. Or private et protected ne change que les droits
d'acces, pas la visibilite, ce qui me semble exclure que la resolution
de surcharge puisse changer la semantique.
class C1 {
public:
int f(int);
private:
int f(double);
};
int g1(double d)
{
C1 c;
return c.f(d);
}
n'est pas correct (C::f(double) n'est pas accessible, mais c'est quand
meme la solution choisie par la resolution de surcharge), tandis que
class C2 {
public:
int f(int);
};
int g2(double d)
{
C c;
return c.f(d);
}
l'est (il y a une conversion implicite).
Je ne vois pas de changement de semantique possible dans les cas
simples.
Maintenant si tu joues avec les templates et en particulier le
principe SFINAE, la je ne reponds pas a la question: je ne serais pas
surpris que les techniques de meta-programmation arrive a detecter le
cas et faire des choses differentes avec C1 et C2 (mais je ne connais
pas la methode).
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
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Sep 14, 2005 11:35 am Post subject: Re: Supprimer "private" |
|
|
Bertrand Lenoir-Welter <bertrand.2004 (AT) galaad (DOT) net> writes:
| Quote: | A mon avis, les notions "public", "private" et "protected" sont surtout
utiles pour créer des librairies publiques ou pour travailler en
groupe. Pour un développeur seul sur un projet, je trouve leur intérêt
limité sinon nul, et j'ai tendance à tout mettre public dans mes classes.
Ceci n'est que mon opinion, hein.
De toute façon, ces définitions ne servent qu'à la compilation et au
link. A l'exécution, il n'y a pas de différence, du moins pas que je sache.
|
Encapsuler c'est utile pour s'assurer qu'on ne depend pas de chose qui
sont des "details d'implementation". C'est donc en particulier utile
pour celui qui connait bien l'implementation...
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
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Wed Sep 14, 2005 1:50 pm Post subject: Re: Supprimer "private" |
|
|
Stan :
| Quote: | Si ton projet est petit, probablement que cela ne te génera pas.
|
318000 lignes à ce jour. Je sais pas si c'est petit ou gros. Pour moi,
c'est devenu très gros et peut-être même trop gros, mais je fais avec.
| Quote: | Mais si ton projet est conséquent ( même si tu es seul à bosser dessus ),
tu as tout intérêt à encapsuler correctement ton code, et là, la
notion de publique/private est très importante.
|
Je suis d'accord sans l'être. A mon avis, seule la lisibilité change
quand on bosse seul ou en équipe, et là ça devient moins lié à
l'utilisation de parties publiques ou privées/protégées que de
structuration générale. Un commentaire de 3 mots au bon endroit fait
beaucoup plus qu'une encapsulation orthodoxe.
| Quote: | N'oublie pas que si tu dois te re-plonger dans ton code plusieures semaines,
voir plusieurs mois après, si ton code n'est pas bien conçu à l'origine tu
t'arracheras les cheveux.
|
Je modifie parfois du code qui date de quelques années en arrière. Quand
c'est écrit avec les pieds, je m'arrache les cheveux. Quand c'est écrit
avec la tête, la méthode d'encapsulation perd toute son importance.
Bon, c'est vrai qu'il vaut mieux coder dans les règles. Mais j'ai aussi
des fonctions dont les droits d'accès changent au fil de la vie du
projet. Sincèrement, le fait de tout mettre en public n'est vraiment pas
mon problème majeur à la relecture.
J'insiste sur le fait que le fait de bosser en équipe change tout.
Mais la question portait sur l'exécution même du code, il me semble. Je
ne pense pas que l'assembleur généré diffère pour une fonction publique
ou privée/protégée.
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Sep 14, 2005 2:23 pm Post subject: Re: Supprimer "private" |
|
|
"Bertrand Lenoir-Welter" <bertrand.2004 (AT) galaad (DOT) net> a écrit dans le message
de news:43282a85$0$1014$8fcfb975 (AT) news (DOT) wanadoo.fr...
| Quote: | Stan :
Si ton projet est petit, probablement que cela ne te génera pas.
318000 lignes à ce jour. Je sais pas si c'est petit ou gros. Pour moi,
c'est devenu très gros et peut-être même trop gros, mais je fais avec.
|
Si c'est ce que t'indique ton compilo, ça ne veut rien dire;
si c'est réellement le nombre de lignes que _tu_ as codé, c'est
pas mal.
| Quote: | Mais si ton projet est conséquent ( même si tu es seul à bosser
dessus ),
tu as tout intérêt à encapsuler correctement ton code, et là, la
notion de publique/private est très importante.
Je suis d'accord sans l'être. A mon avis, seule la lisibilité change
quand on bosse seul ou en équipe, et là ça devient moins lié à
l'utilisation de parties publiques ou privées/protégées que de
structuration générale. Un commentaire de 3 mots au bon endroit fait
beaucoup plus qu'une encapsulation orthodoxe.
|
Résumer la fiabilité d'un source à sa seule lisibilité est une grave erreur.
Des sources très lisibles avec une hiérarchie de classes boiteuse réservera
sans doute des erreurs ( le pire, à l'execution...).
| Quote: |
N'oublie pas que si tu dois te re-plonger dans ton code plusieures
semaines,
voir plusieurs mois après, si ton code n'est pas bien conçu à l'origine
tu
t'arracheras les cheveux.
Je modifie parfois du code qui date de quelques années en arrière. Quand
c'est écrit avec les pieds, je m'arrache les cheveux. Quand c'est écrit
avec la tête, la méthode d'encapsulation perd toute son importance.
|
Je ne connais aucun cas où l'on peut prétende négliger l'encapsulation.
| Quote: | Bon, c'est vrai qu'il vaut mieux coder dans les règles. Mais j'ai aussi
des fonctions dont les droits d'accès changent au fil de la vie du
projet. Sincèrement, le fait de tout mettre en public n'est vraiment pas
mon problème majeur à la relecture.
|
Si les droits d'accès changent au cours du projet, c'est sans doute
dû à un problème d'analyse.
| Quote: | J'insiste sur le fait que le fait de bosser en équipe change tout.
|
Personnellement, j'ai constaté que les méthodes de groupes
avaient un grand intérêt même en solo.
Pense à celui qui reprendra le projet derrière toi...
| Quote: |
Mais la question portait sur l'exécution même du code, il me semble. Je
ne pense pas que l'assembleur généré diffère pour une fonction publique
ou privée/protégée.
|
Oui, mais quand on donne son opinion sur quelque chose, il faut
s'attendre à des réactions ;-)
--
-Stan
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Wed Sep 14, 2005 3:02 pm Post subject: Re: Supprimer "private" |
|
|
Stan :
| Quote: | Si c'est ce que t'indique ton compilo, ça ne veut rien dire;
|
Certes, je suis pas bête à ce point. Lui m'affiche plusieurs millions.
| Quote: | si c'est réellement le nombre de lignes que _tu_ as codé, c'est
pas mal.
|
Je me suis fait un petit outil pour satisfaire ma curiosité, outil qui
élimine les commentaires et les lignes qui ne contiennent pas au moins
un point-virgule ou une virgule (pour les déclarations de variables).
Donc 318000 et quelques lignes de code perso et actif.
| Quote: | Résumer la fiabilité d'un source à sa seule lisibilité est une grave erreur.
|
Mais j'ai pas dit ça.
| Quote: | Je ne connais aucun cas où l'on peut prétende négliger l'encapsulation.
|
J'ai pas dit ça non plus. Seulement que la répartition public/private
n'a de sens qu'à la compilation et plus aucun à l'exécution, et que son
intérêt faiblit beaucoup dans le cas d'un projet où l'on bosse seul. Je
n'ai pas extrapolé.
| Quote: | Si les droits d'accès changent au cours du projet, c'est sans doute
dû à un problème d'analyse.
|
Certes. Mais quand vous avez un projet avec 318000 lignes de code qui
évolue depuis 6 ans, vous accordez plus facilement quelques
circonstances atténuantes à votre propre analyse lointainement passée.
En théorie statique, on a un projet bouclé, bien analysé, bien codé,
bien encapsulé. En pratique dynamique, ça devient un peu plus flou...
Si je regarde mon analyse d'il y a 6 ans au vu du projet aujourd'hui,
c'est pas bon sur plusieurs points. Si je regarde mon analyse au vu du
projet de l'époque, ça devient acceptable. Mais les projets évoluent
avec les demandes des utilisateurs, lesquelles sont la plupart du temps
imprévisibles. Je suis pas Madame Irma.
Bon, on est sorti de la route, là.
| Quote: | Personnellement, j'ai constaté que les méthodes de groupes
avaient un grand intérêt même en solo.
|
J'ai pas dit le contraire non plus. Mais on a chacun ses manies et ses
tics. Personnellement, je mets tout en public et ça m'a jamais causé de
souci. Je milite pas pour ça, hein, pas de quiproquo... Chacun fait ce
qu'il veut sauf s'il travaille en équipe. Mais c'est pas mon cas.
| Quote: | Pense à celui qui reprendra le projet derrière toi...
|
Personne. Mais je persiste à penser qu'un bon commentaire fait gagner
plus de temps qu'une répartition public/private dans les formes.
| Quote: | Oui, mais quand on donne son opinion sur quelque chose, il faut
s'attendre à des réactions
|
Tout à fait. Mon opinion est qu'un projet solo bien ficelé est un projet
1- qui fonctionne et 2- qu'on arrive à maintenir. Après, chacun voit
midi à sa porte sur la façon d'y arriver. Je préfère un code astucieux
et mal écrit qu'un code orthodoxe qui déconne. Oui, oui, vous préférez
un code astucieux et orthodoxe. Mais sur un gros projet solo et
évolutif, vous comprenez bien qu'on fait au mieux avec ce qu'on sait
faire dans l'instant, pourvu que ça fonctionne bien.
J'ajoute que le fait d'avoir un code pas toujours clairement lisible m'a
plusieurs fois permis de l'améliorer a posteriori en cherchant à
comprendre ce que j'avais écrit quelques années plus tôt. Vu avec un
oeil neuf, c'est parfois magiques les idées nouvelles qu'on peut y
appliquer. Moins évident quand la lecture est très implicite. Bon, je
vais me faire incendier. Pourtant, c'est ce que j'ai constaté.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Sep 14, 2005 4:00 pm Post subject: Re: Supprimer "private" |
|
|
On Wed, 14 Sep 2005 17:02:39 +0200, Bertrand Lenoir-Welter
<bertrand.2004 (AT) galaad (DOT) net>:
| Quote: | J'ai pas dit ça non plus. Seulement que la répartition public/private
n'a de sens qu'à la compilation et plus aucun à l'exécution, et que son
intérêt faiblit beaucoup dans le cas d'un projet où l'on bosse seul.
|
Si tu arrives à te rappeler toutes les idiosyncrasies de toutes tes
classes, des mois ou des années après, je te félicite. Moi, après
trois jours, j'ai déjà du mal.
Un petit exemple :
template <class T> class Faillible
{
public:
...
T GetValeur() const
{
assert (Ok());
return valeur;
}
bool Ok() const { return ok; }
private:
T valeur;
bool ok;
};
On ne doit jamais lire le contenu de "valeur" si "ok" est à "false".
(Si "T" est un pointeur, la ligne "return valeur;" génère un
comportement indéfini.)
Sans "private:", tu dois le vérifier, à chaque fois que tu utilises
cette classe, que tu modifies (directement ou indirectement) le code
qui l'utilise, etc.
Avec "private:", le compilateur le fait pour toi -- il n'y a pas moyen
d'utiliser cette classe de manière incorrecte sans générer une erreur.
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Wed Sep 14, 2005 4:08 pm Post subject: Re: Supprimer "private" |
|
|
Stan :
| Quote: | Si tu utilises une hierarchie de classes ou tout est public,
tu as le risque d'avoir des gros pb à l'execution et ce sans
la moindre erreur de compilation.
|
Un exemple ?
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Sep 14, 2005 4:09 pm Post subject: Re: Supprimer "private" |
|
|
"Bertrand Lenoir-Welter" <bertrand.2004 (AT) galaad (DOT) net> a écrit dans le message
de news:43283b88$0$986$8fcfb975 (AT) news (DOT) wanadoo.fr...
| Quote: |
J'ai pas dit ça non plus. Seulement que la répartition public/private
n'a de sens qu'à la compilation et plus aucun à l'exécution, et que son
|
Non.
Si tu utilises une hierarchie de classes ou tout est public,
tu as le risque d'avoir des gros pb à l'execution et ce sans
la moindre erreur de compilation.
Evidemment, tu as toujours le recours de mettre 3 lignes
de commentaire au dessus de chaque méthode pour
décrire la manière dont elle est censé être utilisé;
mais je pense que le compilateur est plus
performant pour détecter les anomalies.
--
-Stan
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Wed Sep 14, 2005 4:14 pm Post subject: Re: Supprimer "private" |
|
|
Fabien LE LEZ :
| Quote: | T GetValeur() const
{
assert (Ok());
return valeur;
}
|
Fabien, trouve un exemple où ce genre de code a un sens sérieux et
incontournable. Personnellement, j'écrirai jamais un truc comme ça.
| Quote: | Avec "private:", le compilateur le fait pour toi -- il n'y a pas moyen
d'utiliser cette classe de manière incorrecte sans générer une erreur.
|
T'es en train de me dire qu'un private te permet de ne pas te conduire
comme un abruti total. Certes, mais c'est très limité et ça ne
t'empêchera pas de commettre tes conneries plus loin. On est entre gens
sérieux, non ?
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Sep 14, 2005 4:33 pm Post subject: Re: Supprimer "private" |
|
|
On Wed, 14 Sep 2005 18:14:49 +0200, Bertrand Lenoir-Welter
<bertrand.2004 (AT) galaad (DOT) net>:
| Quote: | Fabien, trouve un exemple où ce genre de code a un sens sérieux et
incontournable.
|
<news:1124814098.442571.206130 (AT) g47g2000cwa (DOT) googlegroups.com>
<news:430c2560$0$18591$636a15ce (AT) news (DOT) free.fr>
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Sep 14, 2005 4:39 pm Post subject: Re: Supprimer "private" |
|
|
On Wed, 14 Sep 2005 18:14:49 +0200, Bertrand Lenoir-Welter
<bertrand.2004 (AT) galaad (DOT) net>:
| Quote: | T'es en train de me dire qu'un private te permet de ne pas te conduire
comme un abruti total.
|
J'avais des doutes sur le caractère trollatif de ton intervention ;
ils sont levés...
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|