Я створюю об’єктну модель для пристрою, який має кілька каналів. Іменники, що вживаються між клієнтом і мною, є Channel
і ChannelSet
. ("Набір" не є семантично точним, оскільки він впорядкований, а правильний набір - не. Але це проблема в інший час.)
Я використовую C #. Ось приклад використання 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
Все денді. Однак клієнти не є програмістами, і їх абсолютно збиває з пантелику нульова індексація - перший канал для них - канал 1. Але, для узгодженості з C #, я хочу тримати ChannelSet
індексування від нуля .
Це обов'язково може призвести до відключення між моєю командою розробників та клієнтами, коли вони взаємодіють. Але що ще гірше, будь-яка невідповідність того, як це обробляється в кодовій базі, є потенційною проблемою. Наприклад, ось екран інтерфейсу користувача, де кінцевий користувач ( який думає з точки зору 1 індексації ) редагує канал 13:
Ця Save
кнопка в кінцевому підсумку призведе до деякого коду. Якщо ChannelSet
індексовано 1:
channels.GetChannel(13).SomeProperty = newValue; // notice: 13
або це, якщо він індексується нулем:
channels.GetChannel(12).SomeProperty = newValue; // notice: 12
Я не дуже впевнений, як з цим впоратися. Я відчуваю, що є хорошою практикою зберігати впорядкований цілочисельний список речей ( ChannelSet
), який відповідає всім іншим інтерфейсам масиву та списку у всесвіті C # (за нульовою індексуванням ChannelSet
). Але тоді кожен фрагмент коду між користувальницьким інтерфейсом та бекендером потребуватиме перекладу (віднімаємо на 1), і всі ми знаємо, наскільки вже є підступні та поширені помилки один за одним.
Отже, чи колись таке укусило вас таке рішення? Чи повинен я нульовий індекс або один індекс?