3

nous avons une structure hiérarchique où chaque noeud est dérivé d'une classe de base noeud public Node(INodeFactory nodeFactory) L'usine est injecté de sorte que le noeud peut créer ses nœuds enfants à l'aide à un moment plus tard Get(int id)devrait créer toujours une usine un nouvel objet

certains nœuds nécessitent une référence à un autre nœud de la structure. Les informations nécessaires pour obtenir la référence peuvent changer au moment de l'exécution et ne sont pas nécessairement disponibles lorsque l'objet de noeud a été construit. Fondamentalement, cette signature de méthode est la même et est Get(int id). Cette fois, aucun nouvel objet ne devrait être créé, mais un objet existant devrait être retourné.

Notre première tentative a été de passer un INodeLocator qui rechercherait le nœud. Tout d'abord, nous ne sommes pas sûrs que 'locator' soit un bon nom et s'il nous manque un motif ici, peut-être le motif du dépôt (mais seulement pour rechercher?). Deuxièmement, nous avons remarqué que la signature de la méthode est la même.

Nous envisagions de basculer l'usine du mode «création» au mode «recherche» après la création de l'arborescence initiale, mais cela ne fonctionnera pas puisque les nœuds doivent également être créés ultérieurement. Pour la logique du 'locator', nous avons envisagé de rechercher (itérer) à travers les nœuds, mais peut-être vaut-il mieux les suivre dans un dictionnaire plat. Mais alors le problème se pose que l'usine peut ajouter au dictionnaire mais ne gère pas la durée de vie. Que devrait-il se passer lorsqu'un noeud est supprimé?

Comment pouvons-nous concevoir ce problème correctement?

+0

ce n'est pas le bon endroit pour votre question passer à softwareengineering.stackexchange.com –

+0

Après avoir lu https://meta.stackoverflow.com/questions/254570/choosing-between-stack-overflow-and-software-engineering I pense que tu as probablement raison. Je n'ai jamais posté là-bas. Cela devrait-il alors être supprimé? –

+0

Je pense qu'il devrait être supprimé. même si c'est une bonne question et si vous regardez softwareengineering.stackexchange.com vous n'avez pas l'option de fermeture –

Répondre

0

Différenciez ces deux fonctions par leur nom, et ajoutez-en toutes les deux à votre "usine" (ce qui pourrait mériter un nom différent). Par exemple.

public interface INodeFactory 
{ 
    // creates a new Node and returns it 
    Node Create(int id); 

    // retrieves an existing node 
    Node Get(int id); 

    // deletes a Node 
    void Delete(int id); 
} 

Une mise en œuvre garde une sorte de dictionnaire interne, avec l'identifiant étant la clé, et le nœud plus une indication si elle a déjà été supprimé est la valeur.

Je préfère conserver les deux fonctions dans une classe, car un nœud récemment créé peut être stocké ici et donc les incohérences peuvent être facilement évitées.