Normes de codage (Coding Style) - Nuked-Klan/CMS_Nuked-Klan GitHub Wiki

Normes de codage

Introduction :

Rentrer dans le code de quelqu’un ou tout simplement faire un code qui sera compréhensible pour tout le monde n’est pas toujours facile !

Voici des règles a respecter sur le développement de nk et qui sont de très bonnes choses à savoir pour tous développeur. Et surtout, des actions à mettre en place par chacun afin d’augmenter la qualité du code PHP et donc augmenter la qualité de nuked-klan.

Règles de codage

Formatage des fichiers

Encodage

RECOMMANDE : Vous pouvez ignorer cette partie si vous utilisez le plugin "EditorConfig" disponible à cette adresse : editorconfig.org

  • Etre stocké comme du texte ASCII;
  • Utiliser le jeux de caractères UTF-8;

Editeur :

  • Sublime Text 2 : Preferences -> Settings -- Default -> "default_encoding": "UTF-8",

  • Etre formaté Unix;

Editeur :

  • Sublime Text 2 : Preferences -> Settings -- Default -> "default_line_ending": "unix",

  • Les lignes doivent finir uniquement par un retour à la ligne (LF).

Les retours à la ligne sont représentés par l'ordinal 10, l'octal 012 et l'hexadécimal 0A. N'utilisez par les retours « carriage » (CR) comme le font les Macintosh ou les combinaisons retour « carriage » / retour à la ligne (CRLF) comme le fait Windows.

  • Il ne doit y avoir qu'un seul retour à la ligne après la fermeture du tag PHP ?>.

Indentation

RECOMMANDE : Vous pouvez ignorer cette partie si vous utilisez le plugin "EditorConfig" disponible à cette adresse : editorconfig.org

  • Tabulations remplacés par 4 espaces;

Editeur :

  • Sublime Text 2 : Preferences -> Settings -- Default ->
    // The number of spaces a tab is considered equal to
    "tab_size": 4,

    // Set to true to insert spaces when tab is pressed
    "translate_tabs_to_spaces": true,

    // If translate_tabs_to_spaces is true, use_tab_stops will make tab and
    // backspace insert/delete up to the next tabstop
    "use_tab_stops": true,

    // Set to false to disable detection of tabs vs. spaces on load
    "detect_indentation": true,

Nommage classe/méthode/variable

Cette prochaine version sera codée entièrement en type de nommage lowerCamelCase.

Exemple

  • Les dossiers (Includes => includes)
  • Les fichiers (fatal_errors.php => fatalErrors.php)
  • Les variables ($max_download => $maxDownload)
  • Les méthodes ( function banip() => function banIp() )

Hormis les dossiers “extras” du type INSTALL et RESTDIR qui sont les dossiers qui requièrent l’attention de l’utilisateur à l’installation.

  • Nommage des classes CSS de modules

Toutes les classes des fichiers CSS des modules doivent être préfixées du nom du module en minuscule.

Ex: Pour le module Team, les classes seront : “teamPlayersInfos”

Les classes

Les noms des classes doivent être parlant et ne doivent contenir que des caractères [a-z][A-Z]. Il doivent toujours commencer par "NK_" et éviter les abréviations. Elles doivent être placés dans /includes/libs.

Exemple :

<?php
/**
 * Light template library.
 * @name NK_tpl
 * @desc Custom class for include template
 */
class NK_tpl {
//code
}
?>
Les fonctions et méthodes

De même que pour les classes, vos noms de fonctions et méthodes ne doivent contenir que des caractères [a-z][A-Z] et le nom doit être explicite afin de savoir ce que fait la fonction à partir de son nom.

La notation lowerCamelCase doit être utilisée : Le nom de la fonction doit commencer par une minuscule. Si le nom est composé de plusieurs mots, chaque première lettre des mots doit être mise en majuscule.

Exemple :

<?php
function doDownload() {
    // code
}
?>

Les fonctions dites utilitaires seront préfixés des lettres "nk".

Exemple :

<?php
function nkDebug() {
    // code
}
?>
Les variables

Les variables respectent les mêmes règles que les fonctions et méthodes. Les noms de variables comme $i sont déconseillés en dehors de petite boucles.

Nommage des variables Sql (En attendant la classe NK_mySql)

Pour faciliter la lisibilité et la maintenance, il faut stocker la requête SQL dans une variable avant de l’exécuter.Après exécution, la direction die (logError()); sera utilisée pour les logs (erreurs,...).

  • $dbs -> pour les select
  • $dbi -> pour les insert
  • $dbu -> pour les update
  • $dbd -> pour les delete
  • $dbe -> pour l'execution (mysql_query)
  • $dbc -> pour un count (mysql_num_rows)

Exemple :

<?php
$dbsForumCat = 'SELECT id, nom 
                FROM ' . FORUM_CAT_TABLE . ' 
                ORDER BY ordre, nom';
