Mots-clé : développement

Apache : notes pour les filtres

Voilà ce que j’ai mis longtemps à comprendre :

Lorsqu’un client envoie quelque chose à httpd, le serveur Web commence à créer des seaux qu’il remplit au fur et à mesure : et quand un seau est plein, il en remplit un autre etc jusqu’à ce qu’il ait un nombre de seaux suffisants. Ces seaux sont rangés dans une brigade. Une brigade de seaux. Une bucket brigade, en Anglais. Et là, il les fait passer au premier filtre qu’il a sur sa liste. Ce filtre peut à son tour, ajouter d’autres seaux, en enlever, ou même, tout supprimer et créer toute une série d’autres seaux. Toujours est-il que quand on développe un filtre, il faut toujours avoir en tête plusieurs choses :

  • Il va toujours y avoir une série de seaux qu’il va falloir parcourir, ce ne sera jamais un seul seau simple et seul. La boucle de parcours sera toujours de la forme :
    /* on demande à lire une série de seaux : */
    rv = ap_get_brigade(f->next, bb, AP_MODE_READBYTES, APR_BLOCK_READ, readbytes);
    /* si erreur, la gérer, sinon boucle pour lire seau après seau : */
    for (b = APR_BRIGADE_FIRST(bb);
         b != APR_BRIGADE_SENTINEL(bb);
         b = nextb) {
        nextb = APR_BUCKET_NEXT(b);
        ...
        traitement de ce qu'on a reçu
        ...
    }
  • Le serveur Apache gère une chaine de filtres, qui se suivent dans un ordre qu’il est impossible à connaitre du point de vue d’un filtre. En résumé, on ne sait jamais, quand on programme un filtre, quels sont les filtres qui ont été appelés avant le nôtre, ou quels sont les filtres le seront après. Bon ok. Il y a quand même une possibilité de dire grossièrement où on veut que le filtre soit, dans la chaine. En réalité il est possible de préciser l’un cinq niveaux grossiers parmi :
    1. APR_HOOK_REALLY_FIRST
    2. APR_HOOK_FIRST
    3. APR_HOOK_MIDDLE
    4. APR_HOOK_LAST
    5. APR_HOOK_REALLY_LAST

    Revenons à notre brigade, pleine de seaux, mais dont on ne sait pas exactement ce qu’elle contient, mais on le suppose. Lorsque celle-ci arrive et que notre filtre est appelé, on ne sait que grossièrement où est placé le filtre dans la chaine, donc il se peut que la brigade arrive avec des données en plus qui proviennent d’autres filtres mais qui ne nous concernent pas (entre autres des données personnelles qui vont d’un filtre à l’autre, des méta-données, en Anglais METADATA). C’est pour cela qu’il faut toujours s’assurer que ce ne sont pas des métadonnées qui ne nous concernent pas : c’est la macro APR_BUCKET_IS_METADATA :
    /* on demande à lire une série de seaux : */
    rv = ap_get_brigade(f->next, bb, AP_MODE_READBYTES, APR_BLOCK_READ, readbytes);
    /* si erreur, la gérer, sinon boucle pour lire seau après seau : */
    for (b = APR_BRIGADE_FIRST(bb);
         b != APR_BRIGADE_SENTINEL(bb);
         b = nextb) {
        nextb = APR_BUCKET_NEXT(b);
        if ( ! APR_BUCKET_IS_METADATA(b) ) {
            ...
            traitement de ce qu'on a reçu
            ...
        }
    }

Zeemoz : créer un nouveau module C pour Apache

Aller dans le répertoire des sources, et taper :

/opt/httpd-2.2.4/bin/apxs -g -n modulenouveau

Il va créer un répertoire ./modulenouveau et à l’intérieur les fichiers Makefile et mod_modulenouveau.c, qui contient le squelette du code tel qu’attendu par Apache.
Ensuite il ne reste qu’à remplir.
Pour le script d’installation, il n’y a qu’à copier /usr/bin/modsearch_install.sh en modmodulenouveau_install.sh et modifier uniquement les variables $SOURCES et $MOD.

