Penso che "info" sia un termine improprio. Gli oggetti hanno stato e azioni: "info" è solo un altro nome per "stato" che è già inserito in OOP.
Che cosa realmente sta cercando di modellare qui? Hai bisogno di un oggetto che rappresenti l'hardware nel software in modo che possa essere utilizzato da un altro codice.
È facile da dire ma, come hai scoperto, c'è dell'altro. "Rappresentare l'hardware" è sorprendentemente ampio. Un oggetto che lo fa ha diverse preoccupazioni:
- Comunicazione dispositivo di basso livello, sia che si tratti di interfaccia USB, una porta seriale, TCP / IP o connessione proprietaria.
- Gestione dello stato. Il dispositivo è acceso? Pronto a parlare con il software? Occupato?
- Gestione degli eventi. Il dispositivo ha prodotto i dati: ora abbiamo bisogno di generare eventi per passare ad altre classi che sono interessate.
Alcuni dispositivi, ad esempio i sensori, avranno meno preoccupazioni rispetto a un dispositivo multifunzione stampante / scanner / fax. Un sensore probabilmente produce solo un flusso di bit, mentre un dispositivo complesso può avere protocolli e interazioni complessi.
In ogni caso, tornando alla tua domanda specifica, ci sono diversi modi per farlo a seconda delle tue esigenze specifiche e della complessità dell'interazione hardware.
Ecco un esempio di come progetterei la gerarchia di classi per un sensore di temperatura:
-
ITemperatureSource: interfaccia che rappresenta tutto ciò che può produrre dati di temperatura: un sensore, potrebbe anche essere un file wrapper o dati codificati (pensa: test di simulazione).
-
Acme4680Sensore: sensore modello ACME 4680 (ottimo per rilevare quando il Roadrunner si trova nelle vicinanze). Questo può implementare più interfacce: forse questo sensore rileva sia la temperatura che l'umidità. Questo oggetto contiene lo stato a livello di programma come "il sensore è collegato?" e "quale era l'ultima lettura?"
-
Acme4680SensorComm: usato esclusivamente per comunicare con il dispositivo fisico. Non mantiene molto stato. Viene utilizzato per inviare e ricevere messaggi. Ha un metodo C # per ciascuno dei messaggi che l'hardware comprende.
-
HardwareManager: utilizzato per ottenere dispositivi. Questo è essenzialmente un factory che memorizza le istanze nella cache: dovrebbe esserci solo un'istanza di un oggetto device per ogni dispositivo hardware. Deve essere abbastanza intelligente da sapere che se il thread A richiede il sensore di temperatura ACME e il thread B richiede il sensore di umidità ACME, questi sono in realtà lo stesso oggetto e devono essere restituiti a entrambi i thread.
Al livello più alto avrai interfacce per ogni tipo di hardware. Descrivono le azioni che il tuo codice C # avrebbe intrapreso sui dispositivi, utilizzando i tipi di dati C # (non ad esempio gli array di byte che potrebbero essere utilizzati dal driver di dispositivo raw).
Allo stesso livello hai una classe di enumerazione con un'istanza per ogni tipo di hardware. Il sensore di temperatura potrebbe essere di un tipo, il sensore di umidità un altro.
Un livello al di sotto di questo sono le classi effettive che implementano tali interfacce: rappresentano un dispositivo simile all'Acme4680Sensor che ho descritto sopra. Qualsiasi classe particolare può implementare più interfacce se il dispositivo può eseguire più funzioni.
Ogni classe di dispositivi ha la sua classe di comunicazione privata (comunicazione) che gestisce l'attività di basso livello di comunicazione con l'hardware.
Al di fuori del modulo hardware, l'unico livello visibile è l'interfaccia / enum più l'HardwareManager. La classe HardwareManager è l'astrazione di fabbrica che gestisce l'istanziazione delle classi di dispositivi, le istanze di cache (tu veramente non vuoi due classi di dispositivi che parlano allo stesso dispositivo hardware), ecc. Una classe che ha bisogno di un tipo particolare del sensore chiede all'HardwareManager di ottenere il dispositivo per l'enum particolare, che poi calcola se è già istanziato, se non come crearlo e inizializzarlo, ecc.
L'obiettivo qui è quello di disaccoppiare la logica aziendale dalla logica hardware di basso livello. Quando scrivi un codice che stampa i dati del sensore sullo schermo, a quel codice non dovrebbe importare quale tipo di sensore hai se e solo se questo disaccoppiamento è centrato su quelle interfacce hardware.
Nota: ci sono associazioni tra HardwareManager e ogni classe di dispositivi che non ho disegnato perché il diagramma si sarebbe trasformato in zuppa di frecce.