OVH Cloud OVH Cloud

héritage ou nouvelle classe?

46 réponses
Avatar
Zoubidaman
Bonsoir,

j'ai une classe Possessions:

class Possessions
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutPossession,FinPossession;
AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureePossession();
};

J'ai besoin d'une classe Strategies, qui ait la même partie private, mais
avec la partie publique différente, car j'ai besoin de moins de
variables...

Comme je ne connais (pour l'instant) rien à l'héritage, je voulais savoir
si j'avais besoin de passer par là, ou bien s'il fallait que je crée une
nouvelle classe...

Merci d'avance...

10 réponses

1 2 3 4 5
Avatar
Zoubidaman
On peut déjà commencer par mettre de l'ordre dans tout ça :

struct Intervalle
{
int debut;
int fin;
double Duree() { return fin - debut; }
};

class GestionPauses
{
public:
typedef Intervalle Pause; /* Au singulier : un Intervalle == une
Pause */
typedef std::vector<Pauses> ListePauses;
typedef ListePauses::const_iterator const_iterator;
int DureeTotale() const;
// Rajouter ici constructeurs et push_back()...
private:
ListePauses liste;
};



C'est mieux de passer par des structures que par la STL? (Intervalle au
lieu de pair<int,int>)

int CalculeDuree (Intervalle const& intervalle_general,
GestionPauses const& pauses);



J'ai souvent lu qu'il était déconseillé de créer des méthodes qui ne sont
pas encapsulées dans une classe...

class Possessions
{
private:
GestionPauses pauses;

public:
Intervalle debut_et_fin;

AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
Intervalle const& debut_et_fin,
GestionPauses const&,
AnsiString const& ActiondeFin,
TColor const& CouleurActiondeFin);


Ce constructeur est pas équivalent à

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}
???


GestionPauses const & AccesListePauses() const
{ return pauses; }

int DureePossession()
{ return CalculeDuree (debut_et_fin, pauses); }
};

int CalculeDuree (Intervalle const& intervalle_general,
GestionPauses const& pauses)
{
return intervalle_general.Duree() - pauses.DureeTotale();
}



J'essaie de comprendre le code, qui même s'il n'est pas compliqué,
utilise beaucoup de classes et structures par rapport à ce que je fais
moi, ce qui ne me facilite pas la tâche...

Je dirais quand même, après relecture, que ce que tu me proposes est plus
compliqué d'utilisation que ce que j'avais commencé, non? Ou bien c'est
moi qui ne suis pas encore assez habitué...

En tout cas, merci de ton exemple, il ne me reste plus qu'à le
comprendre...

Avatar
Zoubidaman
C'est difficile à dire sans en savoir plus. En particulier : qu'est-ce
qu'un objet "Strategies" représente ? Idem pour "Possessions".
Deux classes de forme très proche peuvent n'avoir aucun lien de
parenté, si leurs significations sont très différentes.




L'objet stratégies représente les moments où une stratégie est active dans
un match de basket...

Elle a un début et une fin, identifiables, ainsi que des pauses, car il y a
souvent des éléments qui font que le jeu s'est arrêté alors que la
stratégie continue. Si bien que lorsqu'on veut calculer la durée d'une
stratégie, il faut soustraire à l'intervalle de temps maximal la durée
totale des pauses...

Pour l'objet possession, c'est pareil, sauf que c'est tout le temps qu'une
équipe possède le ballon. En général, les instants d'une possession =
instants d'une stratégie, mais il arrive qu'on change de stratégie pendant
une possession...

Donc voilà pourquoi ces deux objets sont si proches...

Avatar
Zoubidaman
Clairement la composition sur la base d'une classe Pause. En plus d'y
regrouper un certain nombre de fonctionnalités (pas juste des données,
donc), tu pourras en profiter pour simplifier tes constructeurs en
leur fournissant un paramètre de type Pause au lieu de ta longue liste
de trucs...

Chris



Je pensais aussi à cela...

Néanmoins, je suis obligé d'avoir un constructeur aussi long... J'explique
pourquoi plus haut...

Avatar
Loïc Joly
Zoubidaman wrote:
C'est difficile à dire sans en savoir plus. En particulier : qu'est-ce
qu'un objet "Strategies" représente ? Idem pour "Possessions".
Deux classes de forme très proche peuvent n'avoir aucun lien de
parenté, si leurs significations sont très différentes.





L'objet stratégies représente les moments où une stratégie est active dans
un match de basket...

Elle a un début et une fin, identifiables, ainsi que des pauses, car il y a
souvent des éléments qui font que le jeu s'est arrêté alors que la
stratégie continue. Si bien que lorsqu'on veut calculer la durée d'une
stratégie, il faut soustraire à l'intervalle de temps maximal la durée
totale des pauses...

Pour l'objet possession, c'est pareil, sauf que c'est tout le temps qu'une
équipe possède le ballon. En général, les instants d'une possession =
instants d'une stratégie, mais il arrive qu'on change de stratégie pendant
une possession...

Donc voilà pourquoi ces deux objets sont si proches...


Dans ce cas, il y a peut-être moyen de définir une classe durée, qui
aurait commes variable membre un instant de début, un de fin, et une
référence à une partie (qui elle aurait la liste de toutes les pauses).

Cette classe fournirait des fonction comme dureeTotale, dureeHorsPause,...

Et cette classe serait utilisée par strategie et possession.

--
Loïc


