Diciamo che ho una struttura di oggetti come questa che importerò i dati da una fonte:
Reporting:
Body:
ReportingEntity:
DocSpec
Reports[]:
ConstEntities[]
DocSpec
AdditionalInfo[]
DocSpec
MessageSpec
Ogni volta che importa i dati devo controllare le modifiche in qualsiasi oggetto e aggiornare gli oggetti DocSpec in base al tipo di modifica ( no change
, correction
, added data
, removed data
). Quindi devo dividere l'oggetto e filtrare i dati correction
e removed
in un oggetto e filtrare added data
in un secondo oggetto. Ognuno di essi verrà scritto nel proprio file XML e inviato a un'autorità.
A prima vista sembra una grande opportunità per usare il pattern Visitor per UpdateReportingVisitor
e FilterReportingVisitor
, ma vedo anche una grande differenza qui: un visitatore attraversa solo una struttura di oggetti e fa le sue operazioni su di essa. Non funziona su un secondo oggetto contemporaneamente. Un metodo accept()
per UpdateReportingVisitor
sarà simile a questo:
class Body(object):
def accept(self, visitor, other):
"""rough draft to communicate the concept. This is not the actual implementation!"""
visitor.visit_body(self, other)
for self_report, other_report in zip(self.reports, other.reports):
self_report.accept(visitor, other_report)
for self_info, other_info in zip(self.additional_infos, other.additional_infos):
self_info.accept(visitor, other_info)
mentre FilterReportingVisitor
non avrebbe bisogno di quell'argomento extra.
Sono un po 'a disagio con questa soluzione a causa dell'argomento other
in ogni metodo accept()
che chiaramente non appartiene al modello. Questo approccio sarebbe ancora considerato un modello di visitatore? (Se no: ha un nome diverso?) C'è un diverso (migliore?) Schema per risolvere il problema che ho?