Les filtres Apache

Il existe plusieurs filtres, qui sont passés dans l’ordre lorsqu’ils arrivent au serveur, puis sont passés exactement dans l’ordre inverse lorsqu’ils repartent vers le client (un seul m’intéresse, le premier : à l’arrivé ce sont les filtre d’entrée, et lorsque cela repart ce sont les filtres de sortie) :

  1. AP_FTYPE_RESOURCE
    Pour les filtres de contenu : cela englobe tous les types de filtres qui peuvent modifier le contenu, cela va de la décomposition de pages XML qui arrivent, à la transformation d’images ou encore à l’assemblage de contenu qui arrive en plusieurs fois. Ce type de filtre peut changer complètement la nature du contenu de la requête. Par exemple, un filtre XSLT peut transformer le contenu d’une page XML en une page HTML ou en un fichier PDF ;
  2. AP_FTYPE_CONTENT_SET
    C’est la seconde étape du filtrage du contenu, qui est principalement destinée à empaqueter le contenu, par exemple le module mod_deflate (qui applique une compression de type gzip) ;
  3. AP_FTYPE_PROTOCOL
    Le troisième filtre, : le filtre habituel a pour fonction d’insérer les entêtes HTTP au début des données qui ressortent des filtres de contenu. C’est réalisé par un filtre intégré nativement à Apache : le filtre HTTP_HEADER(la fonction ap_http_header_filter exactement), donc les applications, en général, l’ignorent.
  4. AP_FTYPE_TRANSCODE
    On s’en tape, ça ne sert pratiquement jamais.
  5. AP_FTYPE_CONNECTION
    On s’en tape, ça ne sert pratiquement jamais.
  6. AP_FTYPE_NETWORK
    On s’en tape, ça ne sert pratiquement jamais.

Zeemoz : version ou config de libtool

Il y a souvent un problème avec soit la version, soit la config, de libtool.
Il faut toujours que libtool soit configuré pour compiler des librairies partagées, ce qu’il ne fait pas par défaut.
Il faut aller dans /opt/httpd/build/libtool et vérifier que le paramètre "build_libtool_libs" soit à "yes" :
# Whether or not to build shared libraries.
build_libtool_libs=yes

Linux : un serveur Knock (knockd). Mais c'est quoi ?

En résumé, il s’agit d’un système dit des « portes dérobées ». Le knockd scrute en permanence les paquets entrants et vérifie si certains d’entre eux répondent à une séquence prédéfinie, et si oui, il exécute une action. On peut imaginer une action qui est l’ouverture du port SSH pour l’IP à l’origine de la séquence.

Par ex, je décide que si une IP m’envoie un paquet SYN sur le port 342 en TCP, puis un paquet ACK sur le port 15161 en UDP, et enfin un paquet RST sur le port 63009 en TCP, alors j’ajoute une règle iptables qui autorise la connexion de cette IP sur le port 22 et qui forwarde cette connexion vers un autre ordinateur de façon transparente.

Le développeur se connecte alors en SSH sur mon ordinateur et se retrouve sur un autre comme par magie, de manière entièrement transparente pour lui. Simple, sûr et efficace.

Petite contrainte : il a faut un client « knock » qui envoie les bons paquets dans le bon ordre et au bon endroit. Il existe un binaire pour quasiment toutes les plateformes, Win32, Linux, MacOS, etc. Donc avant chaque connexion, il devra lancer une commande du genre :

./knock 293.15.12.12 ack:34562:tcp ack:961:udp rst:63009:tcp

Puis il pourra se connecter en SSH. Une fois la session terminée, il faut fermer la porte avec le même genre de commande. Pour se simplifier la vie on peut par exemple se faire 2 scripts, un « sshopen » et l’autre « sshclose » qui contiennent chacun la commande adéquate.

Le redirection interne

