Мы будем использовать наборы чисел, представляющие, какие флажки установлены, поэтому {1, 3}
означает check1 && check3
.
Если вся логика полностью отделена, т.е. нет никакой связи между действиями, предпринятыми для {a_1, a_2, ..., a_n}
и {a_1, a_2, ..., a_n, x}
для любых a_1, ..., a_n
и x
, тогда, очевидно, вам необходимо иметь 2^n
отдельных процедур для каждой комбинации.Это означает, что в любом случае мы должны перейти в 2^n
различных потоков кода.Таким образом, вопрос сводится к тому, можем ли мы решить, какой набор использовать менее затратным для кода способом.
Очевидно, вам нужно каким-то образом связать поведение с различными наборами.Это означает, что независимо от того, что мы делаем, в предположении, что у нас может быть 2^n
полностью несвязанных процедур, по одной для каждого набора, вы все равно должны иметь как минимум 2^n
операторов, которые свяжут определенный набор с определенной процедурой.Таким образом, короткий ответ - нет, даже если вы избавились от операторов if/else
, например, закодировав проверки как последовательности битов, а затем отобразив эти последовательности в процедуры, вы бы избавились от логики здесь, но где-то еще вкод, который вы должны иметь такие сопоставления, как:
Dictionary<string, Action> logic = new Dictionary<int[], Action>();
logic["{1}"] = DoStuffFor1;
logic["{2}"] = DoStuffFor2;
...
logic["{N}"] = DoStuffForN;
logic["{1, 2}"] = DoStuffFor12;
logic["{1, 3}"] = DoStuffFor13;
...
var checkboxSet = Encode(check1, check2, ..., checkN); // Implementation of Encode should be obvious.
logic[checkboxSet].Invoke();
так что все еще 2^n
операторов.Таким образом, для общего случая нет способа уменьшить количество строк, которые вы пишете, но вы можете найти карту делегатов более элегантной, чем рой if/else
операторов.
Если, однако, логика дляразличные наборы флажков каким-то образом связаны между собой, что будет иметь место в любом разумном приложении из реальной жизни, возможно, вы могли бы свернуть операторы if
, чтобы сократить код.Но без более подробной информации о реальной логике программы невозможно сказать.
РЕДАКТИРОВАТЬ:
На самом деле, теперь, когда я об этом думаю, вы может иметь очень запутанный способ разрешения имени метода во время выполнения, используя отражение и используя соглашение об именах для ваших методов, чтобы имена всех обработчиков были однозначными (например, имя метода, обрабатывающего {1, 42, 100}
, было бы названоDoStuffFor_1_42_100
и т. Д.) Вы можете получить метод с именем, эквивалентным установленным флажкам, и вызвать его.Тем не менее, вам все равно потребуется написать 2^n
процедуры.Также я думаю, что мы можем единодушно согласиться с тем, что это ужасная идея - использовать рефлексию для этой вещи и полагаться на соглашение об именах для работы кода.