È un buon modello che nessun oggetto dovrebbe sapere più di quello che deve sapere?

4

Sto implementando una classe controller per gestire una vista. Ho una classe di uploader di file, Grabber, che può comunicare in uno dei 2 modi:

1) Offri qualche tipo di evento di notifica al controller all'avvio e alla fine del caricamento

2) Fornire una proprietà su Grabber che indica true o false se il caricamento è completato

Sono preoccupato che con l'opzione 2) sto introducendo una dipendenza tra il controller e il Grabber.

Qual è il design migliore qui?

    
posta user4951 30.05.2012 - 17:54
fonte

2 risposte

6

Sì, è un buon modello, infatti è la base della maggior parte dei modelli ed è chiamato accoppiamento libero

questo renderà più semplice in generale la necessità di modificare la classe Grabbing in futuro: ad esempio quando si desidera notificare al viewcontroller un errore verificatosi durante il caricamento, con gli eventi si definisce un evento di errore da trasmettere al controller della vista, mentre altrimenti dovresti avere una seconda proprietà che contiene solo un valore significativo quando grabbing.isDone() restituisce true.

anche in questo caso impedisce al pattern di ciclo occupato di controllare ripetutamente la proprietà per vedere se cambia prima di passare

    
risposta data 30.05.2012 - 18:08
fonte
3

Questo sembra essere un caso classico del osservatore modello

Pertanto, ti suggerisco di implementare un GrabEvent che contenga lo stato per indicare se si tratta di un evento di inizio, fine o errore. Il Grabber invia quindi queste istanze GrabberEvent a chiunque si sia registrato come GrabberListener (o GrabberObserver ).

Tuttavia, è necessario assicurarsi che gli ascoltatori siano disaccoppiati dal thread del provider di eventi ( Grabber ). Altrimenti, il tuo gestore di eventi Grabber finirà per chiamare le istanze GrabberListener e aggiornare il loro stato in un thread separato che potrebbe introdurre incongruenze e scarse prestazioni se le implementazioni di quegli ascoltatori sono fuori dal tuo controllo.

In Java, un buon modo per disaccoppiare i consumatori dai provider è utilizzare un BlockingQueue in modo che ogni estremità della coda venga eseguita in una propria discussione.

    
risposta data 30.05.2012 - 18:12
fonte

Leggi altre domande sui tag