Bonjour à vous,

Je tiens à m'excuser vraiment pour longueur de ce post, mais ma question
est tellement générale (dans le mauvais sens du terme) qu'il me semble
nécessaire de la préciser.

* Mon problème est le suivant : je voudrais apprendre à concevoir (en POO)
une table des matières dynamique.

D'avance, je précise qu'il ne s'agit ni de faire une TdM sous Word… ni d'une
TdM "à la volée" dans une page web, réalisée en javascript ou autre d'après
les h… Il s'agit de gérer (donc de concevoir) des tables des matières (dans le
contexte d'un langage OO).

Après consultation de milliers de pages via google (je vous laisse imaginer
ce que donne une recherche sur les termes "Concevoir Table des matières
POO"…), je désespère. Je me résous donc à déposer un post.

* Voilà comment se formule mon problème :

– L'application est un livre en ligne (pédagogique, pour apprendre l'écriture Narration).
– Ce livre possède des tables des matières statiques (modifiables
seulement par les auteurs, au rythme des ajouts et des ré-organisations)

– Les utilisateurs (lecteurs) sont en mesure de créer leur propre table des
matières personnelle, en agençant dans l'ordre qui leur convient les pages
qu'ils choisissent (ils créent leur propre table des matières, c'est le nœud du
problème — c'est la raison pour laquelle je parle improprement de « table
des matières dynamiques » — dynamiques pour le lecteur).

– Rien d'original, ces tables des matières sont constituées de
*chapitres*, de *sous-chapitres* et bien entendu des *pages* elles-mêmes.

Ce que je voudrais apprendre, c'est comment un professionnel s'y prend
pour aborder cette situation et la gérer de façon efficace et élégante. Aussi,
tout lien vers un site qui traiterait de ce problème me serait vraiment d'une
aide infinie. Tout témoignage d'expérience, également, me comblerait tout
autant.

* Jusqu'à présent, je gère les choses de cette façon : chaque page ayant un
identifiant unique, une instance de table des matières est constituée de :
– chapitres (dont les attributs sont : un id, un titre string, et une liste
d'identifiants de sous-chapitres), parents de plusieurs :
– sous-chapitres (dont les attributs sont : un id, un titre string et une liste
d'identifiants de pages), parents de plusieurs :
– instances de pages.
Je fais un tableau associatif que j'enregistre en string (JSON) dans un fichier
du dossier de l'utilisateur (inscrit).

Mais j'ai le sentiment de faire vraiment de la conception très laide en
procédant de la sorte.

Reprenant tout mon développement (laid à souhait) pour passer à Ruby On
Rails, je voudrais prendre les bonnes décisions dès le départ, partir du bon
pied.

* Voici des questions très concrètes et certainement naïves que je me pose
(mais je vous assure que je me les pose sérieusement ;-)), où l'éclairage de
gens compétents pourraient grandement m'aider (en espérant que ça puisse
servir à d'autres, bien entendu) :

– Par rapport à la définition donnée, est-il judicieux de faire deux classes
différentes pour Chapitre et SousChapitre (entendu qu'un chapitre ne peut
contenir que des sous-chapitres — pas de pages — et un sous-chapitre que
des pages — me laissant à penser que ce sont deux classes différentes).
Avec ces deux classes qui seraient différentes (même héritant de la même
classe supérieure), j'ai l'impression de compliquer inutilement les choses…

– Une instance de sous-chapitre est un ensemble de pages. Je consigne cet
ensemble, dans le sous-chapitre, sous simple liste d'identifiants (integers).
Est-ce comme cela qu'on procède (je le fais pour alléger l'enregistrement),
ou serait-il mieux que le sous-chapitre contienne une liste d'instances de
classes pages plutôt (qui permettraient d'atteindre plus élégamment des
choses comme sous_chapitre.page.commentaires_lecteur[1]) ? — j'ai
conscience de poser des questions très naïves, mais elles se posent à moi à
chaque fois…

– Quelle est la meilleure façon de "consigner" ces tables des matières (de
les enregistrer) ? Est-ce dans un simple fichier texte (au format XML, YAML
ou JSON par exemple) et de les parser à chaque chargement de page ? ou y
a-t-il une autre manière, plus efficace, de procéder ?
-- Gagnerais-je à les consigner dans une base de données ? (sqlite3 par
exemple)
-- Ai-je intérêt à les conserver dans une session le temps de la consultation
du livre, ou bien les parser à chaque chargement de page pour reconstituer
les classes n'est-il en rien gênant ni laid ? (en considérant qu'on fait un
usage assez intensif de ces tables des matières, comme pour un livre
technique sur un langage de programmation ;-))

Voilà. Encore une fois désolé, vraiment désolé, pour la longueur de ce post.
Je remercie ceux qui seront arrivés au bout (entier), et c'est avec un grand
intérêt et une grande attention que je consulterai la moindre réponse, car
même une simple piste de réflexion ou d'information sur ce sujet pourra me
faire avancer à grand pas
(c'est bien la première fois que je ne trouve rien après plusieurs jours et des
heures de recherche sur le net et auprès de connaissances :-( ).

Merci encore à vous ! Et bon code !

Phil