Шаблон проектирования для анализа последовательных строк

Какой шаблон проектирования вы предлагаете для следующего случая:

Класс необходим для представления последовательной строки некоторых документов, состоящей из числовых символов. Существует 4 типа серийных номеров, и первый символ строки определяет тип серийного номера. Каждый тип серийного номера имеет несколько числовых полей, разделенных вертикальной чертой. Серийные типы отличаются только количеством полей, которые у них есть (которое фиксировано для каждого типа). Значение каждого поля не имеет значения и может иметь произвольные значения. Строка серийного номера заканчивается символом вертикальной черты, за которым следует двухзначная контрольная сумма всех предшествующих числовых значений серийного номера. Например, следующая строка представляет серийный номер типа 2:

20202|5666|00020|31

Здесь первая цифра 2 указывает, что серийный номер является серийным номером типа 2. Строка серийного номера состоит из 3 полей, а контрольная сумма серийного номера — это две последние цифры, 31, что представляет собой просто сумму всех предшествующих чисел.

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


person MCA    schedule 01.03.2015    source источник
comment
i вещь о: ткань + стратегия.   -  person Marek Woźniak    schedule 01.03.2015
comment
Шаблоны ткани и стратегии кажутся хорошими идеями. Рекомендуется использовать шаблон структуры для создания объектов Serial и применять стратегию инкапсуляции алгоритма контрольной суммы для различных типов последовательных номеров. Спасибо @W92.   -  person MCA    schedule 02.03.2015


Ответы (1)


Как упоминалось в @W92, использование фабрики для возврата стратегии синтаксического анализа было бы распространенным подходом. Отдельная стратегия инкапсулирует логику синтаксического анализа, необходимую для каждого типа. Пример С#...

 var serialNumber = "20202|5666|00020|31";
 var factory = new SerialParserFactory();
 var parser = factory.GetParser(serialNumber);
 IParsingResult result = parser.ParseSerial(serialNumber);

Все синтаксические анализаторы реализуют общий интерфейс с одним методом ParseSerial, который возвращает IParsingResult. Парсеры могут быть как простыми, так и сложными по мере необходимости.

public interface ISerialParser
{
   IParsingResult ParseSerial(string serialNumber);
}

public class SerialParserType2: ISerialParser
    {
        public IParsingResult ParseSerial(string serialNumber)
        {
            string[] parts = serialNumber.Split("|".ToCharArray());

        int[] fields = new int[parts.Length-2];
        for (int partIndex = 0; partIndex < parts.Length-1; partIndex++)
        {
            int value = 0;
            if (!int.TryParse(parts[partIndex], out value))
            {
                value = 0;
            }
            fields[partIndex] = value;
        }
        int checkSum = 0;
        if (!int.TryParse(parts[parts.Length-1], out checkSum))
        {
            checkSum = 0;
        }
        return new Type2Result
        {
            Fields = fields,
            CheckSum = checkSum
        };
    }
}

То же и с результатами...

public class Type2Result: IParsingResult
{
    public int[] Fields { get; set; }
    public int CheckSum { get; set; }
}

В этом случае фабрика может быть простой...

public class SerialParserFactory
{
    public ISerialParser GetParser(string serialNumber)
    {
        string typeChar = serialNumber.Substring(0, 1);
        switch (typeChar)
        {
            case "2":
                return new SerialParserType2();
        }
        return new NotFoundParser();
    }
}
person dbugger    schedule 01.03.2015