Analyse, conception et implémentation d’un système de commentaires – partie 1

L’idée de cette série d’articles m’est venue lors de la réalisation de ce site web. Je voulais intégrer un système de commentaires aux articles. Pour ce faire, j’avais plusieurs solutions : récupérer du code tout prêt et l’intégrer à mon site, utiliser un service tel que Disqus, ou développer mon propre système de commentaires. Ensuite, j’ai analysé mes besoins et mes contraintes, j’ai réfléchis à la structure des données, j’ai implémenté les fonctions,… Pour finalement arrivé au résultat final que vous pouvez voir en-dessous de tous les articles de ce blog.

Dans cette série d’article, je vais détailler le cheminement que j’ai emprunter pour passer du problème (“J’ai besoin d’un système de commentaires sur mon site”) à la solution (vous pouvez poster des commentaires en rapport à mes articles). Le but n’est pas d’écrire un tutoriel “Créer son système de commentaires simplement en 10 étapes”, car ce cheminement pourrait être le même pour n’importe quel développement, qu’il soit personnel, en équipe ou en entreprise.

Voici donc les différentes étapes que j’ai suivis:

  • Partir de 0 ou utiliser l’existant?
  • L’analyse : de quoi ai-je besoin? Quelles sont les fonctions que va devoir remplir mon projet?
  • La conception
  • L’implémentation
  • ​Test
  • Déploiment​

Partir de 0 ou utiliser l’existant?

Énormément de sites internet permettent à leurs visiteurs de laisser un commentaire, que ce soient des blogs, des magasins en ligne ou encore des sites de communauté telles que Reddit ou Stackoverflow. Il est donc tout à fait raisonnable de se dire qu’il n’est peut-être pas nécessaire de tout ré-écrire de 0.

Après quelques recherche, j’ai trouvé facilement des exemples d’application web (telles que WordPress, par exemple) qui implémentent un système de commentaires.

J’ai aussi trouvé des services en lignes (tels que Disqus ou IntenseDebate) qui permettent de prendre en charge la gestion des commentaires. Dans ce cas, mon travail est simplifié : il suffit de m’inscrire sur ce service et d’inclure un petit bout de code dans mes pages pour que le service soit associé à mon site.

Malgré tout cela, j’ai finalement décidé d’implémenter mon propre système moi-même, en partant d’une feuille blanche. Pourquoi? Le premier but de ce site est d’apprendre, de m’amuser, et de découvrir d’autres types de développement que ce que je fais tous les jours au boulot. Aussi, je voulais avoir un contrôle parfait sur mon implémentation, contrôle que je n’aurais pas pu avoir avec une solution clé en main, et encore moins avec un service tier. Même si les ressources sont nombreuses, il n’est pas facile de trouver des ressources de qualité, qui répondent à tous mes besoins. D’autant plus que je développe en Python, sur base du framework Web2Py, qui est nettement moins répandu que PHP, par exemple. Enfin, j’ai très vite repoussé l’idée d’utiliser un service tier, car cela voulait dire que j’allais mettre une partie du contenu de mon site, ainsi que des informations sur mes visiteurs dans les mains d’une société extérieur, que je ne connais pas. Que vont-ils faire de ces données? Comment vont-ils les exploiter? Quelles garanties puis-je espérer pour un service gratuit? Je n’en ai aucune idée!

Je vais donc implémenter mon système de commentaire moi-même!

De quoi ai-je besoin? Quelles sont les fonctions que va devoir remplir mon projet?

Oui, avant de foncer tête baissée, prennons d’abord le temps de se poser quelques questions. Tout d’abord, qu’est-ce qu’un système de commentaires? Dans mon cas, il doit permettre aux visiteurs de poster des commentaires associés aux articles du site, et de visualiser les commentaires postés par d’autres visiteurs. Il doit aussi permettre à l’administrateur du site (moi-même) de modérer les articles, de les supprimer, les éditer,… Il doit aussi d’une manière ou d’une autre permettre de gérer le problème du SPAM, automatiquement ou manuellement.

J’ai donc dressé une liste d’exigences, de fonctionnalités, de besoins que mon projet va devoir implémenté. J’ai aussi déterminé qu’il y aura 2 types d’utilisateurs : les visiteurs et l’administrateur du site.

Pour les visiteurs du site:

  • Consulter les commentaires postés par d’autres visiteurs. Au minimum, les informations suivantes seront affichées : nom du commentateur, la date et le commentaire en lui-même. On pourrait aussi afficher le site web de l’auteur, son avatar,…
  • Poster un nouveau commentaire le plus facilement possible:
    • Si l’utilisateur n’est pas inscrit, il ne devra pas être obligé de s’inscrire pour poster un commentaire. Et on lui demandera le moins possible d’informations personnelle (un nom ou pseudo suffira). Par contre, on lui laissera la possibilité d’entrer son adresse mail pour lui envoyer des notification, l’adresse de son site, son avatar,…
    • Si l’utilisateur est inscrit, il sera inutile de lui demander des informations le concernant, car il les a déjà encodées dans son profile.
  • Pour écrire son commentaire, un éditeur intuitif sera indispensable. Cet éditeur lui permettra de mettre en forme son texte facilement.

