2010-11-28 37 views
2

我的任务是重构一个写得不好的开关语句(它使循环复杂性尖峰化)。总之,有一个类为不同的值分析文件。将数据重构为不同类型数据的开关语句

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 
} 

我对题目念起来,而似乎有大量的帮助,这一切似乎在战略设计模式,这(我相信)是指向会矫枉过正我的问题。在我的项目中,有多个这样的类,其中一些具有25个以上的case语句(对于那些能够想出和界面或抽象类的人的赞誉)

我曾考虑过使用Dictionary<String, TValue>,如John Sonmez所述,但那么TValue会是什么?

任何帮助将不胜感激。

回答

4

首先,reader.ReadLine()真的不是这里的switch声明的一部分,所以我会建议你刚刚通过两通读线的两个到另一个类来处理。 (第一行似乎定义了它是什么,第二行有价值)。

您的处理程序将包含该操作。如果你不希望使用策略 - 这是容易的,也许你应该 - 有Dictionary的值各为执行一项战略delegates

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

我想你可能误会我了。如果策略是最好的方法,那么通过一切手段我会使用它! – 2010-11-28 23:42:50

0

两个选项。

如果有一个约定,从行中读取的数据与属性的名称匹配,您可以按惯例通过反射来填充属性。或者,您可以在属性上使用与您从文件中读取的期望值相对应的属性。

希望有所帮助,或至少点你在正确的方向:)