2014-05-24 2 views
0

Представьте, что вы хотите экспортировать определенный документ в файл (в некотором формате ... допустим, XML).Конструктор против метода против фабрики

Для этого у меня есть класс XmlExporter, и вопрос в том, что ... какой лучший подход к передаче документа и файла этому классу?

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

class XmlExporter { 
    public function export(Document document, File file) { 
     this.writeHeader(document.header, file); 
     this.writeSomeOtherStuff(document.somethingElse, file); 
     // and more ... 
    } 

    private function writeHeader(DocumentHeader header, File file) { 
     writeName(header.name, file); // passing file over and over again 
    } 
} 

Вариант 2: Оба источника и цели хранится внутри пример. Если бы я хотел изменить файл, мне пришлось бы создать новый объект, но теперь мне не нужно беспокоиться о передаче всех необходимых данных.

class XmlExporter { 
    private final Document document; 
    private final File file; 
    public XmlExporter(Document document, File file) { 
     this.document = document; 
     this.file = file; 
    } 
    public function export() { 
     this.writeHeader(this.document.header); 
    } 
    private function writeHeader(DocumentHeader header) { 
     this.writeName(header.name); 
    } 
    private function writeName(String name) { 
     // ... 
    } 
} 

Вариант 3: Сочетание обоих

class DocumentExporter { 
    public static function exportToXml(Document document, File file) { 
     XmlExporter exporter = new XmlExporter(document, file); 
     exporter.export(); 
    } 
    // the rest same as Option 2, probably with private constructor 
} 

В основном второй выбор делает больше смысла для меня с точки зрения написания класса, так как я не нужно передать целевой файл/поток вокруг; однако с точки зрения его фактического использования я чувствую, что первый выбор имеет смысл. Что делать, если я хочу экспортировать его в стандартный вывод вместо файла или экспортировать несколько документов?

+0

Я бы лично пойти со вторым, потому что мне это в основном аналогично тому, как файлы в настоящее время обрабатываются с помощью шаблона декоратора, но я Wouldn» t представить это как ответ. Мне кажется, что выбор между этими 3 в значительной степени зависит от того, что является подходящим в то время –

+0

Что касается использования свободной нотации, новый XmlExporter(). Document (d) .file (f) .export(); Если вы хотите записать несколько файлов, метод file() может полагаться на коллекцию. – TeTeT

ответ

1

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

Что делать, если я хочу экспортировать его в стандартный вывод вместо файла, или экспортировать несколько документов?

Постарайтесь отделить функциональность вашего класса XmlExporter. XmlExporter должен быть директором, ответственность за которого заключается в анализе документа и уведомлении обработчика (интерфейса), прикрепленного во время выполнения - одна реализация Handler может записывать данные в файл, а другая - в консоль.

Заканчивать Лабиринта Builder Design: http://www.blackwasp.co.uk/Builder.aspx

0

None. Exporter (а также «менеджер», «контроллер» или любые другие «-er» имена) являются индикаторами неправильного дизайна. Вместо этого, ваш Document должен знать, как экспортировать себя к File:

document.exportTo(file); 
+0

Это слишком сильное мнение, которое я думаю. Мне лично не нравится, если «Документ» знает, как экспортировать себя в «Файл». * Это будет плохой дизайн. –

+0

Это как если бы вы хотели, чтобы «Коробка» могла загрузиться в «Грузовик». «Документ» будет иметь зависимость от времени компиляции от «Файл», что создает нежелательную ** тугое соединение **. –

+0

Это типичная перспектива ООП.Однако в корпоративных системах мы скорее избегаем этих принципов и вместо этого отделяем проблемы в отдельных классах и слоях. –

Смежные вопросы