IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

j'ai trouvé un usage utile aux multi-class (a fuire si vous n'aimez pas les class fonctor)


Sujet :

C++

  1. #21
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Baaaah non... je peux justement construire mon stream comme je veux..

    il n'y a aucun nuance avec les wrapper java...
    sauf que je rajoute un couche multiclass... donc 1 variable ou lieu de 1 par wrapper...

    pour rajouter un "decorateur" il n'y a qu'a derrivé la class modStream.
    Tu ne construis pas ton stream comme tu veux : tu crées une nouvelle classe qui construit exactement la combinaison que tu veux. Si tu souhaites une nouvelle combinaison, tu dois créer une nouvelle classe. Tu passes ainsi d'une décoration dynamique à une décoration statique.

    hors celui ci c'est justement l'utlisateur/developpeur final qui defini/construit...
    IL NE LE DERRIVE PAS...
    il met dans son code a lui (il ne le derrive pas, il n'instance pas un cmonstream deja defini)

    il ecrit dans son code a lui
    (c'est SON CODE, DANS SON PROJET, ecrit avec ses petits doigts)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class cmonstream:filestream, etc, etc //<--- il met CE QU'IL VEUX !!! dans l'ordre qu'il veux
    Ton code, ça ressemble beaucoup à "dévirer une classe" : /

    Ce qui est pourrait être kiffant c'est une fonction factory template : tu lui donnes les types que tu veux, elle se charge de tout assembler et de te renvoyer une instance !

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par foetus Voir le message
    il faut s'assurer que le nombre de méthodes n'explosent pas
    typiquement le cas ou mon server/mod est utile... soit dit en passant...
    il faut juste faire preuve d'extrapolation...

    Citation Envoyé par foetus Voir le message
    Pour le nommage, tu les mets dans 1 collection
    aaaah... tu t'approche de mon idée... une class ca ne serait pas une sorte de "collection" ??? .
    (au sens "struct")

    Citation Envoyé par foetus Voir le message
    ensuite tu cherches des problèmes de fermeture
    temps de debuggage...

    Citation Envoyé par foetus Voir le message
    mixins/ décorateurs sont 2 patrons qui ne sont pas là pour résoudre ces problèmes
    ou pas

    Citation Envoyé par foetus Voir le message
    comme tu veux en faire 1 bibliothèque, tu te prends "les pieds dans le tapis", parce que très souvent modulable veut dire hiérarchie de classes.
    la tu t'avance...

    Citation Envoyé par foetus Voir le message
    On ne connaît pas le contexte
    osef.. extrapole... du multiclass dont les class membres communiques avec un master/server...

    typiquement le probleme de la voiture-bateau-avion qui n'est ni une voiture, ni un bateau ni un avion...

    Citation Envoyé par foetus Voir le message
    Par exemple, au démarrage, tu alloues 2 algo de compression c1 et c2, 1 algo de filtre f1 et 1 algo de bufférisassion b1. Et ensuite
    AAAAAAh enfin une bonne question...

    je n'ai pas essayé mais al harrash
    (le code qui suit n'est pas logique mais osef c'est pour l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // imaginons 2 compresseur ZIP et LZMA
    // ce qu'ecrit l'utlisateur final DANS SON CODE, //
    class cmonstream: filestream, zip, lzma // les mod qu'il veut // {// les construct qu'il faut//} monstream;
    (ZIP)monstream.setXXX(...)
    (LZMA)monstream.setXXX(...)
    //
    un truc comme ca non ?

    a priori un simple monstream.setXXX declanchera une erreur (ambigue) a la compil.

    par contre, les compresseur seront imbriqué selon l'ordre
    donc un write fera :
    data->LZMA->ZIP->file.

    si on voulais alternativement choisi l'un ou l'autre;
    j'ai prevue une class que j'appel TAR (ou fakestream, ou nbt2, ou xz ou XML selon vos gouts)
    qui permettra de switcher entre plusieurs modificateur.
    ... WIP...

    (XML c'est pour troller hein...)

    au pire on pourrais (avec un peu d'astuce) injecter un modificateur en jouant avec son CB.
    (des que je comprend comment fonction les friend class)

    Citation Envoyé par foetus Voir le message
    cela sent 1 manque de pointeur intelligent qui ferme automatiquement les ressources dans le destructeur ou alors 1 problème de conception.
    Lorsque dans tes traitements, tu parles d'ouvrir/ fermer au lieu d'initialiser/ nettoyer, cela donne 1 indication.
    je ne sais pas en CPP. mais en java c'est une horreur et grandes source de bug a la con.

    (vecu en java : un degz qui ne flush pas...
    ll manquait systématiquement les derniers octets
    de memoire il etait pourtant dans un try/ressource, et implementait un autoclose...
    donc bug chelou. resolue en closant tout a la mimine..
    moi les trucs automatique lier a un ramasse niet ou c'est ecrire noir sur blanc qu'il ne garantie pas l'appel au destructor
    ... bof bof...)

    combien meme on enleve le probleme des close imbriqués... le multi-class c'est classe...

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par foxzoolm Voir le message
    je comprend pas pouquoi tu bloque sur cmonstream ???
    Parce que c'est l'exemple que tu as donné et que j'ai la flegme d'en chercher un autre

    Ceci dit, que ce soit Cmoncom ou une autre, le problème reste absolument le même: ta classe fournit "un certain nombre" de services à l'utilisateur qui est déterminé par les fonctions publiques qu'elle lui expose.

    Dés le moment où tu pars du principe que les services fournis par ta classe sont en fait issus de plusieurs classes distinctes, tu pars dans un problème de combinatoire: tu vas définir une combinaison donnée, peut être deux ou trois (mais dans des classes différentes), et du coup, si ta / tes combinaisons ne correspondent pas aux besoins de l'utilisateur, il devra en créer d'autres.

    hors celui ci c'est justement l'utlisateur/developpeur final qui defini/construit...
    IL NE LE DERRIVE PAS...

    ]il met dans son code a lui (il ne le derrive pas, il n'instance pas un cmonstream deja defini)
    Et si la classe que tu as définis ne lui convient pas parce que les comportements associés à ses différents services ne correspondent pas à ce dont il a besoin

    Je te rappelle que ton exemple parle :
    • de bufferiser les entrées (vu que ta classe hérite de BuffStream)
    • de filtrer les entrées (vu qu'elle hérite de FilterStream)
    • de compresser les entrées (vu qu'elle hérite de CompressStream)
    • et d'envoyer le résultat final sur le port com (vu qu'elle hérite de ComStream)

    C'est très bien, c'est une classe qui lave le linge et qui sort le chien

    Mais... Si je dois, dans une situation bien particulière (va savoir pourquoi, n'est-ce pas) envoyer mes données non compressées ou non filtrées

    Ou, à l'inverse, si je veux que mes données soient traduites (de préférence entre la bufferisation et le filtre ou entre le filtre et la compression, pour le coup), je fais quoi

    Si je veux un service de moins que ceux fournis par Cmoncom, je dois créer une autre classe (mettons Cautrecom) qui hérite de presque toutes les parties de Cmoncom à l'exception des parties qui me sont inutiles et je devrai redéfinir le service principal (celui qui met toutes les parties en musique une fois que je lui ai envoyé mes données)

    Si je veux un service de plus que ceux fournis par Cmoncom, je devrai aussi créer une autre classe, avec le même résultat. A ceci près que j'aurai alors le choix:
    • Soit je crée une classe avec les différentes éléments dont j'ai besoin, qui ne connait pas Cmoncom
    • Soit je dérive Cmoncom sous la forme de class Cautrecom : public Cmoncom, public TranslateStream{/* ... */ };

    il ecrit dans son code a lui
    (c'est SON CODE, DANS SON PROJET, ecrit avec ses petits doigts)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class cmonstream:filestream, etc, etc //<--- il met CE QU'IL VEUX !!! dans l'ordre qu'il veux
    Que ce soit toi, lui ou un autre qui écrive ce code, il restera confronté au même problème: cette classe sera surement très utile dans une situation donnée bien particulière, mais ne pourra -- au mieux -- que servir de base (si elle n'est pas purement et simplement inutile) dans une situation à peine dégradée.
    par contre, la clairement, il n'y a aucun moyen de verifier s'il ecrit de la merde...
    (ajoute une class qui n'est pas derrivé de modstream ou masterstream, ou s'il n'appel pas le constructor)

    les "utilisateurs" feront toujours des conneries..
    c'est pour ca qu'on touche de gros salaire et que nous avons la considération professionnel...
    Ah, ca, pour la considération professionnelle, tu risque d'être décu. Et quand on voit les salaires proposés par certaines SSII... Si à peine plus que le SMIG est considéré comme un gros salaire, que pense tu de facturer 50 ou 75€ HTVA de l'heure

    Par contre, comme l'utilisateur d'une fonctionnalité fera effectivement toujours une connerie, c'est à toi de te casser la tete pour éviter au mieux à l'utilisateur de s'adonner à son
    Citation Envoyé par foxzoolm Voir le message
    aaaah... tu t'approche de mon idée... une class ca ne serait pas une sorte de "collection" ??? .
    (au sens "struct")
    Non : au sens "collection" de taille plus ou moins dynamique:
    tableau, liste, pile, file ou autre dans lesquelles tu rajoute les différentes instances de ta classe afin de pouvoir les réutiliser.

    Par exemple, si j'ai une classe Personne, je peux l'utiliser de deux manière différentes:

    Soit, je n'ai qu'une (ou deux) personnes, et je peux encore m'en sortir (sans risquer de m'embrouiller avec les noms de variables) avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personne Jean;
    Personne Marc;
    /* j'utilise Jean ou Marc en fonction des besoins */
    Soit, je ne sais pas à la base combien j'aurai de personnes, et puis, jouer avec les noms de variables multiple (Jean, Marc, Henry, Arthur, Joseph, Louis et tous les autres), ca devient franchement compliqué.

    Du coup, je place ces données dans une collection (par exemple, dans un tableau):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<Personne> laClasse;
    /* je peux ajouter ou retirer des personnes de la classe
       je peux appliquer une logique données à toutes les personnes qu'il y a dans la classe
       je peux accéder à une personne particulière de la classe pour l'envoyer au tableau
     */
    (mais la classe n'est pas une personne )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu ne construis pas ton stream comme tu veux : tu crées une nouvelle classe qui construit exactement la combinaison que tu veux.
    chipotage...

    sachant tte de meme que j'ai facilité la creation de server et de modificateur...
    il n'y a qu'a derrivé respectivement serverStream et modStream (et accessoirement overrider les virtual)

    Citation Envoyé par Bktero Voir le message
    Si tu souhaites une nouvelle combinaison, tu dois créer une nouvelle classe.
    vouiiii... et donc ?
    ca tombe bien cpp permet de declarer une class et de l'instancier en une ligne...
    c'est bien dommage d'ailleurs qu'on ne puissent pas faire des class anonyme dans ce cas precis
    (ou j'ai pas trouvé comment faire ???)

    Citation Envoyé par Bktero Voir le message
    Tu passes ainsi d'une décoration dynamique à une décoration statique
    tu entends quoi par "dynamique" ??? en runtime ?
    bon, je pense que ce cas est plutot rare. et ce n'est clairement pas une lib pour faire ca
    (le but etant de profiter du multi-class pour avoir les fonctions membre directement accessible)

    Citation Envoyé par Bktero Voir le message
    Ton code, ça ressemble beaucoup à "dévirer une classe" : /
    chipotage....

    Citation Envoyé par Bktero Voir le message
    Ce qui est pourrait être kiffant c'est une fonction factory template : tu lui donnes les types que tu veux, elle se charge de tout assembler et de te renvoyer une instance !
    en gros c'est ca si tu y reflechi bien...

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Dés le moment où tu pars du principe que les services fournis par ta classe
    quel class ?
    si tu dis "cmonstream" je hurle !!!

    Citation Envoyé par koala01 Voir le message
    tu vas définir une combinaison donnée
    non...

    Citation Envoyé par koala01 Voir le message
    et du coup, si ta / tes combinaisons ne correspondent pas aux besoins de l'utilisateur, il devra en créer d'autres.
    vvvvvvoui voila !!! l'utilisateur cree la combinaisons dont il a besoin !!!!
    la lib ne fourni AUCUNE class a instancier directement...

    Citation Envoyé par koala01 Voir le message
    ceux fournis par Cmoncom
    cmonstream c'est juste un exemple de comment on utilise la lib.
    elle ne sera pas dans la lib.
    aucune class ne sera a instancier directement...

    Citation Envoyé par koala01 Voir le message
    je dois créer une autre classe (mettons Cautrecom)
    oui.

    Citation Envoyé par koala01 Voir le message
    qui hérite de presque toutes les parties de Cmoncom
    non...
    tu ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class cautrecom:leServerQueTuVeux,LesModificateursDontTuAsBesoin
    toutim

    Citation Envoyé par koala01 Voir le message
    Si je veux un service de plus que ceux fournis par Cmoncom,
    qui n'est pas dans la lib. et est juste donner en exemple de comment fonctionne la lib...
    (donc non)

    Citation Envoyé par koala01 Voir le message
    [*]Soit je crée une classe avec les différentes éléments dont j'ai besoin,
    donc change "soit" par "je cree"....

    Citation Envoyé par koala01 Voir le message
    pour la considération professionnelle
    #define ironie...

    Citation Envoyé par koala01 Voir le message
    Non : au sens "collection" de taille plus ou moins dynamique:
    Ok probleme de definition... pour moi le mot "collection" vas du "struct" au "vector"...
    mais je te l'accord, normalement "collection" c'est plutot "vector"...

    si ton idée c'est de faire un vector de function... bah en gros c'est ce que fait CB et oldCB.
    c'est une (sorte) de liste chainé a sens unique (a 2h du mat j'ai oublié son petit nom)
    et la tu beneficie du multi-class...

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/07/2008, 12h25
  2. Réponses: 1
    Dernier message: 24/10/2006, 15h59
  3. [Tomcat]Tomcat ne trouve pas les driver mysql
    Par Lash3r dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/01/2006, 01h12
  4. [FEDORA] Je ne trouve pas les fichiers includesous Feodra core 3 ?
    Par sali dans le forum RedHat / CentOS / Fedora
    Réponses: 4
    Dernier message: 22/10/2005, 23h30
  5. execution d'un prog avec des fichiers multi-class
    Par Ice-B dans le forum Général Java
    Réponses: 2
    Dernier message: 05/08/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo