Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于多种格式和多种操作的解析器(设计模式是否可用?)_Php_Oop_Design Patterns - Fatal编程技术网

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

Php 用于多种格式和多种操作的解析器(设计模式是否可用?),php,oop,design-patterns,Php,Oop,Design Patterns,我目前正在为几种格式编写一个文本文件解析器。解析文本文件时,需要执行不同类型的操作。我正在尝试使用OOP做一些干净的事情。 这就是我被困的地方: abstract class Parser { abstract protected function DoSomeStuff($data); public function Parse($src) { if ( $this->GetFormat($src) == 1 ) {

我目前正在为几种格式编写一个文本文件解析器。解析文本文件时,需要执行不同类型的操作。我正在尝试使用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(...);
如您所见:所有文件格式的所有代码都在类解析器中。 我能做些什么使这个更干净

谢谢
Antoine

一般来说,遵循每个文件一级规则是个好主意

除此之外,你可以做的事情就不多了

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

听起来可能有助于清理这个问题


另请参见:

GetFormat返回和int这对于用户来说很难理解int是什么,如果您返回诸如“CSV”或“XML”之类的内容,最好是什么

另一个是

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


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

同意:每文件1类规则。请参阅Matt Ball回答:策略模式库可以使我的代码更干净、更面向对象。应用此模式,每个格式生成一个类,每个“操作”生成一个类。一个全局类在格式和操作之间起着“粘合剂”的作用(我想用它来说明这一点)。谢谢你的评论。。。但是你所评论的不是我的问题:-)事实上,我想完全避免:if(getformat()==xx){}的部分,我想通过使用一个对象来避免它。这是唯一可以评论的代码:p,你想让我们看什么?对不起,你是对的,我忘了告诉你我在设计上有问题,不是代码本身(很快就写成伪代码)。这似乎正是我想要的:-)@mattball:最好的建议之一。你有199K。