2010-11-28 25 views
2

Ma mission est de refactoriser une instruction de commutateur qui a été mal écrit (il fait pointer la complexité cyclomatic). En bref, il existe une classe qui analyse un fichier pour différentes valeurs.Refactoring déclaration de commutateur pour les données à différents types de données

class foo 
{ 
    //a sampling of the fields. Each have their appropriate property 
    private string _name; 
    private short _location; 
    private int _lineNumber; 
    private List<string> _siblings; 

    internal foo (StreamReader reader) 
    { 
     _siblings = new List<string>() 
     while (!reader.EndofFile) 
     { 
      switch (reader.ReadLine()) 
      { 
       case "Name": 
        _name = reader.ReadLine(); 
        break; 
       case "Location": 
        _location = short.Parse(reader.ReadLine()); 
        break; 
       case "Line Number": 
        _lineNumber = int.Parse(reader.ReadLine()); 
        break; 
       case "Brother": 
       case "Sister": 
        _siblings.Add(reader.ReadLine()); 
        break; 
       //etc 
      } 
     } 
    } 
    //Other methods and such 
} 

J'ai lu sur le sujet et alors qu'il semble y avoir beaucoup d'aide, tout semble pointer au modèle de conception de la stratégie, qui (je crois) serait exagéré mon problème. Dans mon projet, il y a plusieurs classes comme ça, avec certaines d'entre elles ayant plus de 25 instructions de cas (donc bravo à ceux qui peuvent avoir une idée et une classe d'interface ou abstraite)

J'ai pensé à utiliser un Dictionary<String, TValue> comme décrit par John Sonmez, mais alors que serait TValue?

Toute aide serait grandement apprécié.

Répondre

4

D'abord, reader.ReadLine() est vraiment pas partie de la déclaration switch ici, donc je vous conseille de lire simplement les lignes deux par deux et passe à une autre classe à gérer. (la première ligne semble définir ce que c'est et la seconde a la valeur).

Votre gestionnaire contiendra l'action. Si vous ne voulez pas utiliser la stratégie - qui est facile et peut-être vous devriez - avoir la valeur de la Dictionary comme delegates chaque mise en œuvre d'une stratégie:

Dictionary<string, Action<string>> dic = new Dictionary<string, Action<string>>(); 
dic.Add("Father", ((x)=> // somthing); 
dic.Add("Brother", ((x)=> // somthing); 
dic.Add("Sister", ((x)=> // somthing); 
+0

Je pense que vous avez peut-être mal compris moi. Si la stratégie est la meilleure façon, alors je vais l'utiliser! –

+0

Cette implémentation est de toute façon stratégique mais l'usine est implémentée en tant que dictionnaire. – Aliostad

+0

De wiki: "L'exigence essentielle dans le langage de programmation est la possibilité de stocker une référence à un code dans une structure de données et de le récupérer." C'est ce que je fais ici. – Aliostad

0

Deux options.

S'il existait une convention selon laquelle les données lues sur la ligne correspondaient au nom d'une propriété, vous pourriez par convention remplir la propriété par réflexion. Vous pouvez également utiliser un attribut sur la propriété correspondant à la valeur attendue que vous souhaitez lire dans le fichier.

espoir qui aide ou au moins vous pointe dans la bonne direction :)