sc_*_*ray 9 java algorithm design-patterns export relationship
我有这种情况,我有两组数据之间的父子关系.我有一个父文档集合和一个子文档集合.要求是父母及其相应的孩子需要出口到'a'pdf文件中.上述情况的简单实现可以如下(java-ish伪代码如下):
for(Document parentDocument:Documents){
ExportToPdf(parentDocument);
for(Document childDocument:parentDocument.children()){
AppendToParentPdf(childDocument);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的内容可能会解决问题,但突然之间需求会发生变化,现在每个父母及其相应的孩子都需要在单独的pdf中,所以通过更改以下内容AppendToParentPdf()来修改上面给出的片段ExportToPdf():
for(Document parentDocument:Documents){
ExportToPdf(parentDocument);
for(Document childDocument:parentDocument.children()){
ExportToPdf(childDocument);
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,不久之后,这个看似微不足道的片段就会遭遇一些严重的代码味道.
我对SO的问题是:
是否有更好的父母 - 孩子关系表示,如上所述,而不是以一种方式强行通过所有文件和他们的孩子O(n^2),我可以使用不同的数据结构或技术来遍历整个结构最佳时尚.
在上面描述的场景中,业务规则对于应该导出pdf的方式相当流畅,是否有更智能的方法来编写导出函数的性质?导出格式也是暂时的.PDF可以让位于*.docs/csvs/xmls等.
对此有所了解会很棒.
谢谢
您可以将要对文档执行的操作封装在处理程序中。这还允许您将来定义可以传递给现有代码的新处理程序。
interface DocumentHandler {
void process(Document d);
}
class ExportToPdf implements DocumentHandler { ... }
class AppendToParentPdf implements DocumentHandler { ... }
// Now you're just passing the interface whose implementation does something with the document
void handleDocument(DocumentHandler parentHandler, DocumentHandler childHandler) {
for(Document parent : documents) {
parentHandler.process(parent);
for(Document child : parent.children()) {
childHandler.process(child);
}
}
}
DocumentHandler appendToParent = new AppendToParentPdf();
DocumentHandler exportToPdf = new ExportToPdf();
// pass the child/parent handlers as needed
handleDocument(exportToPdf, appendToParent);
handleDocument(exportToPdf, exportToPdf);
Run Code Online (Sandbox Code Playgroud)
至于效率,我想说除非遇到性能问题,否则不要尝试优化。无论如何,问题不在于嵌套循环,而在于处理文档的逻辑本身。