Attualmente sto imparando ad applicare l'SRP e il codice di disaccoppiamento. Ma ho scoperto che avere un sacco di piccole classi fa esplodere i costruttori delle mie classi. E sembra un codice che usa un altro modulo della mia applicazione per conoscere più di quel modulo di quanto mi piacerebbe conoscerlo.
Ho scoperto che molti libri menzionano che le classi dovrebbero essere veramente piccole, ma non come gestire la quantità di piccole classi.
Supponiamo che abbia un modulo nella mia applicazione che riguarda il casting di contenuti su un dispositivo remoto (come il Chromecast).
Ora ho cercato di separare le mie responsabilità il più possibile.
C'è un CastErrorEventDispatcher
, CastSessionHelper
, CastRequestSender
, CastConnectivityHelper
e molti altri ancora.
Ora le altre parti della mia applicazione hanno bisogno di accedere a diversi oggetti del mio modulo di cast. Alcuni hanno bisogno solo di una classe di cui altri potrebbero aver bisogno 4. Questo sicuramente fa esplodere i costruttori.
come questo:
public class ExpandedControlsPresenter(){
public ExpandedControlsPresenter(CastRequestSender castRequestSender,
CastConnectivitySender castConnectivitySender,
CastBreakEventDispatcher castBreakEventDispatcher, ...){
...
}
public void setUp(){
castBreakEventDispatcher.addListener(...);
castRequestSender.addListener(...);
}
}
Questo mi riguarda perché ora il mio presentatore deve sapere tante cose sulle lezioni di casting.
Quindi mi chiedo se sarebbe meglio nascondere l'intero modulo di cast dietro a un grande delegatore.
public class CastManager {
//Constructor with all relevant cast classes
public void addBreakEventListener(CastBreakEventListener listener){
castBreakEventDispatcher.addListener(listener);
}
}
E poi basta averlo nel mio presentatore
public class ExpandedControlsPresenter(){
public ExpandedControlsPresenter(CastManager castManager, ...){
...
}
public void setUp(){
castManager.addBreakEventListener(...);
castManager.addRequestSenderListener(...);
}
}
Questo ha il vantaggio di ottenere costruttori più piccoli e posso attivare e disattivare la funzione di casting semplicemente interagendo con CastManager
. Ma se ovviamente la CastManager
diventerebbe incredibilmente enorme.
C'è un buon modo per affrontare questo problema?
Modifica
Ho disegnato un diagramma veloce per sperare di chiarire le mie intenzioni. Voglio anche dire che so che manager
non è un buon nome.