我目前正在为多种格式编写文本文件解析器。在解析文本文件时,可以执行不同类型的操作。我正在尝试使用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中。 我该怎么做才能让这个更干净?
由于 安托
答案 0 :(得分:2)
听起来Strategy pattern可能有助于清理它。
答案 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个方法而不是我喜欢你的代码很容易阅读,这是编码的主要内容