我的任务是重构一个写得不好的开关语句(它会使得圈复杂度达到峰值)。简而言之,有一个类可以解析文件中的各种值。
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会是什么?
非常感谢任何帮助。
答案 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)
两个选项。
如果存在从该行读取的数据与属性名称匹配的约定,则可以按惯例通过反射填充该属性。或者,您可以在属性上使用与您从文件中读取的期望值相对应的属性。
希望有助于或至少指出正确的方向:)