将Data的switch语句重构为不同类型的数据

时间:2010-11-28 23:32:01

标签: c# dictionary refactoring switch-statement

我的任务是重构一个写得不好的开关语句(它会使得圈复杂度达到峰值)。简而言之,有一个类可以解析文件中的各种值。

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个案例陈述(所以对于那些能够提出想法和接口或抽象类的人来说是赞誉)

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

两个选项。

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

希望有助于或至少指出正确的方向:)