Il est possible dans Apache, lors de la gestion de la requête, de faire une redirection interne, c’est à dire de faire croire qu’il y a eu une redirection, mais au lieu de la renvoyer au client, et que le client demande la nouvelle URL, elle est faite en interne. Pour pouvoir faire cela, deux possibilités :

  1. Location: http://olivier.pons.free.fr/apache/
  2. Location: /apache/

La première est basée sur la nature double de l’entête Location d’un script CGI : elle force à envoyer une redirection au client, alors que la seconde fait une redirection en interne, sans envoyer quelque chose au client.

Seule la seconde possibilité nous intéresse. Il est possible de le faire de deux façons dans un module :

  1. void ap_internal_redirect(
      const char *new_uri, request_rec *r)
    .

    Cette forme de redirection interne est le mécanisme à utiliser dans tous les cas à de rares exceptions près. Cette fonction crée un nouvel objet requête pour l’URL passée en paramètre, et lance la nouvelle requête comme si new_uri avait été demandée en premier lieu.

  2. void ap_internal_fast_redirect(
      request_rec *new_req, request_rec *r)

    Cette fonction clone une structure existante new_req dans la requête en cours afin de pouvoir mettre en place une nouvelle requête et simuler le fait qu’on lui passe le contrôle. Ce mécanisme est parfois utilisé pour promouvoir une sous-requête en requête principale. Ce qui est important de noter c’est qu’on ne repart pas de zéro, donc on ne refait pas complètement la requête.

Dix façons de devenir un meilleur développeur PHP

Les 5 premiers conseils viennent d’ici

Les 5 conseils suivants venaient de ce lien d’http://www.hackingajax.com/2008/02/13/5-more-ways-to-be-a-better-php-developer/ mais il est mort…

