2016-10-20 1 views
1

Je travaille actuellement sur un projet où je suis l'analyse d'un fichier externe à un objet abstrait comme ceci:Comment gérer les ressources externes de manière SOLIDE?

public interface IMapConverter 
{ 
    IMap Convert(IMapFile file); 
} 

public interface IMapFile 
{ 
    void Load(string filePath); 
    string Json { get; } 
} 

Mon plan était d'abstraire le chargement du fichier en utilisant la mise en œuvre de IMapFile et la création de la StreamReader dans cette implémentation. Je passerais ensuite à la méthode IMapConverter.Convert. Serait-ce une approche correcte et maintenez la testabilité? Serait-il par exemple mal de passer la chaîne directement à IMapConverter et de la gérer là?

+1

Ce n'est pas clair. Pour moi 'IMapFile' semble être une mauvaise abstraction car' Json' est probablement un détail d'implémentation. Tous les fichiers de mappage contiennent-ils uniquement json? Quel est le rôle de 'IMapConverter'? Est-ce seulement en analysant la chaîne json dans une 'Map'? Il semble que vos abstractions soient un peu bizarres et vous bénéficieriez probablement d'un design plus explicite qui essaye d'être moins flexible que d'utiliser des abstractions qui ne sont pas flexibles. Pourriez-vous expliquer le problème que vous essayez de résoudre en plus de détails? – plalx

+0

Merci pour votre commentaire. Bien sûr! Un IMapFile chargerait un fichier, qui pourrait contenir une chaîne ou des données binaires ou quoi que ce soit (je vois ce que vous voulez dire maintenant). IMapConverter convertirait n'importe quel format et l'analyserait en un objet IMap qui contient les données cartographiques réelles qui sont ensuite transmises à MapRenderer. Quelle abstraction suggérez-vous à la place? –

+1

J'ai besoin de plus d'informations pour proposer de meilleures abstractions. Qu'est-ce qu'un IMap? Est-ce une forme de structure de données de dictionnaire ou 'Map' est un concept d'entreprise dans votre domaine? Y aura-t-il de multiples implémentations de telles 'Map'? Quelles sont les dépendances d'une 'Map'? Le processus de création est-il complexe? Avez-vous prévu d'avoir plusieurs implémentations de convertisseurs? Quel est le rôle du convertisseur? – plalx

Répondre

1

Je ne vois pas de problème à faire ce que vous suggérez, c'est-à-dire avoir le béton IMapConverter créer une instance de votre béton IMapFile parce qu'ils sont tous deux sur la même couche de votre application. La règle, si je comprends bien, est qu'une classe qui implémente une interface de dépendance peut "savoir" sur une implémentation d'une autre interface tant qu'elles sont sur la même couche de votre application; Une fois que vous travaillez entre les couches, vous voulez injecter vos dépendances, c'est-à-dire vos implémentations concrètes, dans la couche située en dessous.

J'ai étudié the onion architecture que je recommanderais fortement à tous ceux qui cherchent à créer des applications faiblement couplées et hautement testables. Cette notion de dépendances se connaissant tant qu'elles sont sur la même couche est discutée sur ce site.

+0

Très clair! Merci de m'avoir reliée à l'architecture de l'oignon, bonne lecture! –

+0

Pas de problème, content de pouvoir aider. –