Парсер для нескольких форматов и нескольких операций (шаблон проектирования доступен?) - PullRequest
0 голосов
/ 23 ноября 2010

В настоящее время я пишу анализатор текстовых файлов для нескольких форматов. В то время как текстовый файл анализируется, существуют различные виды операций. Я пытаюсь сделать что-то чистое, используя ООП. Вот где я застрял:

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. Что я могу сделать, чтобы сделать это чище?

Спасибо Antoine

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Похоже, шаблон стратегии может помочь очистить это.

См. Также: StackOverflow: [java] поиск шаблона стратегии

0 голосов
/ 23 ноября 2010

Возвращает 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

Это может быть в коде, который вы нам дали, но класс Abstract должен когда-либо вызывать только другие методы или методы Abstract, которые предоставляются внутри этого класса, они должны требовать, чтобы пользователь знал, что он должен добавить 2 методакроме того, что мне нравится ваш код, его легко читать, что является основным в кодировании

0 голосов
/ 23 ноября 2010

Обычно рекомендуется следовать правилу «1 класс на файл».

Кроме этого, вы не можете сделать намного больше, чтобы очистить его.

Единственное, что нужно принять решение, это то, как вы хотите загрузить каждый файл класса, что можно сделать несколькими способами. Я бы предложил сделать заводской класс с реестром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...