Avatar
Christophe Lephay
"Zoubidaman" a écrit dans le message de
news:
Je dirais quand même, après relecture, que ce que tu me proposes est plus
compliqué d'utilisation que ce que j'avais commencé, non? Ou bien c'est
moi qui ne suis pas encore assez habitué...


Le cout de création de plusieurs classes s'amortit sur la complexité de ton
problème. Si ton problème est simplissime, ça se trouve, le mieux c'est de
ne faire qu'une classe (bon je frole la caricature, mais c'est à dessein)...

Dire que c'est plus compliqué, c'est possible (mais ça l'est surtout parce
que son code et pas le tien). Dire que ça vaut le coup, c'est impossible à
dire sans connaitre plus en détail ce que tu veux faire...

Chris

Avatar
Michaël Delva
Dire que ça vaut le coup, c'est
impossible à dire sans connaitre plus en détail ce que tu veux
faire...

Chris




Ce que je veux faire:

je lis un fichier XML contenant les statistiques d'un match de basket.
Sont également présentes les possessions et les stratégies, sous la
forme:

12 87 92 127 162 198

Qu'on peut lire comme ceci:
Debut possession: 12

Debut 1ère pause: 87
Fin 1ère pause: 92
Debut 2ème pause: 127
Fin 2ème pause: 162

Fin possession: 198

(C'est pareil pour les stratégies)

Moi je veux stocker ça dans un vecteur vector<Possession> toto;

Par rapport à ces possessions et stratégies, j'ai besoin de savoir leur
durée effective (donc le temps total - temps des pauses), et de savoir si
une statistique d'un joueur s'est produite dans cette stratégie ou
possession (pour établir un compte-rendu)...

Donc Possessions et Stratégies ne sont là que pour stocker les valeurs
des début et fin des événements...

--
---------------------------------------
http://oppc.free.fr

Avatar
Fabien LE LEZ
On 12 Aug 2003 02:29:04 GMT, Zoubidaman
wrote:

int CalculeDuree (Intervalle const& intervalle_general,
GestionPauses const& pauses);



J'ai souvent lu qu'il était déconseillé de créer des méthodes qui ne sont
pas encapsulées dans une classe...


Dans un langage qui a des méthodes, peut-être. En C++ il n'y a que des
fonctions. Certaines, notamment celles qui accèdent à des données
privées d'une classe, doivent être membres de cette classe. Mais s'il
n'y a aucune raison pour une fonction donnée d'être membre d'une
classe (comme c'est le cas ici), elle peut tout à fait être libre.
Ce qui peut être douteux, par contre, c'est de déclarer une fonction
libre amie d'une classe, et ainsi lui laisser accès aux données
privées.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html


Avatar
Fabien LE LEZ
On 12 Aug 2003 02:29:04 GMT, Zoubidaman
wrote:

J'essaie de comprendre le code, qui même s'il n'est pas compliqué,
utilise beaucoup de classes et structures par rapport à ce que je fais
moi, ce qui ne me facilite pas la tâche...


Pourtant c'est la clé pour un code propre et fiable.
D'une manière générale, si tu as plusieurs variables qui vont ensemble
(ici, un début et une fin), c'est logique d'en faire une classe à
part. Ainsi, tu n'as pas de références à un début et une fin (voire à
plusieurs) dans tout le code de ta grosse classe, mais des références
à un intervalle -- et c'est la classe "Intervalle" qui s'occupe de la
gestion de tout ce qui va autour -- la durée par exemple.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien LE LEZ
On 12 Aug 2003 09:06:40 GMT, "Michaël Delva"
wrote:

int DureeTotale() const;

pourquoi mettre le const après la fonction?
Quelle est la différence entre là et au début?


Le "const" à la fin indique que la fonction membre ne modifie pas
l'objet.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Christophe Lephay
"Michaël Delva" a écrit dans le message de
news:
je lis un fichier XML contenant les statistiques d'un match de basket.
Sont également présentes les possessions et les stratégies, sous la
forme:

12 87 92 127 162 198

Qu'on peut lire comme ceci:
Debut possession: 12

Debut 1ère pause: 87
Fin 1ère pause: 92
Debut 2ème pause: 127
Fin 2ème pause: 162

Fin possession: 198

(C'est pareil pour les stratégies)

Moi je veux stocker ça dans un vecteur vector<Possession> toto;

Par rapport à ces possessions et stratégies, j'ai besoin de savoir leur
durée effective (donc le temps total - temps des pauses), et de savoir si
une statistique d'un joueur s'est produite dans cette stratégie ou
possession (pour établir un compte-rendu)...

Donc Possessions et Stratégies ne sont là que pour stocker les valeurs
des début et fin des événements...


Tu peux très bien imaginer un système basé sur des évènements, dans lequel
une pause, un changement de stratégie ou de ballon seraient des évènements,
communicant avec des agents, ces derniers étant notifiés dès qu'un certain
évènement (auquel ils ont souscrit) se produit, et qui feraient alors un
traitement quelconque. Celà permettrait d'avoir un couplage bien moins fort
entre les données que tu gères (qui seraient extensibles par simple nouvelle
dérivation d'une classe de base "evenement"), et les analyses que tu leur
appliques (extensibles par la création de nouveaux agents)...

Celà faciliterait aussi la création de nouvelles analyses de manière
dynamique, notemment en permettant à différents agents de collaborer entre
eux (tu pourrais très bien avoir une classe ou une hiérarchie "analyse" qui
ferait appel à plusieurs agents).

Chris

1 2 3 4 5