Tworzę model obiektowy dla urządzenia, które ma wiele kanałów. Rzeczowniki używane między klientem a mną to Channel
i ChannelSet
. („Zestaw” nie jest semantycznie dokładny, ponieważ jest uporządkowany, a prawidłowy zestaw nie. Ale to problem na inny czas.)
Używam C #. Oto przykład użycia 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
Wszystko jest eleganckie. Jednak klienci nie są programistami i absolutnie będą myleni przez indeksowanie zerowe - pierwszy kanał to dla nich kanał 1. Ale ze względu na spójność z C # chcę utrzymać ChannelSet
indeksowanie od zera .
To z pewnością spowoduje pewne rozłączenia między moim zespołem deweloperów a klientami podczas interakcji. Co gorsza, każda niespójność w sposobie postępowania w bazie kodu jest potencjalnym problemem. Oto na przykład ekran interfejsu użytkownika, na którym użytkownik końcowy ( który myśli o indeksowaniu 1 ) edytuje kanał 13:
Ten Save
przycisk ostatecznie spowoduje powstanie kodu. Jeśli ChannelSet
indeksowany jest 1:
channels.GetChannel(13).SomeProperty = newValue; // notice: 13
lub jeśli indeks jest zerowy:
channels.GetChannel(12).SomeProperty = newValue; // notice: 12
Nie jestem pewien, jak sobie z tym poradzić. Wydaje mi się, że dobrą praktyką jest utrzymywanie uporządkowanej, indeksowanej liczbami całkowitymi listy rzeczy (the ChannelSet
) zgodnych ze wszystkimi innymi interfejsami tablicowymi i listowymi we wszechświecie C # (przez indeksowanie zerowe ChannelSet
). Ale wtedy każdy fragment kodu między interfejsem użytkownika a backendem będzie wymagał tłumaczenia (odejmij 1), a wszyscy wiemy, jak podstępne i powszechne są już błędy podstępne.
Czy taka decyzja kiedykolwiek cię ugryzła? Czy powinienem zerować indeks czy jeden indeks?