juillet
2013
J’ai du résoudre le problème suivant dans l’ordre:
- Ecrire un premier programme qui exploite les données présentes dans weather.dat qui affiche le jour (colonne 1) de la plus basse température (colonne 3)
- Ecrire un second programme qui exploite les données présentes dans football.dat et qui affiche le plus petit différentiel de but entre les but encaissé (colonne A) et les buts marqués (colonne B)
- Ecrire un troisième programme qui factorise les deux programmes précédents
Le premier programme a été assez facile à développer, j’ai progréssé jusqu’à arriver à insérer chaque colonne dans un tableau.
Le code du second programme est plus élégant, on peut noter l’utilisation d’un opérateur ternaire, et le remplacement d’une variable incrémentale par un booléen. A noter que le même code de lecture et d’itération a été conservé avec un ajout de contrainte sur l’expression régulière.
Partant de ce constat, j’ai commencé le refactoring en prenant comme base la fonction football.
Le premier élément factorisé est le nom du fichier et l’instruction de lecture du fichier.
Ensuite, étonnamment, on constate que l’expression régulière de la fonction weather est finalement plus universelle et fonctionne dans les deux cas, pas celle de football.
A ce stade, je suis passer à l’itération, au départ j’ai perdu de temps en cherchant à rendre le code le plus générique possible mais finalement je me suis résolu à faire cela le plus simplement possible pour me limiter au contexte du problème à résoudre.
Puis je me suis réellement rendu compte que les deux fonctions avait plus de points en commun qu’il n’y paraissait au départ, en effet dans les deux cas ce qui est recherché c’est le minimum, qu’il soit une valeur ou la différence entre deux valeurs ($diff et $min)
J’ai également supprimé une répétition inutile d’insctruction, la fonction split dans les deux blocs if était identique
Premier constat, le second programme possède un code syntaxiquement plus claire mais manifestement moins portable un exemple: l’introduction de contraintes dans l’expression régulière
On peut en déduire que:
Le factorisation a été facilité par l’emploie de fonctions comme file_get_content, foreach et split
Elle a été rendu difficile par les parties de code différentes comme l’utilisation du booléen ou le nombre de colonnes et la nature des données à traiter
Mais au final même si toutes les similarités ne sautaient pas immédiatement aux yeux, les deux programmes étaient quasi identiques
L’écriture du second programme était clairement influencé par le premier dans le sens ou j’ai essayé d’en améliorer les principes. Les points fort était l’introduction d’un booléen et l’élimination de code dupliqué. Le point faible était la modification inutile de l’expression régulière.
Conclusion:
La factorisation apporte simplification et réutilisabilité du code en revanche on perd en clarté car par exemple le nommage des variables devient plus abstrait. On perd également un peu en terme de sécurité car on est obligé d’utiliser une expression régulière plus générale qui pourrait laisser passer des d’erreurs de formatage de document.
Le code gagne également en lisibilité et en maintenabilité puisque il peut être facilement étendu au traitement de plus de colonnes/opérations par exemple.
Et pour finir voici le code: weather-football-dry