Mi sono imbattuto in un problema di questo tipo più di una volta e mi piacerebbe conoscere gli approcci consigliati per affrontarlo. In alternativa, mi piacerebbe sapere se ha un nome.
Per concretezza, supponiamo di avere un oggetto Colony, uno dei cui membri è una lista di oggetti Organism. Gli oggetti dell'organismo hanno un metodo di aggiornamento. In determinate condizioni, il comportamento desiderato al momento di chiamare Update è che l'organismo "si spacchi a metà" - cioè, per produrre due nuovi Organismi da inserire nella raccolta, e quindi per farsi rimuovere dalla raccolta e distruggere.
Per rendere le cose interessanti, diciamo che la raccolta è ordinata e vogliamo che i nuovi Organismi siano inseriti nello stesso punto in cui il vecchio Organismo era precedentemente occupato.
Inoltre diciamo che vogliamo fare un ciclo attraverso la raccolta di Organismi che chiamano Aggiornamento su ognuno, e vogliamo farlo in modo tale che Update non venga chiamato sugli Organismi appena creati.
Come variante, forse l'Organismo vuole mantenersi in vita ma inserire la sua prole nella collezione accanto ad essa.
Posso pensare ad alcuni modi per farlo con vari compromessi:
- Avere Aggiornamento restituisce un elenco di Organismi, sia esso stesso o un elenco di nuovi. Quindi fai in modo che il loop chiamante Update costruisca una nuova collezione da questi e sostituisca la vecchia collezione con essa alla fine.
- Pass Aggiorna alcuni (richiami / puntatori / qualsiasi altra cosa) permettendogli di inserire elementi nella raccolta in modo tale che l'indicatore (iteratore / indice loop / qualunque) venga spostato oltre di essi.
- Have Update comunica il suo desiderio di inserire nuovi oggetti nel ciclo chiamante e fa in modo che il codice chiamante si occupi dell'effettivo inserimento.
Ci sono altri modi ragionevoli per farlo? Ci sono vantaggi / svantaggi non ovvi per loro? Hanno nomi? Ci sono modi chiari per eseguirli automaticamente?