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 PHP Discussion :

Simplifier un code répétitif


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 590
    Points : 813
    Points
    813
    Par défaut Simplifier un code répétitif
    Bonjour,
    J'ai un code qui utilise une classe de ma création pour créer des listes d'options.
    Ici j'ai 5 listes d'options à créer de façon identique et je ne sais pas comment ne pas répéter 5 fois le même code. J'ai trop de paramètres pour créer une fonction qui serait trop lourde. J'ai donc pensé utiliser des variables de variables mais je ne sais pas comment faire vu le nombre de variables variables.
    Le code suivant montre deux listes.
    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
    21
    22
    23
    24
    25
    $Authors	= getParams('lst_authors');
    $lstAuthors = new OptListSelect('author');
    $lstAuthors->addOption( new OptListOption('') );
    $lstAuthors->addOption( new OptListOption('0', '<nouveau>') );
    if($Authors)
    {
    	foreach($Authors as $key=>$value)
    	{
    		$lstAuthors->addOption( new OptListOption( (string) $value['id'], $value['text']) );
    	}
    }
     
    $Publishers		= getParams('lst_publishers');
    $lstPublishers	= new OptListSelect('publisher');
    $lstPublishers->addOption( new OptListOption('') );
    $lstPublishers->addOption( new OptListOption('0', '<nouveau>') );
    if($Publishers)
    {
     
    	foreach($Publishers as $value)
    	{
    		$lstPublishers->addOption( new OptListOption( (string) $value['id'], $value['text']) );
    	}
     
    }

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Première chose, je retirerais les if($Authors) et if($Publishers) car si $Authors ou $Publishers sont des tableaux vides (mieux vaut les initialiser de cette manière plutôt que de les initaliser à null), les boucles foreach ne tourneront pas de toute façon.

    En résumé, tu disposes d'une classe qui crée des selects et d'une autre qui crée les options. Il te manque une classe en surplomb qui se charge de créer les deux: on lui passe les paramètres du select et les paramètres des options (sous forme de tableau par exemple) et elle va créer les objets nécessaires. Il s'agit du design pattern builder. De cette manière tu éviteras les addOption(new OptListOption...) en l'utilisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $selectAuthors = new SelectBuilder($select, $options);
    Ici, $select et $options ne sont pas des instances de tes deux classes, mais sont des tableaux (ou autres structures) de paramètres que la classe SelectBuilder fournira aux constructeurs des classes Select et Option pour créer les objects nécessaires. Le job de SelectBuilder est de demander aux autres classes ce dont elle a besoin. C'est un peu un chef de chantier. Bien entendu, cette classe doit être en mesure au final de renvoyer une instance de la classe Select munie de toutes ces options.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 590
    Points : 813
    Points
    813
    Par défaut
    Pour l'instant, j'ai résolu le problème avec une fonction. Par contre la solution que tu préconises semble séduisante et pourrait me servir dans d'autres cas. Par contre, il faut que je l'étudie plus en détail. A voir. Pour l'instant, je mets le sujet comme résolu. Je reviendrai ici si j'ai des difficultés avec la solution que tu préconises.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Il faut spécifier les éléments qui changent d'un <select> à l'autre dans un tableau PHP ($models dans l'exemple).

    Ensuite tu boucles sur ton tableau.

    Avec ton exemple de 2 <select> cela donne :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    $models = [
        [
            'params' => 'lst_authors',
            'select_name' => 'author',
        ],
        [
            'params' => 'lst_publishers',
            'select_name' => 'publisher',
        ],
        // ...
    ];
     
    $selects = []; // Tableau de résultat
    // Les <select> seront accessibles selon le select_name paramétré dans le modèle
     
    // Construction dynamique du tablau de résultat
    // à partir de $models
    foreach ($models as $model) {
        $params = getParams($model['params']) ?? []; // À charge de getParams() de retourner un tableau vide
        $select = new OptListSelect($model['select_name']);
        $select->addOption(new OptListOption(''));
        $select->addOption(new OptListOption('0', '<Nouveau>')); // Caractères spéciaux à échapper à l'affichage
        foreach ($params as $value) {
            $select->addOption(new OptListOption((string)$value['id'], $value['text']));
        }
        $selects[$model['select_name']] = $select; // Ajout au tableau de résultat
    }
     
    print_r($selects);

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

Discussions similaires

  1. [E-00] Utilisation d'un auxilliaire pour simplifier le code
    Par anyah dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 21/11/2008, 17h31
  2. Simplifier le code
    Par Msieurduss dans le forum Langage
    Réponses: 8
    Dernier message: 18/06/2008, 10h07
  3. Réponses: 4
    Dernier message: 10/05/2008, 12h31
  4. Simplifier mon code "Majuscule/Minuscule"
    Par Manou34 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/01/2008, 17h05
  5. Aide pour simplifier un code VBA Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 24/01/2008, 16h15

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