Шаблон для дозирования и массовой обработки - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть данные, запрашиваемые из БД, которые очень похожи на следующие

Job Site    File    List
-------------------------------
1   SiteA   file2.txt   2
2   SiteB   file2.txt   2
3   SiteA   file23.txt  23
4   SiteC   file2.txt   2
5   SiteB   file12.txt  12
6   SiteA   file29.txt  29
7   SiteB   file28.txt  28

Я должен инициировать экземпляры для каждого сайта (сайты A, B и C), а затем выполнить обработку, например, для сайта A, например, file2.txt, file23.txt & file29.txt. Эта «обработка» может происходить в некотором порядке, но она должна выполняться один за другим (не одновременно).

Итак, моя первая задача - сопоставить сайты и создать экземпляры для каждого. Как мне это сделать?

PS: я решил, что для обработки я должен использовать какой-то шаблон итератора ... Я предпочитаю решения на любом современном языке компилятора ... как c #, vb, c ++ и т. Д. ...

Ответы [ 3 ]

0 голосов
/ 18 ноября 2009

Я хотел бы иметь объект посетителя с хэш-таблицей, которая повторяется для каждой записи.

Для каждой записи: - если он не существует в хеш-таблице, объект посетитель будет создавать для него сайт. - объект получит файл и обработает его.

Преимущество этого состоит в том, что вы выполняете группировку и обработку за один проход.

0 голосов
/ 18 ноября 2009

Я поддерживаю идею работника для каждого сайта.

Еще одна проблема - состояние приложения.

Когда ваше приложение запускается, его волнует, что случилось раньше? Рассмотрим сбой приложения, когда несколько файлов были обработаны. При перезапуске предположительно приложение снова обработает файлы? Это проблема?

0 голосов
/ 18 ноября 2009

Я не уверен, понял ли я, чего вы хотите достичь, но я думаю, что вам нужно сделать:

  1. Получите различные значения Site из ваших данных
  2. Для каждого из значений, полученных на предыдущем шаге
    2.1. Создание сайта
    2.2. Получить все связанные значения File и обработать каждое из них

В C # с использованием LINQ это будет примерно так:

var siteNames=data.Select(d => d.Site).Distinct();
foreach(var siteName in siteNames) {
    var site=new Site(siteName); //Or use a factory method, a sites list, etc
    var files=data.Where(d => d.Site==site).Select(d => d.File);
    foreach(var file in Files) {
        site.ProcessFile(file);
    }
}
...