Mon projet contient un grand nombre de classes, dont plusieurs peuvent être décrites par des fichiers XML. Ne vous inquiétez pas, ce n'est pas la logique ou l'implémentation en XML. Il s'agit d'un jeu, et un exemple serait qu'une tuile de jeu peut être définie en XML, le fichier image, les images d'animation, etc.
Je vais finir par avoir un tas de fonctions qui ressemblent à ceci :
public static Foo FromXml(ref XmlTextReader reader) { ... }
La question est la suivante : ces fonctions doivent-elles être contenues dans leur propre classe correspondante, par exemple la fonction ci-dessus serait Foo.FromXml. Ou dois-je créer une classe séparée pour lire des choses à partir de fichiers ? Il semble y avoir deux lignes directrices générales qui s'affrontent ici :
- Une classe doit tout savoir sur une seule chose : elle-même.
- Une classe ne devrait avoir qu'une seule raison de changer.
Tout d'abord, je ne comprends pas vraiment la deuxième, car le terme "raison" est assez vague. La première ligne directrice suggère de placer chaque lecteur dans la classe correspondante. La seconde dit de faire une classe dédiée à la lecture des fichiers xml. Mais les avantages et les inconvénients sont discutables. D'une part, chaque classe peut contenir son propre lecteur, ce qui évite de référencer une douzaine de classes. D'autre part, chaque classe devrait inclure System.Xml, et si je change mon format xml, les choses pourraient changer dans plusieurs fichiers (mais je ne pense pas que ce soit trop grave).
Je sais que la règle la plus importante est "utilisez votre cerveau" et qu'il n'existe pas de solution "correcte", mais seulement une bonne solution qui fonctionne. Alors, qu'est-ce qui, selon vous, serait plus lisible ou, mieux encore, plus facile à maintenir ?
edit : pour clarifier, les classes peuvent être totalement indépendantes. Puisqu'il s'agit d'un jeu, l'une peut être la classe d'animation des sprites, l'une peut définir le comportement des ennemis, l'une peut définir la disposition ou les propriétés de la carte. L'héritage n'a donc rien à voir avec cela.