Diciamo che ho una classe di entità ListOfItems
con molte entità correlate Item
. Questi elementi vengono elaborati in una classe ItemsProcessor
che incapsula il comportamento. Questa classe ha diverse liste di controllo e variabili, ad esempio una lista processed_items
. Ogni volta che un elemento viene elaborato, viene aggiunto all'elenco:
class ItemsProcessor:
def __init__(self, list_of_items):
self.items = list_of_items.items
self.processed_items = []
def process(self):
for item in self.items:
if self._process_item(item):
self.processed_items.append(item)
Ma ora diciamo che abbiamo una classe secondaria ItemsProcessorAlt
che incapsula un'ulteriore elaborazione. Ha bisogno di un riferimento a ItemsProcessor
perché mantiene lo stato del processo, tra gli altri dati che usa:
class ItemsProcessorAlt:
def __init__(self, processor):
self.parent_processor = processor
def process(self):
for item in self.parent_processor.items:
self._process_item_alt(item)
E questo è il modo in cui il processore principale userebbe quello alternativo:
class ItemProcessor:
def process(self):
# process all items as shown above
if self._corrupt_items():
subprocessor = ItemsProcessorAlt(self)
subprocessor.process()
Ora, quando un oggetto viene elaborato da quest'ultima classe, lo stato del processo deve essere aggiornato, ovvero l'elenco processed_items
. Di chi è la responsabilità di aggiornare questo stato?:
- Dovrebbe
ItemsProcessorAlt.process()
aggiornare questi elenchi direttamente? - Dovrebbe ItemProcessor
define a method to update the state and then
ItemsProcessorAlt.process () 'chiamarlo? - Dovrebbe
ItemsProcessorAlt.process()
avere un valore di ritorno che suggerisce al processore principale come deve essere aggiornato lo stato? - Dovrebbe
ItemsProcessorAlt
impostare uno stato da solo in modo che quando il sottoprocesso è finito il processore principale aggiorni il suo stato basandosi su quello?
Si noti che il subprocessore sta usando variabili che giacciono nel processore principale e stanno cambiando mentre il processo / sottoprocesso viene eseguito.