适用于多种格式和多种操作的解析器(可用设计模式?)

时间:2010-11-23 14:56:59

标签: php oop design-patterns

我目前正在为多种格式编写文本文件解析器。在解析文本文件时,可以执行不同类型的操作。我正在尝试使用OOP做一些干净的事情。 这是我被困的地方:

abstract class Parser
{
    abstract protected function DoSomeStuff($data);

    public function Parse($src)
    {
        if ( $this->GetFormat($src) == 1 )
        {                       
            $data =$this->GetSomeDataFromFormat1($src);
            DoSomeStuff($data);
        }
        if ( $this->GetFormat($src) == 2 )
        {
            $data = $this->GetSomeDataFromFormat2($src);
            DoSomeStuff($data);
        }
    }   
}

class DoSomething extends Parser
{
    protected function DoSomeStuff($data)
    {
        // Doing some stuff with data
    }
}

class DoSomethingElse extends Parser
{
    protected function DoSomeStuff($data)
    {
        // Doing some other stuff with data
    }
}

$ds = new DoSomething();
$ds->Parse(...);

$dse = new DoSomethingElse();
$dse->Parse(...);

如您所见:所有文件格式的所有代码都在类Parser中。 我该怎么做才能让这个更干净?

由于 安托

3 个答案:

答案 0 :(得分:2)

听起来Strategy pattern可能有助于清理它。

另请参阅:StackOverflow: [java] strategy pattern search

答案 1 :(得分:0)

遵循每个文件的1级规则通常是一个好主意。

除此之外,你无法做更多的事情来清理它。

唯一要决定的是如何加载每个类文件,这可以通过多种方式完成。我建议用注册表创建一个工厂类。

答案 2 :(得分:0)

GetFormat返回和int这对于用户来说,如果你返回一些像“CSV”或“XML”这样的东西,最好是什么int是不容易的

另一个是

if ( $this->GetFormat($src) == 1 )
{
}
if ( $this->GetFormat($src) == 2 )
{
}

//This should be a switch
$src = $this->getFormat($src);

switch($src){
    case 1:

    break;
    case 2:

    break;
}

这样可以防止代码在可以执行一次的情况下加载方法两次,并且开关的内存少于if

我可以发现的最后一个是

GetSomeDataFromFormat1和GetSomeDataFromFormat2

这可能是你给我们的代码,但是一个Abstract类应该只调用该类中提供的其他Abstract方法或方法,他们应该要求用户知道他们必须添加2个方法而不是我喜欢你的代码很容易阅读,这是编码的主要内容