Souvent, un développeur PHP inexperimenté va sauter sur IRC et poser une question sur Freenode##php. Et si la question est facile, il aura une réponse rapidement. Au début. Parce que par la suite, il va être bombardé de réponses du style « LOL », « ROFL », « Va apprendre PHP et reviens », « Vas te documenter un minimum », « On n’est pas ton prof personnel », etc. Donc, comment devenir un meilleur développeur PHP ? Dans ce post, je vais mettre en avant cinq façons d’être un meilleur développeur, d’être plus productif, d’écrire moins de code et de faire ainsi plus de choses avec vos applications web. Il y a toujours quelque chose de nouveau à apprendre quand on parle de développement PHP. Nouvelles fonctions internes, nouveaux frameworks, nouveaux design patterns, nouveau styles de documentation. Ci-suivent quelques-unes des façons les plus efficaces pour vous aider à être un meilleur développeur PHP.

  1. Lisez le manuel
    Je ne le dirai jamais assez : c’est là qu’il faut regarder en premier et il y a des tonnes de choses à apprendre simplement en lisant le manuel. Les problèmes les plus courants sont déjà résolus si vous lisez ce qui concerne les chaines de caractères (string), et les tableaux (array). Il y a plein d’exemples qui fonctionnent directement accessibles, et souvent, rien qu’en parcourant le manuel vous allez vous rendre compte que vous êtes en train de ré-inventer la roue, parce qu’une fonction que vous voulez faire existe déjà et, mieux, elle est directement d’origine dans PHP ! Le manuel PHP est votre ami. Note d’Olivier : une petite astuce supplémentaire : si vous voulez chercher quelque chose, il vous suffit de taper : php.net/[mot à chercher] et même si PHP ne le connait pas il vous donnera une liste de mots approchants ! Génial non ?
  2. Balladez vous dans le code d’autres personnes
    PHP a plein de code open source. Pourquoi ne pas apprendre grâce à ça ? Récupérez une application PHP open source et jetez un coup d’oeil dans le code. Les plus gros projets sont sûrement meilleurs, car, même s’ils auront des structures plus complexes, ils auront des systèmes fonctionnels mais derrière tout ça une documentation détaillée qui explique tout. Visitez SourceForge.net si vous n’arrivez pas à trouver un point de départ.
  3. Apprenez un nouveau framework
    Il y a plus de frameworks PHP que vous n’avez eu de diners galants qui se sont bien terminés (!) ; la plupart sont open source et disponibles en ligne si vous savez où regarder. Essayez les principale, par exemple phpframeworks.com a une excellente liste. Votre framework ne peut jamais être entièrement complet, votre prochain travail, ou projet, aura besoin de telle ou telle fonctionnalité, ou s’appuiera sur un framework différent et vous trouverez certainement que des idées des autres sont très utiles pour l’un de vos projets.
  4. Recherchez
    Vous avez probablement entendu plein de choses et de mots dans le contexte d’un développement Internet en PHP. En allant de OOP à MVC, en passant par KISS, DRY, YAML, INI, REST, XML-RPC, etc, il y a des centaines de termes techniques et de concepts ici qui pourraient être directement reliés à vos travaux. Peut-être avez-vous déjà une compréhension basique, ou grossière d’eux, mais est-ce que vous savez vraiment en profondeur ce qu’ils signifient pour vous ? Passez un peu de temps à faire de la vraie recherche, apprenez, formez vous un peu dessus. Wikipedia est un bon endroit pour commencer. Vous allez inévitablement apprendre des choses que vous ne connaissez pas, et ça ne peut que vous être profitable.
  5. Apprenez la programmation orientée objet
    C’est un peu lié au point précédent, mais la programmation orientée objet (POO, ou en Anglais, Object Oriented Programming, OOP), est beaucoup plus importante que vous ne pouvez l’imaginer : est-ce que vous connaissez vraiment la POO sur PHP 5 ? Par exemple, est-ce que vous manipulez facilement les classes abstraites, les interfaces, le mot clé implements, les méthodes et propriétés statiques, et les propriétés protected ? Beaucoup de développeurs PHP expérimentés ne sont pas compétents dans ce domaine, et pourtant, si vous utilisez ce genre de caractéristiques propres à la POO, vous construirez certainement des architecture beaucoup plus souples, évolutives, et vous gagnerez par là même beaucoup de temps de développement.
  6. Commencez un projet que d’autres personnes (développeurs et utilisateurs finaux) vont utiliser.
    Vous ne gagnerez jamais autant de respect (ou de dédain) plus rapidement qu’en écrivant un programme pour des étrangers qui doivent se servir de votre code. Que ce soit une application web pour des utilisateurs finaux, ou une extension PEAR pour les développeurs, ou un plugin WordPress pour le bloggeurs, le fait de mettre un logiciel, ou du code entre les mains d’autres personnes de manière à ce qu’elles puissent y réagir est la chose la plus efficace que vous puissiez faire pour devenir un meilleur développeur. Être mis dans la position de devoir répondre aux demandes des uns et des autres est aussi important et valorisant que le lien entre un journaliste et le journal publié. Tous ceux qui l’ont fait vous le diront, ce n’est pas facile mais une fois que vous arrivez à gérer ça, vous saurez écrire en étant sous pression, avec des délais à tenir, et éventuellement sous le feu d’une opinion publique qui peut ne pas être facile. D’ailleurs, écrire un programme en entier de bout en bout n’est pas si différent. Faites votre travail, donnez-le et attendez le retour. C’est cette boucle d’échanges qui fait les bons programmes et les bons développeurs. En fin de compte, c’est peut-être ce fameux feedback qui a principalement de la valeur.
  7. Apprenez un autre langage.
    Si vous commencez à peine avec PHP, ce n’est peut-être pas le moment de vous plonger dans quelque chose de nouveau, mais si vous connaissez le langage et que vous voulez amélorier vos compétences, vous verrez qu’il y a des avantages à ne pas être spécialisé uniquement dans un seul langage. Par exemple : Java vous oblige à comprendre la programmation orientée objet (P.O.O., en Anglais : O.O.P.), Ruby on Rails vous oblige à apprendre le principe Modèle – Vue – Conteneur (M.V.C.), C# vous oblige à apprendre ce qu’est la dépendance à l’autocomplétion (je blague, C# ne sert à rien, apprenez Java c’est déjà une excellente chose). Le fait d’élargir vos horizons vous offre la possibilité de comprendre comment d’autres langages ont résolu certains problèmes qui ne le sont pas encore, ou pas correctement, en PHP, ou bien qui ne sont pas évidents à résoudre, tout simplement. Par exemple, je vous certifie que je suis devenu un développeur PHP nettement plus compétent depuis que j’ai écrit un peu plus de 7,500 lignes de code pour Ruby on Rails. Apparemment, je ne suis pas le seul.
  8. Apprenez un autre langage à quelqu’un.
    Rien ne vous fait mieux apprendre que d’apprendre à quelqu’un d’autre. N’importe quelle personne qui est vraiment intéressée par ce que vous apprenez va inévitablement vous posez des questions sérieuses, des questions précises, des colles que vous aurez du mal à surmonter au début, mais qui vont vous amener à un degré de connaissance du langage insoupçonnable. Et puis au moins vous aurez un autre angle de vision sur ce qu’est la patience, lorsque vous aurez à répondre pour la vingtième fois à « Au fait, vous pourriez ré-expliquer ce qu’est une variable ? ». J’ai appris le langage Python à mon fils, récemment, après n’y avoir pas touché pendant 5 ans. C’était une expérience très intéressante pas uniquement dans le sens où j’ai réalisé à quel point j’avais tout oublié de Python mais surtout dans la manière de programmer qui est différente. Quand vous réussissez à apprendre à des jeunes de 13 ans pourquoi vous devez transformer des entiers avant de pouvoir les concaténer à des chaines de caractères en Python et pourquoi ce n’est pas nécessaire en PHP — et qu’il le comprennent — vous aurez d’ici là appris énormément de choses et vous serez forcément devenu un meilleur développeur.
  9. Demandez des suggestions et des solutions
    Si jamais vous n’arrivez pas à vous décoller d’IRC, assurez vous que vous avez vraiment recherché dans tous les sens la résolution d’un problème avant de demander de l’aide. Et lorsque vous demandez, montrez votre code. Si vous montrez que vous avez essayé quelque chose et que vous avez fait déjà un bon paquet d’efforts, croyez moi, vous aurez beaucoup plus facilement des réponses à vos questions.
    Vos question devraient ressembler plutôt à « je pense qu’ici je fais quelque chose qu’il ne faut pas, pouvez-vous m’aider » plutôt que « pourriez vous faire le travail pour moi. »
  10. Utilisez ce que vous lisez.
    Que dire de plus que cette loi de programmation simple, cardinale et fondamentale :
    C’est toujours plus dur de lire du code que de l’écrire. (Joel Spolsky) ?
    Après ces deux conseils de Lisez le manuel et Balladez vous dans le code d’autres personnes, vous allez apprendre beaucoup de choses, mais il ne suffit pas que de lire. Il faut aussi écrire. Vous ne pouvez pas lire 100 livres faits par des gens talentueux et pondre juste après Le Seigneur des Anneaux en une nuit. Ne faites pas que parcourir le code, utilisez le aussi dans le votre. Eventrez CakePHP et regardez comment ils gèrent la validation des formulaires. Ecartelez HTML_QuickForm2 et utilisez sa création d’éléments. Comprenez comment WordPress gère les transactions de sa base de données, et comparez avec Drupal. Ce sont toutes les choses que votre application, à un moment ou à un autre, devra pouvoir réaliser, donc vous devriez vraiment jeter un coup d’oeil et essayer de voir comment les autres ont résolu les problèmes auxquels vous êtes confronté. Et quand c’est adéquat, et légal, utilisez leur code. Vous apprendrez incroyablement plus si vous devez prendre un morceau de code, et le modifier afin qu’il fonctionne dans votre application que si vous ne faite que lire les branches SVN du projet.

