Supposons que nous ayons un objet qui représente la configuration d'un composant matériel. Par souci d'argument, un contrôleur de température (TempController). Il contient une propriété, la température de consigne.La méthode Object-Oriented pour séparer le modèle de sa représentation
Je dois enregistrer cette configuration dans un fichier pour l'utiliser dans un autre périphérique. Le format de fichier (FormatA) est défini dans la pierre. Je ne veux pas que l'objet TempController soit au courant du format de fichier ... ce n'est pas pertinent pour cet objet. Donc je fais un autre objet, "FormatAExporter", qui transforme le TempController en la sortie désirée.
Un an plus tard, nous fabriquons un nouveau contrôleur de température, appelé "AdvancedTempController", qui a non seulement un point de consigne, mais aussi un contrôle de débit, ce qui signifie une ou deux propriétés supplémentaires. Un nouveau format de fichier est également inventé pour stocker ces propriétés ... appelons-le FormatB.
Les deux formats de fichiers sont capables de représenter les deux périphériques (supposons que AdvancedTempController a des valeurs par défaut raisonnables s'il manque de paramètres).
Voici donc le problème: Sans utiliser 'isa' ou une autre méthode de "triche" pour déterminer quel type d'objet j'ai, comment FormatBExporter peut-il gérer les deux cas? Mon premier instinct est d'avoir une méthode dans chaque contrôleur de température qui peut fournir un exportateur client pour cette classe, par exemple TempController.getExporter() et AdvancedTempController.getExporter(). Cela ne prend pas en charge plusieurs formats de fichiers.
La seule autre approche qui vient à l'esprit est d'avoir une méthode dans chaque contrôleur de température qui renvoie une liste de propriétés et leurs valeurs, puis le formateur peut décider comment les sortir. Ça marcherait, mais cela semble alambiqué.
MISE À JOUR: Lors d'autres travaux, cette dernière approche ne fonctionne pas vraiment bien. Si tous vos types sont simples, cela peut être le cas, mais si vos propriétés sont des objets, vous finissez par pousser le problème à un niveau inférieur ... vous êtes obligé de retourner une paire de valeurs String, Object, et l'exportateur devra savoir Les objets doivent en fait les utiliser. Cela pousse donc le problème à un autre niveau.
Y a-t-il des suggestions sur la façon dont je pourrais garder cette flexibilité?
Cela rend également le code plus testable car parce que beaucoup plus facile de se moquer des collaborateurs. –
C'est une touche plus élaborée que j'avais prévu, mais j'aime ça. Il offre la flexibilité de renvoyer toutes les propriétés dans une liste, tout en préservant les informations de type à travers l'interface. Et cela aide définitivement la testabilité. –