Где должна быть ответственность за разбор входного потока в этом сценарии? - PullRequest
0 голосов
/ 26 ноября 2010

Скажите, если я анализирую показания с какого-либо портативного устройства через поток ввода.Существуют чтения разных типов, и каждый из них должен анализироваться по-разному.

В настоящее время у меня есть класс "handheld", который обрабатывает все операции синтаксического анализа и создает необходимые для чтения объекты соответствующего типа.Он анализирует чтение и заполняет каждое чтение с помощью их методов "set".

Интересно, должны ли сами чтения знать, как анализировать входной поток.Например, когда приходит следующее чтение, должен ли я создать экземпляр соответствующего объекта чтения и вызвать метод «parse» для него, передав его во входной поток?

Главное, что мне не нравится в этомЭто код синтаксического анализа повсюду, а не хранится аккуратно в одном месте.Тем не менее, он избавляет от необходимости все эти методы набора, и чтение может просто применяться к серверу / базе данных / независимо от того, что требуется с помощью метода «apply», который у меня есть.

Так что будет считаться«приятнее» (или больше ОО) способом?

1 Ответ

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

Я бы пошел, создав шаблон дизайна фабрики.

Создайте базовый класс для представления GeneralParser и создайте дочерний класс для каждого анализатора, и если в методе синтаксического анализа было что-то общее, пусть это будет в базовом методе Parse GeneralParser и вызовите метод base.parse в методе child.parse.

Я уверен, что у вас есть способ определить, какой синтаксический анализатор использовать, и я думаю, что в настоящее время вы используете управляющие операторы (if, switch ...) и выполняете синтаксический анализ. Что ж, теперь вместо этого позвольте специализированному (дочернему) классу парсера обработать его для вас.

Диаграмма псевдокласса:

GeneralParser
|
|
->XMLParser
->JsonParser

Вот некоторая реализация в C # .Net

public static class ParserFactory
{
    public static GeneralParser CreateXMLParser()
    {
        return new XMLParser();
    }

    public static GeneralParser CreateJsonParser()
    {
        return new JSONParser();
    }
}

В программном коде вы можете написать что-то вроде этого (псевдокод), потому что это зависит от того, как вы решаете, какой синтаксический анализатор использовать.

// ...
GeneralParser parser;
if( to_be_parsed_as_xml)
{
    parser = ParserFactory.CreateXMLParser();
    parser.Parse(stream);
}
else if( to_be_parsed_as_json )
{
    parser = ParserFactory.CreateJsonParser();
    parser.Parse(stream);
}
// ...

Вы можете создать парсер на лету (без сохранения его ссылки), если вам нужны только парсеры для разбора и ничего более.

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