Pour la nouvelle année… j'ai installé oxyl-box

Voici comment installer quelque chose qui transforme votre Pinnacle Showcenter en un outil pratique, sympa, rapide à utiliser et qui ne surcharge pas votre ordinateur avec plein de choses complètement inutiles.

Le site où j’ai trouvé mon bonheur est ici : oxyl.de

Notez la première chose d’importance : tout est gratuit.

Avant d’aller plus loin, voici la petite histoire de mon Pinnacle Showcenter 200, pour que vous compreniez ma démarche, qui sera peut-être la vôtre aussi.

Un jour, j’ai lu sur Internet, le test d’un lecteur vidéo qui m’a semblé vraiment super sympa. J’ai finalement craqué : j’ai acheté le Pinnacle Showcenter 200.

Lorsque je l’ai reçu, j’ai fait ce que toute personne normale aurait fait, à savoir, insérer le CD et installer le logiciel pour utiliser mon joujou.

Qu’est-ce que je n’avais pas fait ! Il m’a demandé d’installer tout un tas de choses, ça a pris un temps fou, il a récupéré le Framework .Net de Microsoft, il a installé sans me demander mon avis l’intégralité du serveur de base de données Microsoft SQLServer version personnelle, qui prend un maximum de mémoire et de ressources, et, cerise sur le gâteau, a rajouté plus de dix secondes au démarrage de mon ordinateur !

