Ébauche des normes de codage de XOOPS 3.0
Auteurs :
-
Taiwen Jiang <phppp@users.sourceforge.net>
Portée
Ce
document fournit les normes et les directives de codage pour les
développeurs et les équipes travaillant sur ou avec le projet XOOPS. Les
sujets traités sont :
-
Formatage des fichiers PHP
-
Conventions de nommage
-
Règles de codage
-
Documentation intégrée
-
Erreurs et exceptions
Rôles des Développeurs :
-
Développeurs XOOPS : Développeurs qui contribuent aux 'frameworks' XOOPS, incluant
-
Développeurs
du noyau : Développeurs qui contribuent au SVN du noyau de XOOPS et dont
le code sera employé par des développeurs d'application XOOPS.
-
Développeurs
du 'framework' : Développeurs qui contribuent aux 'frameworks' de XOOPS
qui pourraient être adoptés dans le noyau de XOOPS à l'avenir.
-
Développeurs d'interface utilisateur : Développeurs qui travaillent sur les thèmes de XOOPS et les 'templates' de modules.
-
Créateurs d'applications XOOPS : Développeurs qui créent leurs propres applications sur la plate-forme XOOPS
-
Développeurs de modules : Développeurs qui construisent des modules tiers utilisant la plate-forme et les bibliothèques XOOPS.
De
bonnes normes de codage sont importantes dans n'importe quel projet de
développement, en particulier lorsque plusieurs développeurs
travaillent sur un même projet. Avoir des normes de codage aide à
s'assurer que le code est de qualité, a peu de bogues et est facile
à maintenir.
Les buts abstraits que nous poursuivons :
Au vu des buts ci-dessus, chaque situation exige un examen des circonstances et de l'équilibrage des compromis.
Pour les fichiers qui contiennent du code PHP, le tag fermant
("
? >")
doit être inclus
lorsque c'est nécessaire.
Employez
une indentation de 4 espaces, sans tabulation. Les
éditeurs de texte doivent être configurés pour convertir les
tabulations en quatre espaces
afin d'empêcher l'injection de tabulations dans le code source.
L'ojectif de
longueur de ligne à respecter est de 80 caractères ; c'est-à-dire que les développeurs
doivent s'appliquer à conserver le code aussi près que possible
de la barrière de 80 colonnes.
Cependant, de plus longues lignes sont acceptables. La longueur maximale
de n'importe quelle ligne de code de PHP est de 120 caractères.
La fin de ligne est la méthode standard pour les fichiers textes sous Unix. Les lignes doivent se finir avec un retour à la ligne (LF). Les retours à la ligne sont représentés comme le nombre ordinal 10, ou 0x0A en hexadécimal.
N'employez pas les retours chariot (CR) comme les ordinateurs Macintosh (0x0D).
N'employez pas le retour de chariot/retour à la ligne (CRLF) comme les ordinateurs Windows (0x0D, 0x0A).
Les lignes ne doivent pas
contenir d'espaces en fin de ligne.
Afin de faciliter cette convention, la plupart des éditeurs peuvent
être configurés pour supprimer les espaces en fin de ligne lors de la
sauvegarde du fichier.
-
Les noms pour toutes les classes et fonctions à l'intérieur de XOOPS doivent commencer par
Xoops
;
-
La
première lettre des noms de fonction doit toujours être en
minuscule; si nécessaire les noms doivent être séparés en utilisant
des tirets bas « _ », pas de CamelCaps (explication sur
CamelCaps en bas de cette page):
-
Les noms de classe doivent toujours être séparés en utilisant des CamelCaps (explications sur CamelCaps en bas de cette page);
-
Les noms des variables partagées, produites par XOOPS doivent commencer par
$xoops
suivi de CamelCaps.
-
Les applications tierces, y compris les modules, ne doivent pas commencer par
Xoops_
mais par le préfixe de l'application
En
créant une API à l'usage des développeurs d'application, si les
développeurs d'application doivent identifier des abstractions en
utilisant un nom composé, séparez les noms en utilisant des tirets bas (underscore),
pas les CamelCaps.Quand le développeur emploie une chaine de caractères,
il faut la normaliser en lettres minuscules. Lorsque cela est possible,
utilisez des constantes.
Les noms de classe du système, du noyau ou du 'framework'' doivent commencer par
Xoops
, comme
XoopsUser
,
XoopsCaptcha
.
Les noms de classe de module doivent commencer par
[identifiant du module],
comme
NewbbPost
.
Les classes d'interface doivent suivre les mêmes conventions que les autres classes (voir ci-dessus), mais doivent finir avec «_Interface», comme :
XoopsLogger_Interface
Pour
tous les fichiers, seuls les caractères alphanumériques, les tirets
bas et le tiret haut(« - ») sont autorisés. Les espaces sont
interdits.
N'importe quel fichier contenant du code PHP doit finir avec l'extension «
.php
».
Les noms de fichiers doivent être en minuscules.
Pour
tous les dossiers, seuls les caractères alphanumériques, les
tirets bas et le tiret haut(« - ») sont autorisés. Les
espaces sont interdits.
Les noms de répertoire doivent être en minuscules.
Le nom des fonctions du noyau et du module système doivent commencer par
xoops_doSomething ([...])
.
Les noms des fonctions du 'framework' doivent commencer par xoops_ [identifiant en minuscule],
comme
xoops_pear_doSomething ([...])
.
Les noms des fonctions de modules doivent commencer par
[identifiant du module en minuscule]_
, comme
newbb_getTopic ([...])
.
Employez «
NULL
» comme valeur par défaut au lieu de «
FALSE
», pour des situations comme ceci :
public function foo($required, $optional = NULL)
quand $optional n'a pas ou n'a pas besoin d'une valeur par défaut particulière.
Cependant, si
un paramètre facultatif est booléen, et que sa valeur par défaut logique
devrait être vrai, ou faux, l'utilisation de vrai ou faux est
acceptable.
Les constantes système commencent par
XOOPS_
:
XOOPS_URL
Les constantes de 'framework' doivent commencer par
XOOPS_ [identifiant]
:
XOOPS_PEAR_CONSTANT
Les constantes de module doivent commencer par
[identifiant du module]_
:
NEWBB_CONSTANT
Commencez toujours par le tiret bas :
_XOOPS_LANGUAGE_CONSTANT
,
_NEWBB_LANGUAGE_CONSTANT
Comme dans la documentation PHP, XOOPS utilise les lettres capitales pour les valeurs booléennes et la valeur «
NULL ».
A compléter
Le code PHP à l'intérieur de XOOPS doit toujours être délimité par les étiquettes complétes standard de PHP :
<?php
Les tags courts
ne sont jamais autorisées.
Les doubles « guillemets » ou le simple guillemet « apostrophe » sont autorisés pour une
chaine qui est littérale (ne contient aucune substitution de variable)
, l'« apostrophe » est encouragé :
$a = 'chaine exemple' ;
Quand
une chaine littérale contient des apostrophes, elle est autorisée à
délimiter la chaine avec des « guillemets ». Ceci est
particulièrement encouragé pour des commandes SQL :
La syntaxe ci-dessus est préférable à l'échappement des apostrophes.
La substitution de variable est encouragée
en utilisant le crochet .
OK mais non recommandé :
Pour l'uniformité, cette notation n'est pas autorisée :
Des chaines peuvent être concaténées en utilisant l'opérateur " . ".
Un espace
doit toujours être ajouté avant et après " . " pour améliorer la lisibilité :
Lors
de la concaténation de chaînes avec l'opérateur " . ", il est
permis d'écrire l'instruction sur plusieurs lignes pour
améliorer la lisibilité. Dans ces cas, chaque ligne doit être complétée
avec des espaces de telle sorte que l'opérateur " . "
soit aligné sous l'opérateur " = " :
Les nombres négatifs ne sont pas autorisés comme index de tableau.
Un
tableau indexé peut commencer par tout nombre non négatif,
toutefois ceci n'est pas recommandé. Nous recommandons que tous les
tableaux aient un index commençant à 0.
Lors
de la déclaration de tableau indexé via le constructeur de tableau, un caractère d'espacement doit être ajouté après chaque virgule pour améliorer
la lisibilité :
Il
est également autorisé de déclarer des tableaux indexés sur plusieurs
lignes via le constructeur de tableau. Dans ce
cas, chaque ligne doit être complétée avec des espaces de telle
sorte que les lignes respectent l'alignement ci-dessous :
$sampleArray = array(1, 2, 3, 'XOOPS', 'Project',
$a, $b, $c,
56.44, $d, 500);
En déclarant des tableaux associatifs via le constructeur de tableau, il est préférable de déclarer le tableau sur plusieurs lignes.
Dans ce cas, chaque ligne successive doit être complétée avec des
espaces de telle sorte que les clefs et les valeurs soient alignées :
Des classes doivent être appelées en suivant les conventions de nommage.
L'accolade est toujours écrite sur la
ligne, juste sous le
nom de la classe.
Chaque classe doit avoir un bloc de documentation qui se conforme à la
norme de phpDocumentor
.
Le code dans une classe doit être indenté avec le standard des quatre espaces.
Il est recommmandé d'écrire une seule classe par fichier PHP.
L'écriture de code additionnel dans un fichier de classe est autorisé mais non recommandé. Deux
interlignes doivent séparer la classe du code additionnel dans le fichier PHP.
Voici un exemple de déclaration acceptable de classe :
Des variables de classe doivent suivre les conventions de nommage.
Toutes les variables de classe doivent être déclarées au début de la classe, avant avant la déclaration de toute fonction.
Le constructeur 'var' n'est pas autorisée. Les variables de classe définissent toujours leur
visibilité
en employant
une des constructeurs 'private', 'protected', ou 'public'. L'accès aux variables directement en les rendant publique est
autorisé,
dans certains cas, c'est en faveur de méthodes d'accès ayant les préfixes set / get.
Les fonctions et les méthodes de classes doivent être créées en suivant les conventions de nommage.
Les méthodes doivent toujours déclarer leur
visibilité
en employant une des constructeurs
'
private', 'protected', 'public'.
L'usage dans la communauté PHP, consiste à déclarer les
méthodes statiques en premier :
public static
foo() { ... }
private static bar() { ... }
protected static goo() { ... }
Comme pour les classes, l'accolade d'ouverture pour une fonction ou une méthode est toujours écrite sur une
ligne
juste sous le
nom de fonction ou de méthode. Il n'y a
aucun espace entre le nom de fonction ou de méthode et la parenthèse d'ouverture
pour les arguments.
Voici un exemple acceptable de déclaration de méthode :
La valeur de retour ne doit pas être incluse entre parenthèses. Ceci
peut gêner la lisibilité et peut également modifier le code si une
fonction ou une méthode est ultérieurement modifiée pour obtenir une valeur de retour par référence.
function foo()
{
// WRONG
return($this->bar);
// RIGHT
return $this->bar;
}
L'utilisation du "type
hinting" est encouragé lorsque c'est possible. Par exemple,
class XoopsComponent
{
public function foo(SomeInterface $object)
{}
public function bar(array $options)
{}
}
Les fonctions de portée globale sont fortement déconseillées.
Les arguments de fonction sont séparés par un
espace simple
après la virgule. Voici un exemple acceptable d'un appel de fonction pour une fonction qui prend trois arguments :
Call-time pass by-reference est interdit.
Pass-by-reference est autorisé dans la déclaration de
fonctions seulement. Des arguments à passer par référence doivent être
définis dans la déclaration de fonction.
Pour les
fonctions dont les arguments permettent des tableaux, l'appel de fonction
peut inclure le constructeur de " array " et peut être coupé
en plusieurs lignes pour améliorer la lisibilité. Dans ce cas, les normes pour l'écriture des tableaux s'appliquent :
threeArguments(array(1, 2, 3), 2, 3);
threeArguments(array(1, 2, 3, 'XOOPS', 'Project',
$a, $b, $c,
56.44, $d, 500), 2, 3) ;
Les instructions de contrôle basées sur les constructeurs "
if
", "
else
", et le "
elseif
"
doivent avoir un espace simple avant la parenthèse ouvrante de la condition, et espace simple entre la parenthèse fermante et l'accolade.
Dans les instructions conditionnelles, à l'intérieur des parenthèses, les opérateurs doivent être séparés par des espaces pour plus de lisibilité. Les parenthèses sont conseillées pour améliorer la logique de groupement des longues conditions.
L'accolade d'ouverture est écrite sur la même ligne que l'instruction de condition. L'accolade de fermeture est toujours écrite sur sa propre ligne. Le contenu à l'intérieur des accolades doit être indenté à l'aide de 4 espaces.
Pour les instructions "if" qui incluent "elseif" ou "else", le formattage doit être comme dans ces exemples :
PHP autorise quelquefois ces instructions à être écrites sans accolades. Les normes de codage ne font pas de différence et toutes les instructions "if", "elseif", ou "else" doivent utiliser les accolades.
Les instructions de contrôle, écrites avec le constructeur "switch" doivent avoir un espace simple avant la parenthèse ouvrante de l'instruction de condition, ainsi qu'un espace simple entre la parenthèse fermante et l'accolade ouvrante.
Les instructions "case" à l'intérieur du "switch" ne doivent pas être indentées. Le contenu à l'intérieur de chaque instruction "case" doit être indenté avec 4 espaces.
Le constructeur "default" ne doit jamais être oublié dans une instruction "switch".
Tous les
blocs de documentation (" docblocks ") doivent
être compatibles avec le format de phpDocumentor. Pour plus
d'information, visitez http://phpdoc.org
Tout le code source écrit pour la plate-forme XOOPS ou opérant avec cette plateforme doivent contenir un "file-level docblock" tout en haut de chaque fichier et un"class-level docblock" juste au-dessus de chaque classe.
Le dièse, ' # ', ne doit pas être employé pour commencer un commentaire.
Chaque fichier contenant du code PHP doit avoir au début du fichier, un bloc d'en-tête contenant au moins ces tags de phpDocumentor :
/**
* Short description for file
*
* Long description for file (if any)...
*
* LICENSE
*
* You may not change or alter any portion of this comment or
credits
* of supporting developers from this source code or any supporting
source code
* which is considered copyrighted (c) material of the original
comment or credit authors.
*
* @copyright The XOOPS Project
http://sourceforge.net/projects/xoops/
* @license
http://www.fsf.org/copyleft/gpl.html GNU public license
* @author Author Name
<author email, or website>
* @version $Id$
* @since File
available since Release 3.0.0
*/
Chaque classe doit avoir un docblock qui contient au moins ces tags de phpDocumentor :
/**
* Short description for class
*
* Long description for class (if any)...
*
* @copyright The XOOPS Project
http://sourceforge.net/projects/xoops/
* @license
http://www.fsf.org/copyleft/gpl.html GNU public license
* @author Author Name
<author email, or website>
* @version $Id$
* @since File
available since Release 3.0.0
*/
Chaque fonction, y compris des méthodes d'objet, doit avoir un docblock qui contient au moins :
/**
* Does
something interesting
*
*
@param Place $where Where
something interesting takes place
*
@param integer $repeat How many times
something interesting should happen
*
@return Status
*/
public function
xoops_doSomethingInteresting(Place $where, $repeat = 1)
{
// implementation...
}
Si un composant emploie un autre composant, alors le composant utilisé est responsable du chargement de l'autre composant. Si l'utilisation est conditionnelle, alors le chargement devrait également être conditionnel.
Si le(s) fichier(s) pour l'autre composant doivent toujours être chargés avec succès, indépendamment de l'entrée, alors utiliser l'instruction PHP
require_once
.
Utiliser
XoopsLoad::load()
pour charger les classes configurées.
Les instructions include, include_once, require, et require_once ne doivent pas utiliser de parenthèses.
Le code du projet de XOOPS doit être
conforme E_STRICT.
Le code de XOOPS ne doit pas émettre d'avertissement de PHP (
E_WARNING
,
E_USER_WARNING
), notice (
E_NOTICE
,
E_USER_NOTICE
), ou strict (
E_STRICT
) quand la variable
"error_reporting"
est initialisée à
E_ALL | E_STRICT.
Voir sur
http://www.php.net/errorfunc/
pour plus d'information sur
E_STRICT.
Le code de XOOPS ne doit pas afficher des erreurs de PHP, si c'est raisonnablement possible. Au lieu de cela, indiquez chaque erreur avec
les messages signicatifs en utilisant la fonction XOOPS "trigger_error"
puis XOOPS utilisera le gestionnaire d'erreur personnalisé pour effectuer le traitement ultérieur.
Explications :
-
camelCaps - Lorsqu'une chaîne est composée de plus d'un mot, la première lettre de chaque nouveau mot doit être mise en majuscule. Ceci est couramment appelé la méthode "camelCaps".
À partir de
Zend framework PHP Coding Standard (draft)