Sto cercando di implementare il Clean Architecture descritto da Robert Martin. In particolare sto usando VIPER che è una versione iOS di Clean Architecture.Architettura pulita - Robert Martin - Come collegare casi d'uso
Il problema che ho è la seguente:
L'utente inizia guardando una mappa con i luoghi (pin) su di esso. Se fa clic su un pulsante, viene rimosso un pin e viene portato a un'altra vista per creare (o modificare se si tratta di un clic su un pin esistente) il luogo (o annullare). In questa altra vista, l'utente può modificare le informazioni del luogo e quindi fare clic su "Indietro" o "Fatto" (o "Modifica"). Se fa clic su "done", PlaceDetailsViewController invia un messaggio a PlaceDetailsPresenter con le informazioni sul luogo e PlaceDetailsPresenter utilizza CreatePlaceInteractor per creare il luogo. Questo interactor restituisce il GUID che viene utilizzato per identificare il luogo.
Se l'utente fa clic indietro prima di creare il luogo, torna alla mappa e il pin rilasciato va su e giù (poiché non ha GUID, è un nuovo posto e va via). Se fa clic indietro dopo la creazione, il pin rimane lì (perché dovrebbe avere un GUID).
Come devo collegare tutto questo e dove devono essere memorizzate le informazioni sul luogo (incluso GUID)? Per chiarire un po 'di più:
- Chi dovrebbe informare il MapPresenter che il perno rimane lì o se ne va? È PlaceDetailsPresenter o devo passare queste informazioni a PlaceDetailsWireframe -> MapWireframe -> MapPresenter -> MapView?
- Prima di tornare indietro, dove dovrebbe essere memorizzato questo GUID, in PlaceDetailsPresenter o in PlaceDetailsViewController?
Proprio ora che è quello che ho:
EDIT:
Fondamentalmente penso che il problema è che VIPER è venuto da Robert Martin Clean Architettura e proviene da una Web (Rails) di fondo, quindi non pensa molto allo stato (o non lo specifica nei suoi discorsi).
Quale è principalmente la mia domanda, dove dovrebbe essere memorizzato lo stato, come dovrebbero comunicare i diversi moduli, se attraverso il Wireframe, o attraverso il database, o attraverso gli Interpreti, o attraverso i Presentatori che comunicano tra loro come qui https://github.com/objcio/issue-13-viper-swift.
Sono appena all'inizio con VIPER ma mi sembra sbagliato avere i presentatori che conoscono l'un l'altro. Sono favorevole ai moduli che comunicano tra loro tramite Wireframe/Router. Sono felice di essere corretto qui mentre sto ancora imparando questa architettura. – bennythemink
Tendo a pensare nello stesso modo in cui lo fai tu, anche se non ho ancora trovato una risposta decisiva su come passare le informazioni tra loro, se è meglio passare le strutture dati attraverso i wireframe (2 opzioni qui, usa sempre la stessa, grande, struttura dei dati, o continuare a cambiare lungo il percorso per passare solo la quantità minima di informazioni necessarie (che finisce per creare più classi non riutilizzabili)), o salvare lo stato in Interactor e usarle per recuperare le informazioni nell'altro presentatore. Ho pubblicato un'altra domanda StackOverflow che spiega cosa intendo per struttura dei big data, ma non ho potuto ancora trovarla. –
http://stackoverflow.com/questions/29054526/viper-should-the-interactor-return-only-the-necessible-information –