Je me suis dit : il faut trouver une autre solution. J’ai alors cherché sur Internet, et je suis tombé sur ce petit bijoux dont j’ai donné l’adresse déjà plus haut : oxyl.de

Voilà comment faire pour l’installer, parce que ce n’est pas en deux secondes que tout fonctionne, mais au moins, une fois que ça fonctionne, votre PC ne rame pas inutilement, et c’est déjà quelque chose d’énorme.

  1. Récuperer la version complète d’installation ici
  2. L’installer en cliquant « oui », avec toutes les options, y compris si certaines ne sont pas cochées (je crois que « stoWeb » n’est pas coché, il faut le cocher en mode « installation complète sur le disque »)
  3. Après que tout ait été installé, téléchargez cette archive : oxylbox-www.rar
  4. Ensuite, décompressez là directement par dessus le répertoire www d’installation d’oxyd, normalement c’est « C:\Program Files\oxylbox »
  5. Enfin, il faut éditer le fichier « php.ini » qui est dans le répertoire de Windows (normalement, C:\Windows) et cherchez le mot extension_dir. Assurez-vous que vous avez bien ceci :
    extension_dir = "C:\Program Files\oxylbox\php5\ext"
    Sachant que le répertoire est celui où vous avez installé oxyd.

Voilà, tout tourne ! Pour vérifier, ouvrez votre navigateur Internet et tapez cette adresse : http://127.0.0.1:8000/

Normalement tout fonctionne.

Maintenant la note pour les informaticiens :

En réalité, programme est très vieux et le type qui a fait ça est un jeune qui a découvert au fur et à mesure pas mal de fonctionnalités, et les a ajoutées, ce qui donne lieu à un bazar monstre. De plus, en php, il utilise les register_globals=On c’est à dire que dans un POST, si une variable $_POST['P']='zoubida', alors il y accède directement via if (isset($P))… Mais ceci mis à part, il a programmé un mini serveur dédié pour envoyer du flux audio/vidéo etc vers le ShowCenter. Donc ça c’est le côté super sympa. En fait ce qu’il faudrait refaire c’est toute la présentation, de manière à avoir quelque chose de clair, orienté objet, que n’importe qui pourrait facilement réutiliser. C’est vraiment dommage, parce qu’il y avait un bon potentiel derrière tout ça, mais il n’est pas exploitable tant que toute l’interface ne sera pas réécrite. Tous les commentaires sont en Allemand, ils ne sont pas fait selon le standard JavaDoc, donc il est impossible de générer une documentation correcte, les pages générées ne sont pas du tout propres, heureusement que le navigateur du ShowCenter est « souple » et les affiche correctement etc. Ceci dit il y a des idées sympas, par exemple, lorsqu’on lui demande de changer de « skin », il vérifie tous les répertoires existants dans le répertoire « skins » et passe au suivant. Autrement dit en pratique, vous faite simplement un copier coller d’un répertoire, et vous le renommez, changez quelques images pour tester et tout fonctionne sans toucher une ligne de code. Ca c’est super pratique. Si un jour j’ai un peu de temps, je referai tout ça en php. Mais ce n’est pas à l’ordre du jour pour 2008 !

