Другой разработчик предположил, что мы сохраняем выбор дней недели в виде 7-символьной строки из 1 и 0, т.е. "1000100" в понедельник и пятницу. Я предпочел (и настоятельно предложил) решение с перечислением Flags и побитовыми операциями, я считаю, что это более чистый способ сделать это, и это должно быть проще понять для других разработчиков.
[Flags()]
public enum Weekdays : int
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
Однако, когда я начал внедрять образцовое решение, я понял, что, возможно, простой строковый подход был проще в конце концов: конечно, бит-строка более очевидна, чем "17", если вы просто смотрите на данные. И я считаю, что побитовые операции С# являются интуитивно понятными и чрезвычайно подробными:
Weekdays workDays = Weekdays.Monday | Weekdays.Tuesday;
if ((workDays & Weekdays.Monday) == Weekdays.Monday)
{...}
Конечно, это можно было бы хорошо обернуть в методы расширения, но затем мы неожиданно закончим, по крайней мере, с таким же количеством строк кода, что и с строковым решением, и я с трудом могу утверждать, что поразрядный код легче читать.
Говоря, я все равно поеду с перечислением флагов и побитовыми операциями. Ключевыми преимуществами, которые я могу придумать, являются
- Лучшая производительность
- Меньше места для хранения
Итак, как мне продавать побитное решение для моих коллег? Нужно ли мне? Каковы другие преимущества использования этого метода над строками? После завершения образца проекта я обнаружил, что команда по-прежнему выбрала линейное решение. Мне нужны более хорошие/более сильные аргументы. Почему вы должны использовать перечисления флагов, а не простые битовые строки?