Sto creando un modello a oggetti per un dispositivo con più canali. I nomi usati tra il cliente e io sono Channel
e ChannelSet
. ("Set" non è semanticamente accurato, perché è ordinato e non è un set corretto. Ma questo è un problema per un altro tempo.)
Sto usando C #. Ecco un esempio di utilizzo di ChannelSet
:
// load a 5-channel ChannelSet
ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json");
Console.Write(channels.Count);
// -> 5
foreach (Channel channel in channels) {
Console.Write(channel.Average);
Console.Write(", ");
}
// -> 0.3, 0.3, 0.9, 0.1, 0.2
Tutto è dandy. Tuttavia, i client non sono programmatori e saranno assolutamente confusi dall'indicizzazione zero: il primo canale è il canale 1 per loro. Ma, per coerenza con C #, voglio mantenere l' ChannelSet
indicizzato da zero .
Questo sicuramente causerà alcune disconnessioni tra il mio team di sviluppo e i client quando interagiscono. Ma peggio, qualsiasi incoerenza nel modo in cui questo viene gestito all'interno della base di codice è un potenziale problema. Ad esempio, ecco una schermata dell'interfaccia utente in cui l'utente finale ( che pensa in termini di 1 indicizzazione ) sta modificando il canale 13:
Save
Alla fine quel pulsante genererà del codice. Se ChannelSet
è 1 indicizzato:
channels.GetChannel(13).SomeProperty = newValue; // notice: 13
o questo se è indicizzato zero:
channels.GetChannel(12).SomeProperty = newValue; // notice: 12
Non sono davvero sicuro di come gestirlo. Sento che è buona prassi mantenere un elenco di cose ordinate e indicizzate per intero (le ChannelSet
) coerenti con tutte le altre interfacce di array e liste nell'universo C # (a zero indicizzazione ChannelSet
). Ma poi ogni parte di codice tra l'interfaccia utente e il backend avrà bisogno di una traduzione (sottrazione per 1) e sappiamo tutti quanto siano già insidiosi e comuni errori off-by-one.
Quindi, una decisione come questa ti ha mai morso? Devo zero indice o un indice?