Attraversando due strutture di oggetti simili usando un modello

2

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?

    
posta Tekay37 02.08.2018 - 11:08
fonte

1 risposta

1

La tua accettazione sembra associare strettamente i bambini alla loro posizione. Non sono sicuro che sia ciò che vuoi veramente. Può comportarsi inaspettatamente se un bambino è inserito in mezzo. Sembra che non sia possibile astrarre l'attività specifica dall'implementazione di accept, se si va in questo modo.

C'è un modo alternativo per definire i visitatori, che lascia discendere i bambini al visitatore. In questo modo, hai un controllo molto più preciso su come attraversi la struttura dei dati. È possibile elaborare il nodo prima di visitare i bambini o dopo. Oppure, come nel tuo caso, attraversa 2 tipi di dati in parallelo, astraendo la logica specifica dalla classe - ad esempio, puoi cercare i bambini corrispondenti nell'elenco. Ciò, tuttavia, richiederebbe la creazione di un numero elevato di classi di visitatori per l'invio, all'incirca tanti come i tipi di nodi, più uno per il primo invio di argomenti. È un bel po 'di scrittura, quindi non posso fornirti un esempio adesso.

    
risposta data 03.08.2018 - 07:18
fonte