La classe dipende da troppe classi

3

Sto sviluppando un'app per iOS e mi sto spostando su un'architettura simile a VIPER. Assomiglia a questo:

Visualizza - ViewModel - Router - ViewModel - Visualizza

La differenza dal VIPER è che ho un Router globale invece di molti Wireframes (è motivato dalla funzionalità dell'app: quasi tutto può essere aperto da qualsiasi luogo). Il router contiene assemblatori per schermi diversi, nonché menu e controller di navigazione. Il problema è che l'app è abbastanza grande e il router viene iniettato con troppi argomenti. Il suo costruttore ha questo aspetto

struct RouterImpl: Router {

    /* ... */

    init(window: UIWindow,
         mainNavigationController: MainNavigationController,
         menuNavigationController: UISideMenuNavigationController,
         menuViewControllerFactory: MenuViewControllerFactory,
         splashScreenControllerFactory: SplashScreenFactory,
         mainViewControllerFactory: MainViewControllerFactory,
         webViewControllerFactory: WebViewControllerFactory,
         locationPickingViewControllerFactory: LocationPickingViewControllerFactory,
         cartViewControllerFactory: CartViewControllerFactory,
         productScreenAssembler: ProductScreenAssembler,
         personalAreaOrderItemsAssembler: PersonalAreaOrderItemsAssebler)

}

Dove l'assemblatore è qualcosa che ha vista e visualizza le fabbriche diModel e le unisce per creare un'unica schermata.

Se è già molto più grande di quanto dovrebbe essere, sarà ancora più grande se sarà finito con lo stesso design. Cosa posso fare per semplificare o perlomeno migliorare il suo costruttore?

    
posta charlag 05.10.2016 - 14:26
fonte

1 risposta

1

Come Laiv ha detto che avrei optato per una sottoscrizione se volessi davvero cambiarlo.

Tuttavia, se si desidera mantenere il controller totalmente indipendente dal router, sarà necessario incollare un po 'di colla.

Ad esempio:

//module / namespace router 

class RouterImpl implements Router {
    registerRoute(string path, IController controller);
    navigateTo(string path);
} 
// declare a singleton RouterImpl, either here hardcoded or use dependency injection

 // module with controller
 class Controller implements IController{

 }

 // either in controller or in another class that is doing the glue

 Router router = getInstance();// get the instance of the singleton router either using static instance of dependency injection
 router.registerRoute('myRoute', new Controller());

Questo esempio è solo pseudo codice in quanto non conosco la sintassi esatta della tua lingua.

Questo è il modo in cui i router basati su URLS funzionano nel web, ma anche se non sei nel web, puoi perfettamente avere qualcosa di simile nella tua applicazione.

Per ulteriori approfondimenti penso che puoi verificare come funziona il routing angularJS (vedi Controller capitolo). Un altro esempio è ui-router angolare funziona in base allo stato, consentendo l'inserimento di nidificatori e così via, ma per il tuo caso potrebbe essere eccessivo (e più difficile da sviluppare), ma è comunque interessante vedere come è stato progettato.

    
risposta data 06.10.2016 - 09:07
fonte

Leggi altre domande sui tag