$dbeForumCat = mysql_query($dbsForumCat) or die (logError());
$dbcForumCat = mysql_num_rows($dbeForumCat);
?>
Les constantes

Une constante doit être nommée avec des caractères alphanumériques en uppercase. Chaque mot la composant doit être séparé par des underscore "_".

Exemple :

// Ok
NB_MAX_FILES
// Ko
NB_MAXFILES
// KO
_NB_MAX_FILES

Style de codage

Ouverture du code PHP

Les fichiers PHP doivent commencer et terminer avec les balises PHP "". L’utilisation des autres balises de déclaration du code PHP sont à proscrire.

Accolades

Les accolades doivent respecter cette nomenclature.

Exemple :

<?php
public function nkContentTag() {
    // code
}
function nkDebug() {
    // code
}
for (int i = 0; i < 5; i++) {
    // code
}
?>

Accolades obligatoires même si la structure n’a qu’une ligne.

Exemple :

<?php
if ($casDeTest === TRUE) {
    // code
}
?>

Espacements

Déclaration

Toute variable déclarée doit l’être de la façon suivante.

Exemple :

<?php
$maVariable = 'valeur';
?>

Un espace doit être présent avant et après le signe "=" (attention aux cas particuliers).

Instructions de contrôles

Les instructions de contrôles doivent avoir un espace entre l’instruction et la parenthèse ouvrante. Un espace autour des opérateurs de comparaison, d’affectation, arithmétique.

Exemple :

<?php
$a = 0;
$i == 2;
$b += $c;
?>
Fonctions/Méthodes

Lors du passage de plusieurs variables à une fonction/méthode, veuillez mettre un espace après chaque virgule.

Exemple :

<?php
maFonction($val1, $val2, $val3);
?>

Une ligne vide entre chaque méthode.

Exemple :

<?php
    public function nkContentTag() {
         // Code Méthode 1
    }
    
    public function nkDisplayError() {
        // Code Méthode 2
    }
?>

Documentation

Documentation des fichiers/classes

Chaque fichier qui contient du code PHP et chaque classe doit avoir une entête contenant au minimum ces balises.

  • Description du fichier
  • Version du cms
  • Link du cms
  • License du cms
  • Copyright du cms

Exemple :

<?php
/**
*   [file description]
*
*   @version 1.8
*   @link http://www.nuked-klan.org Clan Management System 4 Gamers NK CMS
*   @license http://opensource.org/licenses/gpl-license.php GNU Public License
*   @copyright 2001-2013 Nuked Klan 
*/
?>

Documentation des variables de classe

Les variables de classes doivent être commentées avec les paramètres suivants.

  • Description
  • Type

Exemple :

<?php
class MyClass {
	/**
	* Name of customer
	*@var string
	*/
	public $customerName;
}
?>

Documentation des fonctions/méthodes

Chaque méthode doit être documentée avec au minimum les paramètres.

  • Description
  • Tous les arguments
  • Valeurs de retour possibles

Exemple :

<?php
/**
* Description courte de la méthode
*
* @param integer|string $iCustomerID ID du customer
* @return object Retourne l'objet Customer correspond à l'ID reçu
*/
?>

Commentaires additionnels

Il est recommandé de commenter des blocs de code complexes à l’aide d’une ligne d’explications.

Exemples :

<?php
// Commenter ici la boucle complexe
for ($object as $value){
	// ...
}
?>

Bonnes pratiques

Langage de programmation

L’anglais doit être utilisé dans le nommage des variables, classes, méthodes ainsi que lors de l’ajout de commentaire. Pensez à l’Open Source et au partage de connaissance.

Pas de minimisation

Ne pas **minimiser ** vos fichiers JS. Sachez que pour le développement, on a besoin d’avoir un code lisible (et pas tout sur une seule ligne !), donc laisser la réduction des lignes de côté.

Optimisation

Nom des variables

Plus le nom de vos variables est court, plus rapide seront vos scripts. Par contre, mieux vaut un nom de variable un peu plus long et compréhensible qu’un nom de variable abrégé ne donnant aucune information quant à son contenu.

Double quotes VS Simples quotes

L’usage des double quotes est plus courant que celui des simples pour manipuler des chaines de caractères. La différence majeure entre les deux est l’interprétation des potentielles variables quelles peuvent contenir. L’utilisation des simples quotes est beaucoup plus rapide que celle des doubles.

Fonction echo : La virgule VS le point

Veuillez utiliser la virgule à la place du point pour la concaténation de variables lors d’un echo. Echo est une fonction qui peut attendre plusieurs paramètres. L’utilisation du point va d’abord lancer une opération de concaténation avant le passage à la fonction echo.

Exemple :

<?php
// Fonctionne mais
echo 'test est' . $maVar1;
// Ceci est plus performant
echo 'test est',  $maVar1;
?>

L’opérateur ternaire VS If Else

