C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Comment donner accès à une "liste"

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Loïc Joly
Guest





PostPosted: Thu Aug 07, 2003 10:16 pm    Post subject: Comment donner accès à une "liste" Reply with quote



Bonjour,

Imaginons une structure d'arbres avec la classe suivante :

class Node
{
vector<Node> listOfChildren;
// ...
};

Je souhaite permettre à l'utilisateur de cette classe de faire pas mal
de chose, comme ajouter des noeuds, en enlever, parcourir l'arbre.....

J'hésite entre plusieur interfaces possibles, et j'ai du mal à voir les
avantages des différentes solutions :

1/ Accès "direct"

class Node
{
vector<Node> listOfChildren;
public:
vector<Node> &getChildren();
vector<Node> const &getChildren() const;
};


2/ On cache tout

class Node
{
vector<Node> listOfChildren;
typedef vector<Node>::iterator SubNodeIterator;
SubNodeIterator subNodeBegin();
SubNodeIterator subNodeEnd();
void addNode(Node n);
void removeNode(int NodeId);
Node &findNode (intNodeId);
// ... et plein d'autres
};


3/ On cache à moitié

class NodeList
{
// Classe basée sur vector<Node> mais présentant une interface plus
réduite
// qui par exemple supporterait facilement le passage à un list<Node>
};

class Node
{
NodeList listOfChildren;
public:
NodeList &getChildren();
NodeList const &getChildren() const;
};


Et vous, quelle solution prendriez vous ?

--
Loïc



Back to top
Vivien Gallinaro
Guest





PostPosted: Mon Aug 11, 2003 6:19 am    Post subject: Re: Comment donner accès à une "liste" Reply with quote



Loïc Joly wrote:
Quote:

1/ Accès "direct"

class Node
{
vector<Node> listOfChildren;
public:
vector<Node> &getChildren();
vector<Node> const &getChildren() const;
};

(Désolé, c'est un poil HS) A ce propos, j'aimerais savoir : y a-t-il un
intérêt à avoir un membre privé doté d'accesseurs en lecture et en
écriture ? Quel est l'avantage comparé à un membre public ?
J'en pense que la version avec accesseurs est juste plus pénible à
écrire, parce qu'elle multiplie les noms et demande d'écrire du code
trivial.

Quote:
Et vous, quelle solution prendriez vous ?

Dans un premier temps, sauf à avoir déjà une bonne idée des contraintes
sur ton type d'arbre (la sémantique, comme dit Marc), je crois que je me
contenterais d'un simple vector<Node>. Mais le "dans un premier temps"
n'est pas une formule qui minimise les risques ; c'est bon pour un
proto, quoi.

Gourgouilloult du Clapotis


Back to top
Julien Blanc
Guest





PostPosted: Mon Aug 11, 2003 6:30 am    Post subject: Re: Comment donner accès à une "liste" Reply with quote



Vivien Gallinaro wrote:
Quote:
Loïc Joly wrote:


1/ Accès "direct"

class Node
{
vector<Node> listOfChildren;
public:
vector<Node> &getChildren();
vector<Node> const &getChildren() const;
};


(Désolé, c'est un poil HS) A ce propos, j'aimerais savoir : y a-t-il un
intérêt à avoir un membre privé doté d'accesseurs en lecture et en
écriture ? Quel est l'avantage comparé à un membre public ?
J'en pense que la version avec accesseurs est juste plus pénible à
écrire, parce qu'elle multiplie les noms et demande d'écrire du code
trivial.

si tu as des contraintes à respecter sur ta variable, oui. Si tu veux
pouvoir changer ton implémentation sans changer ton interface, oui. En
général, je dirais oui Smile.

Les cas où ça n'a aucun intérêt sont à mon avis les cas de classes
finales, figées, et sans contraintes. Ca n'en fait pas tellement somme
toute...

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.


Back to top
Loïc Joly
Guest





PostPosted: Mon Aug 11, 2003 6:50 am    Post subject: Re: Comment donner accès à une "liste" Reply with quote

Marc Boyer wrote:
Quote:
Loïc Joly wrote:

Bonjour,

Imaginons une structure d'arbres avec la classe suivante :

class Node
{
vector<Node> listOfChildren;
// ...
};

Je souhaite permettre à l'utilisateur de cette classe de faire pas mal
de chose, comme ajouter des noeuds, en enlever, parcourir l'arbre.....


Comme souvent, évolutivité et maintenabilité vont s'opposer
à la rapidité de la première écriture du code. La solution
de facilité, c'est bien sur l'accès direct.

Mais première chose me semblerait importante: pouvoir changer
de conteneur sans briser l'interface. Le jour ou ton vector te semble
inapproprié, que tu préfères autre chose, ce serait bien de pouvoir
le faire.

[...]


Quote:
Par contre, je vois pas trop de différence entre la version
"a moitié caché" et la version "tout caché". De toute façon, il
faut encapsuler, écrire le code, et je ne vois pas de sémantique
propre à "NodeList"...

En fait, la version "à moitié caché" avait pour but de pouvoir justement
changer de conteneur sous-jacent de façon plus sure qu'avec un simple
typedef : La classe NodeList aurait comme interface ce qui est comme à
vector, list, deque...

--
Loïc


Back to top
Vivien Gallinaro
Guest





PostPosted: Mon Aug 11, 2003 8:21 am    Post subject: Re: Comment donner accès à une "liste" Reply with quote

Julien Blanc wrote:
Quote:
Vivien Gallinaro wrote:

y a-t-il
un intérêt à avoir un membre privé doté d'accesseurs en lecture et en
écriture ? Quel est l'avantage comparé à un membre public ?

En général, je dirais oui Smile.

Je crois qu'on ne s'est pas tout à fait compris. Je parlais uniquement
des membres pour lesquels on dispose à la fois d'un accesseur en lecture
_et_ d'un accesseur en écriture (ou bien d'un seul qui fait les deux,
mais ça l'idée est la même).

Quote:
si tu as des contraintes à respecter sur ta variable, oui.

Dans ce cas là, on n'aura pas d'accesseur en écriture directe. Donc ici,
on ne retourne pas une référence, ou alors systématique une const réf...

Quote:
Si tu veux
pouvoir changer ton implémentation sans changer ton interface, oui.

Dans le cas présent, sauf quelques cas bien particuliers (utilisation de
push_front() et genre), l'interface est la même. Ensuite, si on parle
bien d'un membre privé, sur lequel une méthode renvoie une référence
(accesseur en écriture), c'est de toute façon à l'appelant de se manger
la divergence d'interface, non ?

Un autre souci assez fréquent de non-compréhension dans ce groupe, j'ai
cru remarqué, c'est quand plusieurs interlocuteurs ne restent pas au
même niveau d'abstraction. Par exemple, là, j'aurais du mal à dire à
quel point je reste connecté à l'exemple de départ, ou à quel point j'ai
tort de l'être encore...

Quote:
Les cas où ça n'a aucun intérêt sont à mon avis les cas de classes
finales, figées, et sans contraintes. Ca n'en fait pas tellement somme
toute...

On peut sans doute rajouter les structs, non ? Ces petites classes qui
n'ont comme seul intérêt que d'aggréger quelques données. Ah ben tiens,
c'est justement des classes finales, figées et sans contraintes Wink
Mais c'est quand même un exemple d'usage qui n'a pas l'air improbable. Si ?

Gourgouilloult du Clapotis


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.