Merci pour vos commentaires!
Je me doutais bien que beaucoup déconseilleraient ce design, mais
jusqu'à maintenant, je n'ai pas encore vu de description des problèmes
*précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier énormément les
écritures et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Merci pour vos commentaires!
Je me doutais bien que beaucoup déconseilleraient ce design, mais
jusqu'à maintenant, je n'ai pas encore vu de description des problèmes
*précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier énormément les
écritures et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Merci pour vos commentaires!
Je me doutais bien que beaucoup déconseilleraient ce design, mais
jusqu'à maintenant, je n'ai pas encore vu de description des problèmes
*précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier énormément les
écritures et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Juste un élément supplémentaire pour aller dans le même sens... Comment
ferais-tu dans la version 2 du logiciel où l'on te demande de gérer les
voitures bicolores ?
Juste un élément supplémentaire pour aller dans le même sens... Comment
ferais-tu dans la version 2 du logiciel où l'on te demande de gérer les
voitures bicolores ?
Juste un élément supplémentaire pour aller dans le même sens... Comment
ferais-tu dans la version 2 du logiciel où l'on te demande de gérer les
voitures bicolores ?
On Sat, 12 Aug 2006 13:26:22 +0200, Olivier Croquette :class Position {
public:
SetPosition(...);
protected:
double x,y;
}
J'oubliais les deux autres problèmes, qui sont sans doute des
fautes de frappe :
- il manque le point-virgule à la fin ;
- il manque le destructeur virtuel.
On Sat, 12 Aug 2006 13:26:22 +0200, Olivier Croquette :
class Position {
public:
SetPosition(...);
protected:
double x,y;
}
J'oubliais les deux autres problèmes, qui sont sans doute des
fautes de frappe :
- il manque le point-virgule à la fin ;
- il manque le destructeur virtuel.
On Sat, 12 Aug 2006 13:26:22 +0200, Olivier Croquette :class Position {
public:
SetPosition(...);
protected:
double x,y;
}
J'oubliais les deux autres problèmes, qui sont sans doute des
fautes de frappe :
- il manque le point-virgule à la fin ;
- il manque le destructeur virtuel.
Je me doutais bien que beaucoup déconseilleraient ce design,
mais jusqu'à maintenant, je n'ai pas encore vu de description
des problèmes *précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier
énormément les écritures
et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Je me doutais bien que beaucoup déconseilleraient ce design,
mais jusqu'à maintenant, je n'ai pas encore vu de description
des problèmes *précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier
énormément les écritures
et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Je me doutais bien que beaucoup déconseilleraient ce design,
mais jusqu'à maintenant, je n'ai pas encore vu de description
des problèmes *précis* auxquels cela expose.
De mon côté, j'y vois le gros avantage de simplifier
énormément les écritures
et de limiter la quantité de code trivial, genre:
void Vehicule::SetPosition(x,y) { this->position.Set(x,y); }
ou bien:
Position &Vehicule::GetPositionRef() { return this->position; }
et ce pour chaque attribut.
Fabien LE LEZ wrote on 12/08/2006 13:37:1- Une position n'a pas de position.
au primaire on apprend "être" et "avoir"; ici une position est
un état.
Si tu écris
Position ma_position;
ma_position.SetPosition (...);
tu écris "la position de la position ma_position est ...".
Ça n'a pas de sens.
alors que dans "Position point;" 'point' a bien une position;
voulais-tu seulement dire qu'il peut toujours exister une
(mauvaise) façon de présenter qui permet de balayer le fond en
raillant la forme ?
2- Ton héritage indique qu'un véhicule *est* une position.
Là non plus, ça n'a pas de sens.
tu disais "a une position", tu te contredis juste pour
contredire le PO?
une véhicule a bien une position, non ?
En fait, pour régler ces deux problèmes, il suffit de
changer le nom de la classe, et de l'appeler
"ObjetAyantUnePosition".
ou encore
"ClasseQuiPeutEtreEtenduParQuelqueChoseQuiPeutEtreOuAvoirUnePosition",
mais bon c'est un peu long ...3- Des variables membres presque publiques, puisqu'une autre
classe peut y accéder. Tôt ou tard, ça te causera des
problèmes. D'une manière générale, toutes les variables
membres doivent être privées.
d'une manière générale, il faut se méfier des généralités ;)
Fabien LE LEZ wrote on 12/08/2006 13:37:
1- Une position n'a pas de position.
au primaire on apprend "être" et "avoir"; ici une position est
un état.
Si tu écris
Position ma_position;
ma_position.SetPosition (...);
tu écris "la position de la position ma_position est ...".
Ça n'a pas de sens.
alors que dans "Position point;" 'point' a bien une position;
voulais-tu seulement dire qu'il peut toujours exister une
(mauvaise) façon de présenter qui permet de balayer le fond en
raillant la forme ?
2- Ton héritage indique qu'un véhicule *est* une position.
Là non plus, ça n'a pas de sens.
tu disais "a une position", tu te contredis juste pour
contredire le PO?
une véhicule a bien une position, non ?
En fait, pour régler ces deux problèmes, il suffit de
changer le nom de la classe, et de l'appeler
"ObjetAyantUnePosition".
ou encore
"ClasseQuiPeutEtreEtenduParQuelqueChoseQuiPeutEtreOuAvoirUnePosition",
mais bon c'est un peu long ...
3- Des variables membres presque publiques, puisqu'une autre
classe peut y accéder. Tôt ou tard, ça te causera des
problèmes. D'une manière générale, toutes les variables
membres doivent être privées.
d'une manière générale, il faut se méfier des généralités ;)
Fabien LE LEZ wrote on 12/08/2006 13:37:1- Une position n'a pas de position.
au primaire on apprend "être" et "avoir"; ici une position est
un état.
Si tu écris
Position ma_position;
ma_position.SetPosition (...);
tu écris "la position de la position ma_position est ...".
Ça n'a pas de sens.
alors que dans "Position point;" 'point' a bien une position;
voulais-tu seulement dire qu'il peut toujours exister une
(mauvaise) façon de présenter qui permet de balayer le fond en
raillant la forme ?
2- Ton héritage indique qu'un véhicule *est* une position.
Là non plus, ça n'a pas de sens.
tu disais "a une position", tu te contredis juste pour
contredire le PO?
une véhicule a bien une position, non ?
En fait, pour régler ces deux problèmes, il suffit de
changer le nom de la classe, et de l'appeler
"ObjetAyantUnePosition".
ou encore
"ClasseQuiPeutEtreEtenduParQuelqueChoseQuiPeutEtreOuAvoirUnePosition",
mais bon c'est un peu long ...3- Des variables membres presque publiques, puisqu'une autre
classe peut y accéder. Tôt ou tard, ça te causera des
problèmes. D'une manière générale, toutes les variables
membres doivent être privées.
d'une manière générale, il faut se méfier des généralités ;)
Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
En augmentant énormement les risques d'erreurs d'utilisation et
les difficultés de compréhension. Tu écris le code une fois ;
tu l'utilises des milliers de fois. Tout ce que tu gagnes à
l'écriture, tu vas le perdre lors de l'utilisation.
Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
En augmentant énormement les risques d'erreurs d'utilisation et
les difficultés de compréhension. Tu écris le code une fois ;
tu l'utilises des milliers de fois. Tout ce que tu gagnes à
l'écriture, tu vas le perdre lors de l'utilisation.
Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
En augmentant énormement les risques d'erreurs d'utilisation et
les difficultés de compréhension. Tu écris le code une fois ;
tu l'utilises des milliers de fois. Tout ce que tu gagnes à
l'écriture, tu vas le perdre lors de l'utilisation.
Pour rester sur le même exemple, si j'ai besoin demain de pouvoir
utiliser des unités pour la position, j'ai juste à changer l'interface
de Position (ou ObjectAyantUnePosition...) et tout le monde en profite
automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis, c'est loin
d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
Pour rester sur le même exemple, si j'ai besoin demain de pouvoir
utiliser des unités pour la position, j'ai juste à changer l'interface
de Position (ou ObjectAyantUnePosition...) et tout le monde en profite
automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis, c'est loin
d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
Pour rester sur le même exemple, si j'ai besoin demain de pouvoir
utiliser des unités pour la position, j'ai juste à changer l'interface
de Position (ou ObjectAyantUnePosition...) et tout le monde en profite
automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis, c'est loin
d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
kanze wrote:Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
Heu... honnêtement, que les gens écrivent des trucs qui n'ont
pas de sens en utilisant mes classes, ce n'est pas mon soucis
majeur.
Le principal est qu'il y ait une manière sensée de les
utiliser.
En augmentant énormement les risques d'erreurs d'utilisation
et les difficultés de compréhension. Tu écris le code une
fois ; tu l'utilises des milliers de fois. Tout ce que tu
gagnes à l'écriture, tu vas le perdre lors de l'utilisation.
C'est justement là le truc: au moins pendant la phase de
développement, j'ai tout un tas d'attributs (dans le genre de
la position) que je change régulièrement, et qui sont utilisés
par plusieurs types d'objets. Et je change régulièrement
l'interface pour changer ces attributs.
Pour rester sur le même exemple, si j'ai besoin demain de
pouvoir utiliser des unités pour la position, j'ai juste à
changer l'interface de Position (ou ObjectAyantUnePosition...)
et tout le monde en profite automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis,
c'est loin d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
- redéfinir toute l'interface de Vehicule qui permet de
manipuler la position pour prendre en compte les unités, mais
aussi les interfaces de toutes mes classes ayant une position
J'ai l'impression que l'argument principal contre ce design
est:
"c'est pas comme d'habitude, donc c'est plus sujet à confusion
et/ou erreur".
Ce qui n'est pas faux, mais ce n'est pas non plus
objectivement un problème technique.
kanze wrote:
Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
Heu... honnêtement, que les gens écrivent des trucs qui n'ont
pas de sens en utilisant mes classes, ce n'est pas mon soucis
majeur.
Le principal est qu'il y ait une manière sensée de les
utiliser.
En augmentant énormement les risques d'erreurs d'utilisation
et les difficultés de compréhension. Tu écris le code une
fois ; tu l'utilises des milliers de fois. Tout ce que tu
gagnes à l'écriture, tu vas le perdre lors de l'utilisation.
C'est justement là le truc: au moins pendant la phase de
développement, j'ai tout un tas d'attributs (dans le genre de
la position) que je change régulièrement, et qui sont utilisés
par plusieurs types d'objets. Et je change régulièrement
l'interface pour changer ces attributs.
Pour rester sur le même exemple, si j'ai besoin demain de
pouvoir utiliser des unités pour la position, j'ai juste à
changer l'interface de Position (ou ObjectAyantUnePosition...)
et tout le monde en profite automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis,
c'est loin d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
- redéfinir toute l'interface de Vehicule qui permet de
manipuler la position pour prendre en compte les unités, mais
aussi les interfaces de toutes mes classes ayant une position
J'ai l'impression que l'argument principal contre ce design
est:
"c'est pas comme d'habitude, donc c'est plus sujet à confusion
et/ou erreur".
Ce qui n'est pas faux, mais ce n'est pas non plus
objectivement un problème technique.
kanze wrote:Tu ne considères pas le fait qu'on peut utiliser un objet de
type Vehicule partout où on démande une position un problème
précis ? Penses-y un moment :
Position* v1 = new Vehicule( ... ) ;
Position* v2 = new Vehicule( ... ) ;
*v1 = *v2 ;
Que signifie cette dernière ligne ? Ou quelque chose du
genre :
Position p( *v1 ) ;
Heu... honnêtement, que les gens écrivent des trucs qui n'ont
pas de sens en utilisant mes classes, ce n'est pas mon soucis
majeur.
Le principal est qu'il y ait une manière sensée de les
utiliser.
En augmentant énormement les risques d'erreurs d'utilisation
et les difficultés de compréhension. Tu écris le code une
fois ; tu l'utilises des milliers de fois. Tout ce que tu
gagnes à l'écriture, tu vas le perdre lors de l'utilisation.
C'est justement là le truc: au moins pendant la phase de
développement, j'ai tout un tas d'attributs (dans le genre de
la position) que je change régulièrement, et qui sont utilisés
par plusieurs types d'objets. Et je change régulièrement
l'interface pour changer ces attributs.
Pour rester sur le même exemple, si j'ai besoin demain de
pouvoir utiliser des unités pour la position, j'ai juste à
changer l'interface de Position (ou ObjectAyantUnePosition...)
et tout le monde en profite automatiquement.
Sans utiliser ce design, je vois 3 possibilités:
- mettre la position en attribut publique. Comme tu le dis,
c'est loin d'être la panacée
- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
- redéfinir toute l'interface de Vehicule qui permet de
manipuler la position pour prendre en compte les unités, mais
aussi les interfaces de toutes mes classes ayant une position
J'ai l'impression que l'argument principal contre ce design
est:
"c'est pas comme d'habitude, donc c'est plus sujet à confusion
et/ou erreur".
Ce qui n'est pas faux, mais ce n'est pas non plus
objectivement un problème technique.
Dériver publiquement ou avoir un attribut publique, c'est à peu
près la même chose.- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
Tout à fait.
Dériver publiquement ou avoir un attribut publique, c'est à peu
près la même chose.
- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
Tout à fait.
Dériver publiquement ou avoir un attribut publique, c'est à peu
près la même chose.- Position &Vehicule::GetPositionRef() { return this->position; }
Ce qui est quasiment pareil que le définir publique, la lisibilité en
moins.
Tout à fait.