Aqui está o meu problema: eu quero ler as entradas de diferentes dispositivos HID, como um gamepad, corridas bem, joystick, etc. Praticamente qualquer controlador de jogo. A questão é que todos eles têm entradas diferentes.
O gamepad possui botões, interruptores e manípulos, enquanto o poço de corrida pode ter um manípulo. Consegui abstrair todos esses componentes diferentes em apenas 3, em vez de ter uma classe base com todas as combinações possíveis:
abstract class Device
{
public Buttons Buttons;
public Axes Axes;
public Switches Switches;
public GearSticks GearSticks;
//many more
}
Agora posso ter:
abstract class Device
{
public Buttons Buttons; //on or off
public Axes Axes; //range [-100%:100%]
public Switches Switches; //multiple states
}
No começo, fiquei feliz com isso, pois parecia cobrir todos os tipos possíveis de entrada e, portanto, minha classe pode permanecer fechada enquanto aberta à extensão através de todas as implementações concretas, pois tudo pode ser abstraído para apenas 3 tipos de entrada.
MAS então eu pensei comigo mesmo e se eu apenas estivesse atrasando o inevitável? E se um dia eu tiver que adicionar outro campo à minha Device
turma? Não suporta algo como um trackball!
Existe uma maneira de eu poder provar essa classe no futuro? Do jeito que eu vejo, eu terminaria com algo assim:
public Device1 : Device
{
//buttons
//trackball
}
public Device2 : Device
{
//Switch
//Axis
}
public Device3 : Device
{
//trackball
//switch
}
E eu teria que continuar adicionando propriedades à minha classe base sempre que houver algo novo para implementar.
parameter1=value1¶meter2=value2
, etc.