Tengo esta situación en la que tengo una relación padre-hijo entre dos conjuntos de datos. Tengo una colección de documentos principal y una colección de documentos secundarios. El requisito es que los padres y sus hijos correspondientes se exporten a 'un' documento pdf. Una simple aplicación de la situación anterior puede ser de la siguiente manera (por debajo de pseudo código java-ish):Refactorización anidada para bucles
for(Document parentDocument:Documents){
ExportToPdf(parentDocument);
for(Document childDocument:parentDocument.children()){
AppendToParentPdf(childDocument);
}
}
Algo que el anterior probablemente resolver el problema, pero, de repente, los cambios en los requerimientos y ahora cada uno de estos los padres y sus hijos correspondientes deben estar en archivos PDF separados, por lo que el fragmento dado anteriormente se modifica cambiando el AppendToParentPdf()
-ExportToPdf()
sigue:
for(Document parentDocument:Documents){
ExportToPdf(parentDocument);
for(Document childDocument:parentDocument.children()){
ExportToPdf(childDocument);
}
}
Yendo a lo largo de esta manera, no pasará mucho tiempo antes de que este fragmento aparentemente trivial haría sufren de algunos olores graves de código.
Mis preguntas a SO son:
¿Hay mejores representaciones de relaciones padre-hijo como el anterior donde en vez de fuerza bruta mi camino a través de todos los documentos y sus hijos de una manera
O(n^2)
, Puedo usar una estructura de datos o técnica diferente para recorrer toda la estructura de una manera más óptima.En el escenario que describí anteriormente, donde las reglas de negocio son bastante fluidas sobre la forma en que deberían exportarse los pdfs, ¿existe alguna forma más inteligente de codificar la naturaleza de la función de exportación? Además, el formato de exportación es transitorio. Los archivos PDF pueden dar paso a * .docs/csvs/xmls et al.
Será genial tener alguna perspectiva sobre esto.
Gracias
En cuanto a su primera pregunta, no se ve como si estuviera ataques de fuerza bruta, porque sólo se está recuperando parentDocument.Children para todos los padres y esto contiene la lista de todos los documentos de los niños para un padre en particular. Entonces su complejidad de tiempo no es o (n^2) sino más bien o (n + m) donde n y m son el recuento de los documentos padre e hijo, respectivamente. – Santhosh
@sc_ray Debe indicar si es posible que 'childDocument' tenga más de un' parentDocument'. – Alderath
@Santosh - No estoy seguro de cómo esto es un problema O (n + m) ya que el ciclo necesita iterar a través de cada uno de los m hijos n veces, dándole una complejidad temporal de O (n * m) u O (n^2). –