在这种情况下,解析输入流的责任应该在哪里?

时间:2010-11-26 17:10:00

标签: oop data-structures

假设我是通过输入流从某种手持设备解析读数。有不同类型的读数,每个都需要不同的解析。

目前我有一个“手持式”类,可以处理所有解析并根据需要创建相应类型的读取对象。它解析阅读并通过他们的“设置”方法填充每个阅读。

我想知道读数本身是否应该知道如何解析输入流。例如,当下一个读数出现时,我应该实例化适当的读取对象并在其上调用“解析”方法,将其传递给输入流吗?

我不喜欢的主要问题是解析代码遍布整个地方而不是整齐地保存在一个地方。然而,它确实摆脱了对所有这些设置方法的需要,并且读取只需通过我的“apply”方法将其自身应用于服务器/数据库/无论何时需要。

那么哪种方式会被认为是“更好”(或更多OO)?

1 个答案:

答案 0 :(得分:0)

我会创建一个工厂设计模式。

创建一个基类来表示GeneralParser并为每个解析器创建一个子类,如果解析方法中有一些共同点,那么让它在基本的GeneralParser的Parse方法中,并在child.parse方法中调用base.parse方法。

我确信你有办法确定使用哪个解析器,我认为你现在正在使用控制语句(if,switch ...)并进行解析。那么现在不要那样,让专门的(子)解析器类为你处理它。

伪类图:

GeneralParser
|
|
->XMLParser
->JsonParser

以下是C#.Net

中的一些实现
public static class ParserFactory
{
    public static GeneralParser CreateXMLParser()
    {
        return new XMLParser();
    }

    public static GeneralParser CreateJsonParser()
    {
        return new JSONParser();
    }
}

在您的程序代码中,您可能会编写类似这样的内容(伪代码),因为它取决于您决定使用哪种解析器的方式。

// ...
GeneralParser parser;
if( to_be_parsed_as_xml)
{
    parser = ParserFactory.CreateXMLParser();
    parser.Parse(stream);
}
else if( to_be_parsed_as_json )
{
    parser = ParserFactory.CreateJsonParser();
    parser.Parse(stream);
}
// ...

如果只需解析器就可以动态创建解析器(不保留其引用)。