Il tuo pensiero è ancora troppo basso. Stai cercando un modo migliore per dire cose come "Qual è il valore di O2 rilevato da O2 Sensor # 2?" Ma perché hai bisogno di sapere quel valore? Che cosa hai intenzione di fare in base al valore?
Se vuoi solo un involucro un po 'meno ingombrante, certo, scrivilo. Ma se vuoi un vero linguaggio specifico per il dominio, devi iniziare a pensare a un livello molto più alto. Devi anche prendere in considerazione la creazione di oggetti che sono più capaci.
Supponiamo che tu debba mostrare un avviso se il livello di O2 è troppo basso. Semplice:
if (new Controller().O2Sensors[1].Value < 30)
MessageBox.Show("The canary has died.");
Semplice, ma non buono. Per ottenere la progettazione OO più flessibile, devi dire agli oggetti cosa fare piuttosto che eseguirne una query :
new Controller().ShowAlertIfMainOxygenLevelTooLow();
Quindi il Controller
stesso sa quale sensore di ossigeno è il principale e sa cosa significa "troppo basso".
Ma cosa succede se "troppo basso" differisce dall'ambiente? Forse il tuo controller potrebbe essere usato su una stazione spaziale, e l'ambiente O2 è più ricco, e anche una piccola goccia indica problemi. In tal caso, dovresti costruire il tuo Controller
con una strategia appropriata, ad esempio:
public class Controller
{
public Controller(IOxygenLevelDetector oxygenLevelDetector)
{
[...]
}
}
L'interfaccia IOxygenLevelDetector
potrebbe avere un metodo che accetta il sensore O2, legge il livello O2 corrente e restituisce un bool
che indica se il livello è troppo basso o se il livello è in uno stato di successo o di errore. ..qualunque abbia più senso per te. Costruisci il tuo Controller
con l'ambiente appropriato:
new Controller(new SpaceStation())
o
new Controller(new RoomOnEarth())
Naturalmente, ad un certo punto stai ancora leggendo il livello di ossigeno e poi facendo qualcosa. Come fai a sapere quando è il posto sbagliato per farlo? Una buona regola è quella di minimizzare i punti . Qualcosa di simile
new ServiceBoard().Controllers[5].O2Sensors[1].OxygenGauge.Value
è troppi punti. ServiceBoard ha troppa visibilità all'interno di molti altri oggetti. Tutto quello che dovrebbe fare è andare su un livello: dire a Controller
di fare qualcosa, e aspettare la risposta. Il Controller
, a sua volta, dovrebbe dire a O2Sensor
di fare qualcosa, e dovrebbe aspettare la risposta. In questo modo, anche quando devi apportare modifiche, eviti di farle ondeggiare lungo l'intero programma.