2011-03-17 37 views
2

这应该是简单的,但今天早上大脑还不是咖啡因。阅读文件,谁的线条改变类型

我有一个发票文件(实际上是数据集,但是,无论)。我正在逐行阅读,自上而下。如果该行在类型列中有O,则它是新订单的开始,并包含订单信息和部分标题详细信息。当它包含S时,它具有与子部分相同的标题详细信息。其他各行是其各个部分的详细信息,包括项目编号和数量(与O/S行中的标题相关)。

例如

O o123 typea typeb typec 
    1234 3  2  6 
    2345 1  0  2 
S  typed typee typef 
    1634 3  2  6 
    2645 1  0  2 
O o123 typea typeb typec 
    1234 3  2  6 
    2345 1  0  2 
S  typed typee typef 
    1634 3  2  6 
    2645 1  0  2 
S  typed typee typef 
    1634 3  2  6 
    2645 1  0  2 

我不是不断变化的类型和处理的读取文件的状态机方面的努力。我正在努力的是对象模型。

我最初将行读入一个通用的线类,然后需要将其转换为适当的类型......但布置这些类的正确方法是什么?我的界面应该如何显示,以便我可以干净地编写它。应该有抽象类吗?

如果它有所作为,我编码在C#(框架3.5)。

感谢

回答

1

,您应该使用Factory Method模式一番风味。

这通常通过拥有许多类从一个公共基础或实现一个通用接口实现 - 这取决于类之间的关系。让我们继续第二个选项,并假设ICommon。然后,您为Action<ICommon>的实例填充“特殊值”的映射。

在你的榜样,我们可能有:

var map = Dictionary<string, Action<ICommon>() 
{ 
    { "O",() => new Order() }, 
    { "S",() => new Subsection() }, 
}; 

然后,创建工厂方法,它不管你输入的是,发现从地图上相应的动作,创建对象,并将其返回给调用者:

public static ICommon CreateCommon(FileLine line) 
{ 
    // assume map is visible 
    var producer = map[line.Type]; 
    return producer(); 
} 

这就是它的全部。通常所有这些都被打包成一个静态类,根据具体情况,地图可以用硬编码数据填充,或者通过一些算法自动填充(想一下包装这些类的构造函数),甚至可以通过代码编程在使用工厂方法之前。