Рефакторинг вложенных циклов for

У меня такая ситуация: между двумя наборами данных есть отношения родитель-ребенок. У меня есть родительская коллекция документов и дочерняя коллекция документов. Требование заключается в том, что родительские и соответствующие им дочерние документы должны быть экспортированы в документ pdf. Простая реализация вышеописанной ситуации может быть следующей (псевдокод на java ниже):

for(Document parentDocument:Documents){
   ExportToPdf(parentDocument);
    for(Document childDocument:parentDocument.children()){
      AppendToParentPdf(childDocument);  
  }
}

Что-то, как описано выше, вероятно, решит проблему, но внезапно требования меняются, и теперь каждый из этих родителей и их соответствующих детей должен быть в отдельных pdf, поэтому вышеприведенный фрагмент модифицируется путем изменения AppendToParentPdf() на ExportToPdf():

for(Document parentDocument:Documents){
   ExportToPdf(parentDocument);
    for(Document childDocument:parentDocument.children()){
      ExportToPdf(childDocument);  
  }
}

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

Мои вопросы к SO:

  1. Существуют ли лучшие представления отношений родитель-ребенок, такие как вышеупомянутые, где вместо того, чтобы пробивать путь через все документы и их дочерние элементы методом O(n^2), я могу использовать другую структуру данных или технику для более оптимального обхода всей структуры.

  2. В сценарии, который я описал выше, где бизнес-правила довольно изменчивы относительно того, как должны экспортироваться pdf-файлы, есть ли более разумный способ закодировать природу функции экспорта? Кроме того, формат экспорта изменчив. PDF может уступить место *.docs/csvs/xmls и т.д.

Было бы здорово получить некоторые перспективы на этот счет.

Thanks

9
задан sc_ray 29 November 2011 в 04:17
поделиться