Ecco il mio problema: voglio leggere input da diversi dispositivi HID come un gamepad, gareggiare bene, joystick, ecc. Praticamente qualsiasi controller di gioco. Il problema è che hanno tutti input diversi.
Il gamepad ha pulsanti, interruttori e stick mentre il racing potrebbe avere una leva del cambio. Sono riuscito ad astrarre tutti questi diversi componenti in soli 3 così invece di avere una classe base con tutte le possibili combinazioni:
abstract class Device
{
public Buttons Buttons;
public Axes Axes;
public Switches Switches;
public GearSticks GearSticks;
//many more
}
Ora posso avere:
abstract class Device
{
public Buttons Buttons; //on or off
public Axes Axes; //range [-100%:100%]
public Switches Switches; //multiple states
}
All'inizio ero contento di questo dato che sembrava coprire tutti i possibili tipi di input e quindi la mia classe può rimanere chiusa pur essendo aperta all'estensione attraverso tutte le implementazioni concrete poiché tutto può essere astratto a soli 3 tipi di input.
MA allora mi sono detto per me stesso se stavo solo ritardando l'inevitabile? Cosa succede se un giorno dovrò aggiungere un altro campo alla mia classe Device
? Non supporta qualcosa come una trackball!
C'è un modo in cui posso rendere questa lezione in futuro? Per come la vedo, mi ritrovo con qualcosa di simile:
public Device1 : Device
{
//buttons
//trackball
}
public Device2 : Device
{
//Switch
//Axis
}
public Device3 : Device
{
//trackball
//switch
}
E dovrei continuare ad aggiungere proprietà alla mia classe base ogni volta che c'è qualcosa di nuovo da implementare.