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

Langage C++ Discussion :

[Conception] Refonte et design pour maintenance et extensibilité aisée


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut [Conception] Refonte et design pour maintenance et extensibilité aisée
    Bonjour!

    Pour expliquer mon problème je trouve qu'un code sera très parlant :
    Je met à disposition des utilisateurs l'enum suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     enum class PixelFormat
    {
        R8U, ///< R 8 bits 8 unsigned
        RG8U, ///< RG 16 bits 88 unsigned
        RGB8U, ///< RGB 24 bits 888 unsigned
        RGBA8U, ///< RGBA 32 bits 8888 unsigned
    };
     
     
    unsigned int getBytesPerPixel(PixelFormat Format)
    {
        switch(Format)
        {
            case PixelFormat::R8U: return 1;
            case PixelFormat::RG8U: return 2;
            case PixelFormat::RGB8U: return 3;
            case PixelFormat::RGBA8U: return 4;
        }
    }
    Seulement là j'ai besoin de rajouter soit de nouveaux format, soit de nouvelles propriétés (connaître le type du PixelFormat, savoir si on à affaire à un format compressé ou non, etc).
    Et là je me rend compte que je vais vite avoir un code in-maintenable

    Seulement je ne sais pas du tout par quoi remplacer. J'ai pensé à une classe ou l'utilisation de template mais rien ne me plaît vraiment..

    Si vous avez une solution à me donner, une piste à suivre ou un design pattern je serais bien content!

    Merci beaucoup à tous!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enum class PixelFormat
    {
        R8U = 1, ///< R 8 bits 8 unsigned
        RG8U = 2, ///< RG 16 bits 88 unsigned
        RGB8U = 3, ///< RGB 24 bits 888 unsigned
        RGBA8U = 4, ///< RGBA 32 bits 8888 unsigned
    };

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Merci de ta réponse mais cela n'est valable que si la seule propriété que je veux connaître est le nombre de bits par format de pixel.

    Seulement maintenant je cherche à étendre mes formats et je souhaiterais éviter les switch à répétitions pour avoir un code propre et surtout porté sur "l'avenir", comprendre par là qu'il soit facilement maintenable et extensible.

    Merci beaucoup pour ta réponse néanmoins!

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben tant qu'on ne sait pas comment tu veux les utiliser...

    Le seul cas d'utilisation que tu as fourni était un switch.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    J'ai une classe qui représente une Image et j'ai le code suivant (en raccourcis) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Image
    {
        public :
            Image::Image(const uvec2& Size, PixelFormat Format, const unsigned char* Pixels);
     
        private :
            uvec2  m_Size;   ///< Dimensions de l'image
            PixelFormat m_Format; ///< Format de pixels
            std::vector<unsigned char> m_Pixels; ///< Tableau des pixels
    };
     
     
    // Dans le Image.cpp
    // Constructeur
    Image::Image(const uvec2& Size, PixelFormat Format, const unsigned char* Pixels) :
    m_Size  (Size),
    m_Format(Format),
    m_Pixels(Pixels, Pixels + Size.x * Size.y * getBytesPerPixel(Format))
    {
    }
    Imaginons maintenant que je crée une fonction qui à partir d'une image renvoi l'image ayant subi une symétrie verticale (ou tout autre transfo peu importe), j'aimerais ne l'appliquer que si le PixelFormat ne représente pas des donnés compressées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Image::flip()
    {
        if( isCompressedFormat(m_Format) )
            throw std::runtime_error("Le PixelFormat ne doit pas être compréssé")
     
        // Le traitement
    }
    Et bien là déjà je me retrouve avec la fonction bool isCompressedFormat(PixelFormat), et donc un switch en plus à maintenir. Et si j'ajoute d'autres fonctions du genre ou d'autres PixelFormat je me retrouve avec une bouillie in-maintenable et difficilement extensible...

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Classes de traits pour le format et politiques pour les fonctions + spécialisation template pour l'évolutivité. Lire Présentation des classes de Traits et de Politiques en C++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche designer pour [Nouveau Concept] !
    Par MoMoney dans le forum Autres
    Réponses: 0
    Dernier message: 07/04/2010, 20h28
  2. [Conception] Plusieurs design pour un même contenu
    Par cocoyot dans le forum Webdesign & Ergonomie
    Réponses: 1
    Dernier message: 22/11/2007, 14h14
  3. [Conception] - Organisation des pages pour une requete.
    Par ShinJava dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/10/2005, 15h33
  4. [Observateur] existe-t-il un package proposant ce design pour C# ?
    Par sopi dans le forum Design Patterns
    Réponses: 1
    Dernier message: 25/05/2005, 20h48

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