Php : optimisation vs lisibilité

Attention, ce qui suit ne s’applique pas systématiquement partout, mais il faut avoir cela en tête dans certaines occasions.

Ci-suivent deux possibilités de codes qui font exactement la même chose : vous allez certainement me dire : le code 2 est très nettement moins bien que le code 1, à savoir que si on veut rajouter quelque chose dans le 1 c’est une ligne alors que dans le 2 c’est quatre lignes. Eh bien c’est vrai, mais il faut garder le code 2 qui est plus long et qui semble se répéter de manière inutile. Pourquoi, me demanderez-vous ? Je vais vous dire pourquoi :

Il faut toujours adapter le code en fonction de votre supérieur hiérarchique.

Si, si, je ne plaisante pas. Si vous avec un patron qui vous dit, une bonne fois pour toutes : « Voilà les champs qu’on utilisera cela ne changera pas », et, surtout, que c’est vrai, alors vous pouvez vous faire plaisir et factoriser au maximum. A l’inverse, un patron qui arrive et qui vous dit « Voilà les champs qu’on utilisera cela ne changera pas », et, le connaissant vous savez que c’est faux, alors utilisez le code 2. Cela m’arrive tout le temps : « Au fait Olivier j’ai oublié de te dire : il y a un nouveau champ garantie qui est, en réalité un pourcentage d’une autre garantie et il faut s’assurer que l’autre existe vraiment ». Si vous avez adopté le code 1 avec ce genre de patron, vous êtes fichu : Ce code n’est pas prévu pour gérer des exceptions.

Dernier argument pour le code 2 : il est beaucoup plus compréhensible que le code 1. Beaucoup, beaucoup, beaucoup. Et si quelqu’un doit prendre le relai après vous, votre objectif en tant que professionnel, c’est de lui faciliter la tâche au maximum. Donc… vive le code 2 !

Code 1

private function CreerTableauValeursGarantie($gar,$tab)
{
 foreach ($tab as $fc_aff=>$tab_get) {
  if ($gar->$fc_aff()) {
   foreach ($tab_get as $idx=>$fc_get) {
    $ret[$idx]=$gar->$fc_get();
   }
  }
 }
}


$tab_gar[$id_g][$idp_idf] =
 $this->CreerTableauValeursGarantie($gar, array(
  'getAffSurmortalite' => array(
   VAL_SURMORTALITE => 'getTauxSurprime2'),
  'getAffSurprime1' => array(
   VAL_SURPRIME_ADDITIONNELLE_DUREE_1 => 'getSurprimeAddDuree1',
   VAL_SURPRIME_ADDITIONNELLE_TAUX_1 => 'getSurprimeAddTaux1'),
  'getAffSurprime2' => array(
   VAL_SURPRIME_ADDITIONNELLE_DUREE_2 => 'getSurprimeAddDuree2',
   VAL_SURPRIME_ADDITIONNELLE_TAUX_2 => 'getSurprimeAddTaux2'),
  'getAffSurprime3' => array(
   VAL_SURPRIME_ADDITIONNELLE_DUREE_3 => 'getSurprimeAddDuree3',
   VAL_SURPRIME_ADDITIONNELLE_TAUX_3 => 'getSurprimeAddTaux3'),
  'getAffSurprime4' => array(
   VAL_SURPRIME_ADDITIONNELLE_DUREE_4 => 'getSurprimeAddDuree4',
   VAL_SURPRIME_ADDITIONNELLE_TAUX_4 => 'getSurprimeAddTaux4'),
  'getAffSurprime5' => array(
   VAL_SURPRIME_ADDITIONNELLE_DUREE_5 => 'getSurprimeAddDuree5',
   VAL_SURPRIME_ADDITIONNELLE_TAUX_5 => 'getSurprimeAddTaux5'),
  'getAffExclusionsPathos' => array(
   VAL_GAR_EXCLUSIONSPATHOS => 'getExclusionsPathologies' ),
  'getAffExclusionsSports' => array(
   VAL_GAR_EXCLUSIONSSPORTS => 'getExclusionsSports' ),
  'getAffExclusionsProfs' => array(
   VAL_GAR_EXCLUSIONSPROFS => 'getExclusionsProfessions' ),
  'getAffMensualite' => array(
   VAL_GAR_MENSUALITE => 'getMensualite' ),
  'getAffFranchise' => array(
   VAL_GAR_FRANCHISE => 'getAffFranchise' )));

