【问题标题】:Reading a file, who's lines change type读取文件,谁的行改变类型
【发布时间】:2011-03-17 14:00:53
【问题描述】:

这应该很简单,但今天早上大脑还没有完全清醒。

我有一个发票文件(实际上是数据集,但是,无论如何)。我正在逐行阅读,自上而下。如果该行的类型列中有 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)进行编码。

谢谢

【问题讨论】:

    标签: c# class data-structures interface


    【解决方案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();
    }
    

    仅此而已。通常所有这些都被打包到一个静态类中,并且根据您的情况的具体情况,地图可能会填充硬编码数据,或者通过某种算法自动填充(想想包装这些类的static 构造函数),甚至以编程方式通过使用工厂方法之前的代码。

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多