Nous suggérons ici quelques normes et recommandations argumentées pour le développement de
WikiNi.
Du code XHTML conforme
La consultation de la norme est nécessaire mais parfois un peu fastidieuse. Par souci d'efficacité, l'application des trois règles suivantes permettra un code conforme dans la plupart des cas (source "
Tutoriel : se mettre aux standards du web" (Laurent Jouanneau)) :
- Le XHTML impose de fermer les balises orphelines (<br>, <hr>, <img>, etc.), en mettant un / avant le > : <br />, <hr />, <img />, etc. Certains vieux navigateurs ne comprennent pas correctement le /> s'il n'y a pas d'espace avant le /. Donc ne pas oublier ce caractère. On va ainsi mettre toutes ces balises en conformité. Pour les autres, on n'oubliera pas de les fermer. Ex: <p> avec </p>.
- Il faut également mettre tous les noms de balises et d'attributs en minuscule.
- On encadrera toutes les valeurs d'attributs par des guillemets : ". Par exemple <div class="wizz">
Enfin, il est recommandé de valider son code à l'aide du lien "XHTML 1.0 valide ?". Si vous utilisez Mozilla ou Firefox, vous pouvez également valider à l'aide de
l'extension Tidy [en].
Séparation du fond de la forme
- Proscrire les balises "<font>" et les attributs HTML "bgcolor", "color", "face", "size", "background", "height", "width", etc.
- Préférer l'emploi des classes de style, en renvoyant la mise en forme dans la feuille de style.
On consultera la page
DiscussionsNormeDeCodageCSSPourWikiNi pour ce qui est de la mise en forme du code des feuilles de style CSS.
J'ajouterais que, dans l'idéal, il faut proscrire du XHtml tout attribut destiné à modifier l'apparence de l'élément (hormis les classes et identifiants bien sûr !) puisque que c'est le rôle des feuilles de styles. --
JmPhilippe
Caractères accentués dans le code HTML et PhP
Il est recommandé d'utiliser des entités SGML à la place des caractères accentués (par exemple & acute; pour "é").
- Y a-t'il un texte officiel recommandant cela ? Car personnellement je trouve bien plus pratique de saisir directement dans le jeu de caractère d'encodage de la page générée, à la condition obligatoire que celui-ci soit bien spécifié bien évidement. -- ProgFou
- Je me pose la même question que toi...
- Avantages des entités SGML : indépendante du codage des caractères (il devient possible de changer instantanément le codage des caractères (par exemple ISO-8859-1 vers UTF-8), sans changer le code).
- Inconvénient des entités SGML : augmente légèrement la taille du code ; rend le code légèrement moins lisible.
- .-- CharlesNepote
- Dans ces conditions, je propose que l'on recommande de coder directement dans le jeu de caractère du Wiki (quitte à passer tous les fichiers .php par un recode ou iconv le moment venu), excepté dans les cas où la spécification du jeu de caractère utilisé ne pourrait être garantie (comme le die en tête des handlers). -- ProgFou
- Je suis d'avis que tout les sources soient en ASCII et utulisent donc les entités HTML. Cela rendra plus facile une future migration de iso-8859-1 vers UTF-8 (ViWikiNi est une piste à suivre). -- OlivierMengu?é
- Mhhh... Effectivement : je réfléchissais encore en tant que développeur local ! Recoder tous les sources ne pose aucun problème dans ce cas, mais ça risquerait au contraire de poluer le CVS ! Donc je reviens sur mon choix pour opter aussi pour l'usage des entités SGML dans le code source (mais pas forcément dans les pages installées par le setup). -- ProgFou
Des accès normalisés aux bases de données
Sauf excpetions, les accès directs à la base de données ne sont effectués que dans la classe principale et nulle part ailleurs.
Et en utilisant uniquement les méthode Query(),
LoadSingle?() ou
LoadAll?(), sans accès direct ailleurs.
Requêtes sur le minimum d'expressions
Éviter l'ajout de méthodes supplémentaires à la classe Wiki (ex Wakka)
Pour éviter que wakka.php n'enfle démesuremment, privilégier l'appel direct à la base de données par un
LoadAll? ou un
LoadSingle? (comme dans lastusers, listpages) et éviter de créer une méthode dans wakka.php qui a peu de chances d'être mutualisée (comme dans orphanedpages).
[Totalement d'accord : je pense que toute nouvelle méthode devrait faire l'objet d'une petite discution préalable entre nous avant d'être développée --
CharlesNepote]
Utiliser des constantes quand c'est possible
- Là je ne suis pas sûr de mon coup et je fait appel aux gouroux Php sur la question. Il me semble que les constantes en Php (define ...) utilisent moins de mémoire et sont plus rapides à traiter que les variables. Si c'est le cas je suggère d'inscrire en recommandation de développement leur utilisation systématique quand c'est possible. -- CharlesNepote
- Oui les constantes sont plus rapides à traiter et leur usage est recommandé par rapport aux variables pour des raisons d'embrouilles dans le "scope" des variables. Je donnerai plus de détails bientôt. --PatrickPaul
- PatrickPaul n'a pas développé et je ne comprends pas sa remarque... Mais je reviens sur l'usage des constantes : elles posent un problème dans le cas où on doit utiliser d'autres classes dans WikiNi ; ou dans le cas hypothétique ou la classe wiki devrait être employée dans d'autres applications. Je me demande, d'une manière générale, s'il ne vaut pas mieux utiliser $this->variable qui, elle, ne risque pas d'être confondue avec une autre. -- CharlesNepote
- D'une part il n'est pas si évident que les constantes soient plus rapides à traiter (voir les commentaires associés à la doc PHP sur les constantes), d'autre part je me demande si on y gagne vraiment au final... En effet, autant les constantes sont indiquées pour des valeurs universelles, globales et invariables telles que TRUE, FALSE ou encore WIKINI_VERSION, autant elles peuvent être génantes pour des variables dont la valeur constante est contextuelle (je pense aux textes et à leurs traductions). D'un autre coté, niveau sécurité c'est plutôt bon : une constante ne peut plus être modifiée ou indéfinie une fois définie et la syntaxe PHP ne permet pas de les confondre avec des variables. Donc pour ma part je serais plutôt pour utiliser des constantes uniquement dans un but bien défini et utiliser des variables de classe sinon ; avec le minimum possible de variables globales, sans compter celles gérées par PHP comme $_GET, $_COOKIES et autres $_SESSION, idéalement une seule : $wiki. -- ProgFou
- Je trouve qu'une constante qui manque franchement, c'est le préfixe des tables... Le seul cas où cela pourrait poser problème c'est si on instancie deux objets wiki connectés à utilisant des préfixes différents, mais je pense que ce ne serait certainement pas le seul problème, et puis surtout je doute que cela serve... Par conte, pour ce qui est des nouvelles constantes introduites dans la version CVS, je n'en vois absolument pas l'intérêt :-S. Surtout qu'elles sont assez mauvaises: elles remplacent pour la plupart des classes d'équivalence regexp déjà existantes: [:upper:], [:lower:], [:alnum:]... Je pense qu'en plus elles n'apportent aucune amélioration... -- LordFarquaad
- Non, car les regexp [:upper:], [:lower:], [:alnum:] sont sensibles à la locale du serveur que nous ne maitrisons pas : ça pose des problèmes parce que selon les locales, ce qui est reconnu, par exemple, comme un mot wiki diffère. -- CharlesNepote
- Pour le préfixe des tables, il est mis déjà sous forme de variable. Et comme tu le dis toi-même, ça sera utile le jour ou on permettra d'utiliser un seul moteur pour plusieurs sites. Pour les constantes WN_*, je t'invite à lire la page MotWikiAccentue pour comprendre le pourquoi de la chose. Définir des constantes n'était peut-être pas la meilleure solution, mais ça va grandement nous aider dans une première étape de transition. -- ProgFou
- D'un autre côté, je doute qu'on ait un jour vraiment besoin d'instancier deux wikis utilisant des tables différentes mais bon... L'avantage à partir du moment où on utilise des constantes pour les tables, c'est qu'on peut créer une constante pour chaque nom de table, de sorte d'avoir à simplement utiliser, par exemple TABLE_LINKS plutôt que devoir faire appel au préfixe suivi de "links". Dès lors, en phase de développement, on peut facilement utiliser des tables copiées et modifiées portant un autre nom que celui par défaut. Par exemple si je veux faire des tests sur ma table wikini_links sans vouloir l'endommager, je n'ai qu'à en faire une copie sous le nom que je veux (par exemple links_test) et modifier la valeur de TABLE_LINKS: à la place de define('TABLE_LINKS', PREFIX . 'links'), il suffit de mettre define('TABLE_LINKS', 'links_test') temporairement... (notez que l'idée ne vient pas de moi, c'est aussi une chose tirée de PhpBB2, qui est extrêmement pratique lorsque l'ont veut le combiner avec un autre logiciel dont certaines tables peuvent être communes mais pas toutes)
- Ah oui sinon, pour les constantes des regexp, je pense qu'à ce moment là il serait pratique d'avoir à disposition une constante dont la valeur serait la regexp des MotWiki, si je ne me trompe elle sert à plusieurs endroits je crois... -- LordFarquaad
Propositions d'évolution ou de nouvelles normes ou recommandations de développement
Adoption d'un standard de codage PHP
Les sources actuelles de
WikiNi mélangent plusieurs standards de codage PHP différents. Il n'est pas rare de voir dans le même source :
if (a=b)
{
}
else {
}
Je propose donc de fixer un standard de codage. J'ai trouvé :
- 1) [fr] : standard de codage que je préfère : sobre, court, produit un code plus concis.
- 1) Convention de codage de pear [fr] : standard semi-officiel de PHP.
- 1) PHP coding standard [en] : volumineux document, sans doute trop exhaustif pour notre cas.
--
CharlesNepote
D'accord sur le principe, ma préférence est pour le premier, à utiliser en conjonction avec un truc comme
beautifer [en] (non testé) --
DavidDelon
- Mmm je me disais que le premier avait donc été plus moins choisi, mais, constatant qu'il n'était pas du tout appliqué, je l'ai moi-même vaguement appliqué dans les trois fichiers que j'ai modifiés, mais sans plus (en tout cas j'ai respecté les points 1 à 10...). En fait j'ai mon propre standard personnel si je puis dire... Il y a des choses que j'aime bien dans l'eXtrème PHP, mais il y en a d'autres pour lesquelles je préfère le standard semi-officiel... (je n'ai pas lu le volumineux document...). Je pense qu'il serait bon de créer une page de discussion à ce sujet, avec un standard "WikiNi" qui serait une combinaison de ce que les développeurs de WikiNi aiment respecter comme syntaxe. Comme dit dans l'eXtreme PHP (si je me souviens bien), l'important c'est que l'équipe respecte le standard convenu (et non qu'elle respecte un standard existant). Par exemple je pense que Phpbb a son propre "standard" de développement (et ça ne m'étonnerait pas que j'en sois assez proche en fait puisque j'ai fait mes débuts là-dessus :-j). -- LordFarquaad
Discussion préalable de chaque développement
Il est utile que chaque nouveau développement soit discuté préalablement à sa mise en oeuvre (sauf s'il s'agit d'un "module" de type "action" n'ayant
aucun impact sur les autres fichiers).
- J'aimerais bien modifier l'ActionInclude et ajouter un attribut et deux-trois méthodes dans la ClasseWiki (sans modifier le fonctionnement général), c'est où l'idéal pour en parler ? (j'aimerais d'ailleurs aussi savoir où se font les appels des méthodes Header et Footer parce qu'à première vue, je ne trouve pas :-S) -- LordFarquaad
Séparation du fond de la forme / balise <div>
- Employer des balises <div> plutôt que des tableaux
- Les problèmes induits par l'utilisation de tableaux sont nombreux quand ils ne sont pas nécessaires. Plusieurs bonnes synthèses ont été publiées à ce sujet :
Code XHTML clairement décomposé en blocs non indentés
- L'indentation est consommatrice d'octets aussi nous recommandons de ne pas indenter (ni espace, ni tabulations dans le code)
- En revanche, pour améliorer la lisibilité du code et faciliter le débogage de l'application, nous recommandons quelques règes simples :
- de ne pas hésiter à employer le retour à la ligne quand c'est utile
- sauf exception, retour à la ligne après chaque balise fermante
- de décomposer le code en grands blocs structuraux (reconnaissables à une classe de style particulière), séparés par deux lignes vides (par exemple : bloc du nom du wiki, bloc du titre de la page, bloc du menu, bloc du copyright, etc.)
- les couples de balises restent sur la même ligne si le contenu est toujours assuré de rester sur la même ligne
- par exemple : <h1 class="wiki_name">WikiNi</h1>
- les couples de balises encadrent le contenu avec des retours à la ligne si le contenu est susceptible de faire plusieurs lignes
- par exemple :
- <div class="copyright">
- <a href="http://validator.w3.org/check/referer">Valid XHTML 1.0</a> ::
- <a href="http://jigsaw.w3.org/css-validator/check/referer">Valid CSS</a> ::
- -- powered by <a href="http://www.wikini.net/wakka.php?wiki=PagePrincipale">WikiNi 0.1.1.0.3</a>
- </div>
Par exemple, la page :
deviendrait :
--
CharlesNepote
Note : merci
ProgFou pour tes remarques ; je n'ai toujours pas eu d'avis sur la question... sans avis de votre part avant vendredi 9/01, je passe cette proposition comme recommandation puiqu'elle est actuellement appliquée. --
CharlesNepote
Archives des discussions
Discussion préalable de chaque développement
Je propose comme nouvelle norme de développement que chaque nouveau développement soit un minimum discuté préalablement à sa mise en oeuvre (sauf s'il s'agit d'un "module" de type "action" n'ayant
aucun impact sur les autres fichiers.
--
CharlesNepote
Ok --
DavidDelon
Il me semble que c'est ce que nous faisons déjà quand on discute des nouveaux développements dans les suggestions etc... --
PatrickPaul
Grosso modo oui, mais ce n'est peut-être pas inutile de se le dire : ça permet de voir que nous sommes d'accord sur la façon de travailler et ça permet de communiquer plus facilement aux futurs nouveaux milliers de développeurs quelques règles simples. Par ailleurs, je pense que certaines options actuelles n'ont pas été suffisament discutées (par exemple le choix (heureux) d'harmoniser les sens des diff, le changement de "wakka" pour "wiki" (pourquoi wiki et pourquoi pas "action" ou je ne sais quoi d'autre), l'internationalisation, etc.). Je ne pense pas qu'il soit nécessaire d'arriver un système de décision lourd (genre vote ou autre) ; je pense qu'il ne faut pas brider non plus la vitalité du développement (et à cette occasion je tire mon chapeau à
PatrickPaul qui n'a pas chômé ces derniers temps) ; je pense que c'est à chacun de juger si le sujet mérite d'être plus ou moins longuement discuté. Par exemple pour l'internationalisation et le choix du nom, ce sont deux choix importants et qui "engagent" le projet dans des voies dont il ne sera pas facile de revenir : c'est la raison pour laquelle j'ai essayé de temporiser un peu les deux discussions et demandé de re-réfléchir un peu (j'attends d'ailleurs toujours d'autres avis sur l'internationalisation). --
CharlesNepote
Comme je l'ai précisé a Patrick lors d'un chat improvisé, la modification de wakka en wiki dans l'url, m'a fait pester, sur le moment.
Il est vrai qu'on en avait discuté (abandon du nom wakka dans le code ...) mais cet aspect là n'avait pas été evoqué. Ce qui est fait est fait et
bien fait finalement, d'autant plus que cela m'a permis de voir quelques bugs qui trainaient par ailleurs et c'est un bon entrainement pour un futur changement de nom ! Pour le sens des diff, cela fait parti de la liste des bugs et je remercie
PatrickPaul pour sa réactivité, et ne veut surtout pas le brider dans son développement. A mon avis le meilleur compromis est de retenir la solution que propose
CharlesNepote : un minimum de consensus pour une action impliquant l'ensemble du projet, la portée de l'action étant estimée par chacun en ame et conscience ;-).
--
DavidDelon
Je pense que nous sommes tous d'accord. Je précise aussi que m'on idée derrière la répartition des taches est justement de permettre d'alléger la prise de décision. Par exemple lorsque d'autres développeurs voudront joindre leurs efforts ils pourront s'adresser plus directement à l'un d'entre nous pour de nouveaux développements.
Je précise aussi que j'ai pensé aux même choses que David, à savoir que si nous voulons rechanger de nom nous savons maintenant ce que cela implique et comment assurer la transition le plus en douceur possible.
Pour l'instant je trouve que tout ce passe très bien, et je pense que David est de mon avis (d'après ce qu'il m'a dit sur le chat).
--
PatrickPaul
Je vois aussi que nous sommes globalement d'accord. Je pense également que tout ce passe bien et que le projet prend joliement forme avec d'inévitables petits soucis de détail ; l'important c'est de pouvoir s'en parler. --
CharlesNepote
Ailleurs