Code 2


if ($gar->getAffSurmortalite()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURMORTALITE ] =
  $gar->getTauxSurprime2();
}
if ($gar->getAffSurprime1()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_DUREE_1 ] =
  $gar->getSurprimeAddDuree1();
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_TAUX_1 ] =
  $gar->getSurprimeAddTaux1();
}
if ($gar->getAffSurprime2()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_DUREE_2 ] =
  $gar->getSurprimeAddDuree2();
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_TAUX_2 ] =
  $gar->getSurprimeAddTaux2();
}
if ($gar->getAffSurprime3()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_DUREE_3 ] =
  $gar->getSurprimeAddDuree3();
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_TAUX_3 ] =
  $gar->getSurprimeAddTaux3();
}
if ($gar->getAffSurprime4()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_DUREE_4 ] =
  $gar->getSurprimeAddDuree4();
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_TAUX_4 ] =
  $gar->getSurprimeAddTaux4();
}
if ($gar->getAffSurprime5()) {
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_DUREE_5 ] =
  $gar->getSurprimeAddDuree5();
 $tab_gar[$id_g][$idp_idf][VAL_SURPRIME_ADDITIONNELLE_TAUX_5 ] =
  $gar->getSurprimeAddTaux5();
}
if ($gar->getAffExclusionsPathos()) {
 $tab_gar[$id_g][$idp_idf][VAL_GAR_EXCLUSIONSPATHOS ] =
  $gar_cm->getExclusionsPathologies();
}
if ($gar->getAffExclusionsSports()) {
 $tab_gar[$id_g][$idp_idf][VAL_GAR_EXCLUSIONSSPORTS ] =
  $gar_cm->getExclusionsSports();
}
if ($gar->getAffExclusionsProfs()) {
 $tab_gar[$id_g][$idp_idf][VAL_GAR_EXCLUSIONSPROFS ] =
  $gar_cm->getExclusionsProfessions();
}
if ($gar->getAffMensualite()) {
 $tab_gar[$id_g][$idp_idf][VAL_GAR_MENSUALITE ] =
  $gar_cm->getMensualite();
}
if ($gar->getAffFranchise()) {
 $tab_gar[$id_g][$idp_idf][VAL_GAR_FRANCHISE ] =
  $gar_cm->getAffFranchise();
}

Qu'est-ce que le workflow ?

On appelle « WorkFlow » (traduisez littéralement « flux de travail ») la modélisation et la gestion informatique de l’ensemble des tâches à accomplir et des différents acteurs impliqué dans la réalisation d’un processus métier (aussi appelé processus opérationnel). Le terme de Workflow pourrait donc être traduit en français par Gestion électronique des processus métier. Un processus métier représente les interactions sous forme d’échange d’informations entre divers acteurs tels que :

  • des humains,
  • des applications ou services,
  • des processus tiers.

De façon pratique, un WorkFlow peut décrire :

  • le circuit de validation,
  • les tâches à accomplir entre les différents acteurs d’un processus,
  • les délais à respecter,
  • les modes de validation

Il fournit en outre, à chacun des acteurs, les informations nécessaires pour la réalisation de sa tâche.