Читая файл, чьи строки меняют тип - PullRequest
2 голосов
/ 17 марта 2011

Это должно быть просто, но сегодня утром мозг еще не совсем взбодрился.

У меня есть файл счета-фактуры (на самом деле набор данных, но, что угодно). Я читаю это построчно сверху вниз. Если строка имеет O в столбце типа, это начало нового заказа, и содержит информацию о заказе и сведения о заголовке раздела. Когда он содержит S, он имеет те же данные заголовка для подраздела. Другие строки - это детали соответствующих разделов с номером позиции и количеством (относится к заголовкам в строках O / S).

Пример

O  o123  typea typeb typec
   1234    3     2     6
   2345    1     0     2
S        typed typee typef
   1634    3     2     6
   2645    1     0     2
O  o123  typea typeb typec
   1234    3     2     6
   2345    1     0     2
S        typed typee typef
   1634    3     2     6
   2645    1     0     2
S        typed typee typef
   1634    3     2     6
   2645    1     0     2

Я не борюсь с изменением типа и обращаюсь к аспектам конечного автомата при чтении файла. С чем я борюсь, так это с объектной моделью.

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

Если это имеет значение, я пишу код на c # (framework 3.5).

Спасибо

1 Ответ

1 голос
/ 17 марта 2011

Вы должны использовать некоторые из шаблонов Factory Method .

Обычно это реализуется с помощью ряда классов, производных от общей базы или реализации общего интерфейса - это зависит от отношений между классами. Давайте перейдем ко второму варианту и предположим, что ICommon. Затем вы заполняете карту «отличительных значений» экземплярами Action<ICommon>.

В вашем примере мы могли бы иметь:

var map = Dictionary<string, Action<ICommon>()
{
    { "O", () => new Order() },
    { "S", () => new Subsection() },
};

Затем вы создаете фабричный метод, который принимает любой введенный вами текст, находит соответствующее действие на карте, создает объект и возвращает его вызывающей стороне:

public static ICommon CreateCommon(FileLine line)
{
     // assume map is visible
     var producer = map[line.Type];
     return producer();
}

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

...