Bonjour
J’aurai besoin d’explication, au sujet de "Single responsibility principle".
Je vais avoir besoin de développer un outil (mode batch), et pour son architecture, j’aurai besoin de votre avis.
Il s’agit de transcoder une structure de données d’un type (sûrement XML) en un type binaire (normalisé). Donc l’outil doit :
- lire les données d’un fichier
- faire quelques contrôles
- encodé les données dans un fichier.
Pour faire simple, j’aurais fait : Un objet, avec toutes les données en variable membre, le constructeur lirait le fichier d’input, une méthode pour ajouter les contrôles, une méthode pour sortir dans un fichier les données avec la syntaxe de sortie. Mais …
« Une classe ne doit changer que pour une seule raison », donc je vois 4 raisons de changer :
- Si on ajoute/retire l’une des données de la structure à transcoder —> Objet 1, "Data"
- Nouvelle syntaxe en entrée —> Objet 2, "Input"
- Nouveaux contrôles —> Objet 3, "Check"
- Changement/update de norme, Nouvelle syntaxe de sortie —> Objet 4, "Output"
- (Note : Vu l’objectif de l’outil, je ne vois pas de changement sur les moyens d’input/output, ce sera toujours des fichiers)
Donc Data, Objet avec pour seule responsabilité la définition de la structure de donnée, et les 3 autres objets qui accèdent aux données de Data.
class Data {
int M_data1;
...
}
class Input {
Input (std::string conts fileName, Data myData);
...
}
class Check {
bool isValid (Data const myData) const;
...
}
class Output {
Output (Data const myData, std::string const fileName);
...
}
Ma question : Comment ces 3 dernières classes accèdent aux membres internes de Data ?
0) On ne fait pas hériter les 3 classe de Data, ça n’a pas de sens !
1) On fait des "getter/Setter" pour chaque membre de Data, (pas beaucoup de sens non plus !)
2) On met les membres de Data en public ?
3) On met les 3 classes en "friend" de Data ?
4) Je n’ai rien compris, et c’est autre chose qu’il faut faire ?
Merci pour votre aide.
Cordialement.
PS: J’avais l’impression d’avoir déjà posé cette question, mais je ne retrouve pas.