Wikipédia : Le terme « bonnes pratiques » désigne, dans un milieu professionnel donné, un ensemble de comportements qui font consensus et qui sont considérés comme indispensables par la plupart des professionnels du domaine, qu'on peut trouver sous forme de guides de bonnes pratiques (GBP).
Utilisées dans de nombreux domaines : médical, agricole, etc.
Informatique : exemple de l'accessibilité (Web Content Accessibility Guidelines)
En programmation, les bonnes pratiques facilitent l'échange de code, sa compréhension et sa réutilisation.
Éviter les classes trop « grosses »
Bien choisir les noms de variables, fonctions, classes, méthodes, etc.
Garder les méthodes « petites » (en nombre de lignes de code)
Commenter son code
Être cohérent dans son style de code et utiliser le style de code standard
Source : Writing Good Java Code
Bonnes pratiques pour la rédaction de code
Conventions dépendant du langage utilisé
import os
import sys
et non import sys, os
public static void main(String[] args) {
}
et non
public static void main(String[] args)
{
}
Des règles devenues communes : UTF-8, indentation 4 espaces, etc.
Règles de nommages diffèrent selon les langages (snake_case, camelCase, etc)
PHP Framework Interop Group composé de Framework, CMS, etc
Groupes de travail produisent les PSR (PHP Standard Recommendation)
PSR : document représentant un consensus sur les règles à adopter
Intérêt de respecter les PSR : interopérabilité, lisibilité du code (mêmes look & feel dans tous les projets), rédaction simplifiée
Règles de présentation du code : PSR 2 Codign Style Guide
Validation du code : PHP Code Sniffer
Nettoyer son code : PHP Coding Standards Fixer
Configurer son éditeur correctement
Permettre d'utiliser un même nom pour une classe ou fonction mais dans des espaces différents
Créer des alias pour avoir des noms plus courts dans son code
Similitudes avec la notion de package
en Java
Structure hiérarchique en PHP (penser à l'arborescence d'un système de fichiers)
Utilisable pour les constantes, fonctions et classes
namespace MyProject\Sub\Level;
Bonne pratique : un seul namespace par fichier
namespace Appli\Exemple;
const MYCONST = 'Une constante dans le namespace défini';
function MyFunction()
{
return "Une fonction dans le namespace " . __NAMESPACE__;
}
class MyClass
{
public function hello()
{
return "Hello venant du namespace " . __NAMESPACE__;
}
}
echo Appli\Exemple\MYCONST;
echo Appli\Exemple\MyFunction();
$myClass = new Appli\Exemple\MyClass();;
echo $myClass->hello();;
// appel d'une fonction du namespace global
echo strlen('la longuer de cette chaine');
// appel d'une classe du namespace global
$date = new Date();;
namespace Appli\Exemple;
echo MYCONST;
echo MyFunction();
$myClass = new MyClass();;
echo $myClass->hello();;
// appel d'une fonction du namespace global
echo \strlen('la longuer de cette chaine');
// appel d'une classe du namespace global
$date = new \Date();;
namespace MyProject\Sub\Level;
use \Unicaen\Ldap\Connector;
use \LdapProjet\LdapService\Connector as LdapConnector;
Voir les règles de résolution de noms
Objectif : ne plus avoir à écrire les require_once
au début de chaque fichier
Moyen : définir une (ou plusieurs) fonction(s) déterminant quel fichier inclure en fonction du nom de classe
Fonction spl_autoload_register
(documentation) pour définir une fonction ou classe/méthode qui sera appelée à chaque appel à une classe pour laquelle la déclaration n'a pas encore été lue par PHP.
Cette fonction reçoit en argument le nom complet de la classe utilisée et doit faire le mapping avec le fichier à inclure
Un namespace doit commencer par un vendor name
PSR 4 Autoloader définit les mappings
Isomorphisme entre (sous-)namespaces et dossiers
Interface : écriture d'un contrat pour définir les signatures des méthodes de classes
namespace Jml\Poem;
interface PoemInterface
Règle de nommage : suffixe Interface
Classe abstraite : abtraction et factorisation de code
namespace Jml\Poem;
abstract class AbstractPoem
Règle de nommage : préfixe Abstract
Possibilité d'indiquer à une fonction ou méthode le type attendu en argument
Uniquement pour les classes (PHP 5)
Aussi pour les scalaires (PHP 7)
Utile pour le débuggage : Warning si l'argument n'est pas du type attendu
Utile pour les IDE pour vérifier la syntaxe et auto-compléter les méthodes
Rigueur dans l'écriture du code
Rigueur dans le nommage des classes et fichiers
Meilleure lisibilté de votre projet PHP
Partage de code simplifié