Php 用于多种格式和多种操作的解析器(设计模式是否可用?)
我目前正在为几种格式编写一个文本文件解析器。解析文本文件时,需要执行不同类型的操作。我正在尝试使用OOP做一些干净的事情。 这就是我被困的地方: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 ) {
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。