Pour l’administrateur du site:

  • Supprimer et modifier les commentaires
  • Consulter des informations détaillées sur chaque commentaire (date, adresse IP,…)
  • Modération : l’administrateur pourrait vouloir valider les commentaires avant qu’ils ne soient affiché sur le site
  • Gestion du SPAM: si la gestion est manuelle, l’administrateur doit pouvoir spécifier quels commentaires sont selon lui du SPAM ou du contenu légitime. Si la gestion est automatique, il doit pouvoir vérifier son bon fonctionnement et éventuellement modifier les décisions prises automatiquement.

Comme tout projet, certaines contraintes sont à prendre en compte. Dans mon cas, j’ai identifié les contraintes suivantes:

  • Le système de commentaires doit être évolutif et suffisamment bien fait pour gérer “une certaines quantité” d’articles avec “une certaines quantité” de commentaires. J’ai mis des guillemets car j’ai du mal à chiffrer ces données, mais en tous cas, j’espère écrire + de 3 articles et que certaines recevront au moins un commentaire. Par contre, vu l’échelle du site à l’heure actuelle, il n’est pas nécessaire de sortir l’artillerie lourde. Le but n’est pas non plus de gérer une communauté comme Reddit ou StackOverflow.
  • L’implémentation devra être évolutive et ne pas demander trop de ressources au niveau du serveur. Il s’agit aussi d’une données très difficilement quantifiable, mais je pars du principe que si l’implémentation est correcte, il sera + aisé de l’optimiser par la suite.
  • Vu que le site est implémenté en Python sur base du framework Web2py (avec une DB Sqlite ou Mysql), le système de commentaire devra utiliser les mêmes technologies.

Il s’agit ici d’une première phase d’analyse. Même si le besoin pourrait changer ou évoluer avec le temps, nous avons maintenant un point de départ, et nous pouvons commencer la phase de conception

Comment va-t-on faire tout cela?

Maintenant que je sais ce que je veux, je peux passer à l’étape suivante : la conception. Lors de la phase de conception, je vais décrire le fonctionnement du projet : de quels modules va-t-il être composé, comment ces différents modules vont-t-il interagire entres-eux, quelles seront les données associées et quels traitements va-t-on effectuer dessus.

Je commence par définir les données. Il s’agit ici de définir l’ensemble des informations qui vont décrire un commentaire écrit par un utilisateur en rapport à un article. Rien qu’avec cette phrase, je peux déjà extraire 3 groupes d’informations (qui pourraient devenir des tables en base de données et des classes dans le code):

  • Les articles
  • Les utilisateurs
  • Les commentaires

Les propriétés d’un commentaire sont donc les suivantes:

  • ArticleId: référence vers l’article concerné par le commentaire
  • UserId: utilisateur ayant posté le commentaire. Il s’agit ici d’une référence vers un utilisateur enregistré sur le site. Si l’utilisateur n’était pas identifié sur le site, cette référence sera NULL et on utilisera les champs ‘Name’, ‘Mail’, et ‘URL’ pour décrire l’utilisateur
  • Name, Mail et URL : Informations concernant l’utilisateur non-enregistré
  • Date: date et heure à laquelle le commentaire à été posté
  • IP: adresse IP de l’ordinateur ayant posté le commentaire
  • Validated: dans le cas où l’administrateur veut valider les commentaires avant de les poster, ce flag permettra de savoir si l’administrateur a bien validé le commentaire
  • Content : contenu du commentaire

Vous remarquerez que je n’ai rien prévu pour la gestion du SPAM. En effet, je n’ai pas encore effectué d’analyse approfondie de cette problématique. Je pense que cela pourra se faire par la suite, dans un second cycle d’analyse/conception/implémentation. Je laisse donc cela de côté. En attendant, l’administrateur pourra toujours décider de ne pas valider (via le flag ‘Validated’) les commentaires qu’il considère comme indésirable, ou de les supprimer.

Du côté des traitements (le code), c’est extrêmement simple:

Nous avons donc :

  • La base de données qui mémorise les articles, les commentaires et les utilisateurs
  • Les views (des pages web) qui permettent d’afficher les articles leurs commentaires, aux visiteurs d’encoder un nouveau commentaire et à l’administrateur de les gérer
  • Le contrôleur, qui contient toute l’intelligence concernant les commentaires : c’est dans ce contrôleur que je vais implémenter les traitements permettant d’aller rechercher les commentaires associés à un articles, d’ajouter un commentaires, de l’éditer, le supprimer,…

Il s’agit en fait d’une architecture classique nommée MVC : Modèle (la base de données) – Vue (les pages web) – Contrôleur (l’intelligence).

Vu la simplicité du projet, un seul contrôleur devrait suffire pour l’ensemble des fonctionnalités.

C’est ici que se termine la première partie de cet article. Dans la seconde partie, je détaillerai l’implémentation du système de commentaires.

Leave a Reply

Your email address will not be published. Required fields are marked *