Sto creando un modello a oggetti per un dispositivo che ha più canali. I nomi usati tra il client e I sono Channel
e ChannelSet
. ("Set" non è semanticamente preciso, perché è ordinato e non è un set corretto, ma questo è un problema per un tempo diverso.)
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 assolutamente saranno confusi dall'indicizzazione zero: il primo canale è il canale 1. Ma, per coerenza con C #, voglio mantenere il ChannelSet
indicizzato da zero .
Questo sicuramente causerà alcune disconnessioni tra il mio team di sviluppo ei client quando interagiscono. Ma peggio ancora, qualsiasi incongruenza nel modo in cui questo viene gestito all'interno del codebase è 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:
Il pulsante Save
alla fine produrrà un certo codice. Se ChannelSet
è 1 indicizzato:
channels.GetChannel(13).SomeProperty = newValue; // notice: 13
o questo se è indicizzato a zero:
channels.GetChannel(12).SomeProperty = newValue; // notice: 12
Non sono sicuro di come gestirlo. Ritengo che sia una buona pratica mantenere un elenco di cose ordinato, con indice intero (il ChannelSet
) coerente con tutte le altre interfacce di matrice ed elenco nell'universo C # (indicizzando zero ChannelSet
). Ma poi ogni pezzo di codice tra l'interfaccia utente e il back-end avrà bisogno di una traduzione (sottrazione di 1), e sappiamo tutti quanto siano già insidiosi e comuni gli errori di off-by-one.
Quindi, una decisione del genere ti ha mai morso? Dovrei azzerare l'indice o un indice?