Tôi đang tạo một mô hình đối tượng cho một thiết bị có nhiều kênh. Các danh từ được sử dụng giữa khách hàng và tôi là Channel
và ChannelSet
. ("Đặt" không chính xác về mặt ngữ nghĩa, vì nó được đặt hàng và một bộ thích hợp không. Nhưng đó là một vấn đề trong một thời gian khác.)
Tôi đang sử dụng C #. Dưới đây là một ví dụ sử dụng của 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
Tất cả là dandy. Tuy nhiên, các khách hàng không phải là lập trình viên và họ hoàn toàn sẽ bị nhầm lẫn bởi việc lập chỉ mục bằng không - kênh đầu tiên là kênh 1 cho họ. Nhưng, để thống nhất với C #, tôi muốn giữ ChannelSet
chỉ số từ 0 .
Điều này chắc chắn sẽ gây ra một số ngắt kết nối giữa nhóm nhà phát triển của tôi và khách hàng khi họ tương tác. Nhưng tệ hơn, bất kỳ sự không nhất quán nào trong cách xử lý vấn đề này trong cơ sở mã là một vấn đề tiềm ẩn. Ví dụ: đây là màn hình UI nơi người dùng cuối ( người nghĩ theo chỉ mục 1 ) đang chỉnh sửa kênh 13:
Save
Nút đó cuối cùng sẽ dẫn đến một số mã. Nếu ChannelSet
là 1 chỉ mục:
channels.GetChannel(13).SomeProperty = newValue; // notice: 13
hoặc điều này nếu nó không được lập chỉ mục:
channels.GetChannel(12).SomeProperty = newValue; // notice: 12
Tôi không thực sự chắc chắn làm thế nào để xử lý việc này. Tôi cảm thấy như đó là một cách thực hành tốt để giữ một danh sách các thứ (chỉ mục) được sắp xếp theo thứ tự số nguyên ChannelSet
phù hợp với tất cả các giao diện mảng và danh sách khác trong vũ trụ C # (bằng cách lập chỉ mục bằng 0 ChannelSet
). Nhưng sau đó, mọi đoạn mã giữa UI và phụ trợ sẽ cần một bản dịch (trừ đi 1) và tất cả chúng ta đều biết các lỗi off-by-one thông thường và nguy hiểm như thế nào.
Vì vậy, có một quyết định như thế này bao giờ cắn bạn? Tôi nên có chỉ số hoặc một chỉ số?