Come "chiudi" dovrebbe essere una classe / logica IO per un modulo o thread che controlla il dispositivo IO?

2

Sto avendo difficoltà a determinare dove dovrebbe trovarsi la mia logica IO all'interno della mia applicazione. In questa applicazione ci sono più IO Device sia USB che seriali. Al momento ho l'idea di separare la comunicazione con i dispositivi dalle loro forme di controllo e thread di controllo; vale a dire fare clic su un pulsante su un modulo e il dispositivo fa qualcosa o alcune serie di azioni porta a un thread non-UI che comanda il dispositivo.

Ho iniziato a lavorare con i dispositivi seriali. Quindi ho prima scritto una classe RS232Comm che avvolge la classe System.IO.Ports.SerialPort in qualcosa di bello e sicuro ( lock sulle routine Read e Write ) in modo che più thread possano accedere al dispositivo simultaneamente.

Da qui ho in programma di sottoclasse da RS232Comm per ogni dispositivo seriale, tutte le sottoclassi saranno oggetti singleton che costringono tutte le comunicazioni a passare attraverso il singleton.

Il mio attuale problema è dove dovrebbe essere la logica su come agisce il dispositivo e il suo stato? Fondamentalmente, se voglio interrogare un dispositivo per il suo stato attuale, lo stato dovrebbe essere contenuto in qualche oggetto ed essere passato in giro ad ogni classe di controllo (possibilmente un evento NewStateObject )? Quando una classe di controllo vuole inviare un comando al dispositivo, dovrebbe controllare l'input prima di chiamare il singleton, o il singleton dovrebbe controllare l'input prima di scrivere sulla porta seriale?

Mi sembra che abbia più senso che il singleton verifichi l'input e l'output per gli errori insieme al mantenimento dell'oggetto oggetto dei dispositivi. In questo modo il codice non è duplicato nelle classi di controllo. Ma sento che questo farà davvero ingrassare le classi Singleton a centinaia di linee.

Al di fuori dello scopo del mio progetto, se dovessi avere solo una corrispondenza 1 o 1 o una classe IO per controllare la forma / logica, avrebbe più senso fonderli in una classe che "fa tutto" per quello dispositivo?

    
posta KDecker 30.07.2015 - 18:00
fonte

1 risposta

1

Probabilmente vorrai più livelli intermedi. Uno per bloccare o accodare un livello transazionale , in modo che un dispositivo possa essere dedicato a un chiamante per più richieste sequenziali e risposte che non devono essere interrotte. E uno per il dispositivo da un livello di applicazione. Ad esempio, se stai parlando a una matrice LED, l'API di questo livello sarebbe in termini di impostazione o interrogazione dello stato dei singoli pixel. A seconda della tua applicazione, potresti volere degli strati aggiuntivi sopra per aggregare il comportamento comune di diversi dispositivi.

Resisti all'impulso di rendere le tue classi troppo grandi, specialmente sul codice specifico dell'hardware. Vuoi che il codice specifico per l'hardware sia il più piccolo e isolato possibile.

    
risposta data 30.07.2015 - 18:52
fonte

Leggi altre domande sui tag