È accettabile che il visitatore cambi lo stato dell'oggetto in cui opera? Questo tipo di operazione non è considerato come anti-pattern?Modello visitatore: modifica lo stato dell'oggetto?
risposta
È assolutamente necessario modificare gli oggetti visitati.
Assicurati solo che la classe visitatore sia denominata in modo appropriato, quindi è ovvio che ha un effetto collaterale.
Un esempio potrebbe essere un visitatore che visita ogni nodo (mostro, torre, qualsiasi cosa) e aumenta la forza (sto pensando a un gioco qui) a caso tra il 25% e il 50%. Quello è un visitatore valido che muta ciò che visita. – mawalker
Fintantoché il visitatore utilizza solo l'interfaccia pubblica e nessuno dei metodi di interfaccia consente al visitatore di mettere l'oggetto in uno stato non valido. Il visitatore è libero di cambiare lo stato dell'oggetto visitato.
Come hanno già detto le altre risposte, non c'è anti-pattern nel mutare l'oggetto durante la sua visita; ma come con tutti gli stati mutabili, bisogna fare attenzione negli scenari multi-thread. Assicurati che nessun altro thread stia mutando l'oggetto nello stesso momento del visitatore, oppure assicurati che la sincronizzazione sia corretta.
Poiché il visitatore utilizza l'oggetto, può accedere a qualsiasi metodo e proprietà pubblici. Quindi spetta a te impostare l'incapsulamento obbligatorio dell'oggetto. Il visitatore dovrebbe essere in grado sia di accedere alle proprietà di sola lettura per visualizzare qualcosa o raccogliere informazioni, sia di modificare lo stato dell'oggetto tramite chiamata di un metodo pubblico come MarkVisited() o Init(). Sembra un carico utile per il visitatore –
È utile quando non si dispone del codice sorgente delle classi di terze parti. È possibile dichiarare metodi in Visitor e aggiungere un'operazione comune, che si estende su più oggetti correlati –