L’opérateur ternaire est souvent utilisé par commodité d’écriture. Malheureusement ce dernier est plus lent qu’une condition if/else. Ne pas utiliser l'opérateur ternaire.

For et count() ou sizeOf()

N’utilisez pas de fonction comme count() ou sizeOf() (alias de count) dans des boucles. Préférez déclarer une nouvelle variable avant le for qui contiendra le nombre d’élements de votre tableau count($myArray) afin de l’utiliser dans le for.

Exemple :

<?php
$sizeArray = count($myArray);
for ($i = 0; $i < $sizeArray; $i++) ..
// la méthode count est appellée à chaque itération
for ($i = 0; $i < count($myArray); $i++) ..
?>

== VS ===

Si vous devez comparer 2 variables entre-elles en sachant qu’elles sont de même type, il est préférable d’utiliser l’opérateur ‘===’. Ce dernier vérifiera la valeur sans avoir à les convertir et prendra ainsi moins de temps.

Preg_replace VS str_replace

Evitez d’utiliser les fonctions utilisant les expressions régulières lorsque vous n’en avez pas l’utilité.

Astuces

Mise en forme

Pensez à mettre en forme votre code afin de le rendre plus visible par autrui.

Ligne trop longue

Une ligne de code trop longue peut être mise en forme de la manière suivante.

Exemple :

<?php
// Les requetes ne doivent plus être ecrite comme ça
$dbsForumCat = 'SELECT id, nom FROM ' . FORUM_CAT_TABLE . ' ORDER BY ordre, nom';
$dbeForumCat = mysql_query($dbsForumCat) or die (logError());
$dbcForumCat = mysql_num_rows($dbeForumCat);

// Mais comme ceci
$dbsForumCat = 'SELECT id, nom 
                FROM ' . FORUM_CAT_TABLE . ' 
                ORDER BY ordre, nom';
$dbeForumCat = mysql_query($dbsForumCat) or die (logError());
$dbcForumCat = mysql_num_rows($dbeForumCat);

// Une longue condition if
if ($myVar1 == 'valeur' && $myVar2 == 'valeur' && $myVar3 != 'valeur' && ....) {
	// code
}
// peut être remplacé par
if ($myVar1 == 'valeur'
    && $myVar2 == 'valeur'
    && $myVar3 != 'valeur'
    ...){
	// code
}
?>
Déclaration de variables

Aligner les variables / valeurs entre-elles

Exemple :

<?php
$maVar1     = 'toto';
$myTable1   = array();
$myCustomer = new Customer();
?>

Réduire le nombre de echo

Limitez l’utilisation des echo lorsque cela est possible, par exemple dans une boucle.

Exemple :

<?php
// KO
$countMyArray = count($myArray);
for ($i = 0; $max = $countMyArray; $i++){
	echo $myArray[$i], '';
}
// OK
$countMyArray = count($myArray);
for ($i = 0; $max = $countMyArray; $i++){
	$string .= $myArray[$i]."";
}
echo $string;
?>

Inclure des fichiers

PHP permet d’inclure des fichiers avec quatre instructions distinctes :

  • include
  • include_once
  • require
  • require_once

Ces quatre versions correspondent en réalité aux combinaisons de deux variantes :

  • require déclenche une erreur et arrête le programme si le fichier inclus n’est pas trouvé. include se contente de provoquer un avertissement.
  • les versions «_once » gèrent les risques d’inclusions multiples. Avec include_once (comme avec require_once), PHP s’assure que chaque fichier n’est inclus qu’une seule et unique fois, même si plusieurs demandes sont faites.

Dans la pratique, on utilisera de préférence l’instruction require_once (sauf besoins spécifiques) car elle présente le maximum de garanties. Ces quatre instructions ne sont pas des fonctions. Il ne faut donc pas entourer de parenthèses le nom du fichier appelé.

Exemple :

<?php
// Instructions Ok
require 'conf.inc.php';
require_once 'conf.inc.php';
include '/includes/libs/NK_mySql.php';
include_once '/includes/libs/NK_mySql.php';
// Instructions Ko
require('conf.inc.php');
require_once('conf.inc.php');
include('nuked.php');
include_once('Includes/php51compatibility.php');
?>

Constantes true, false et null

Ces constantes doivent toujours être écrite en minuscule.

Typage des variables

Les variables ne pouvant pas être ‘typée’ en PHP, vous pouvez si vous le souhaitez, utiliser une astuce de nommage de variables afin préciser le type de vos variables.

Rajoutez une simple lettre devant votre nom de variable.

  • b -> boolean
  • i -> integer
  • d -> double
  • s -> string
  • a -> array
  • m -> mixed
  • o -> object
  • r -> ressource

Exemple :

<?php
$bError = true;
$iCount = count($aCustomers);
// etc
?>
⚠️ **GitHub.com Fallback** ⚠️