Проблема в том, что на самом деле это не помогает в реальных проблемных случаях, когда существует множество аргументов, и неясно, что контролирует «флаг».
Если вы следуете правилу, согласно которому вы должны «избегать двойных негативов», тогда подойдут простые одиночные логические значения:
public static void Foo(bool useBaz)
public static void Foo(Ability useBaz)
Тогда Foo(true)
, стихи Foo(Ability.Enabled)
и Foo(false)
, стихи Foo(Ability.Disabled)
действительно довольно очевидны для большинства.
Однако, когда вы нажмете такой метод, как:
public static void Foo(
bool useBaz,
bool barIsHigh,
bool useFlibble,
bool ignoreCase)
тогда не имеет значения, используете ли вы булевы или общие перечисления, они все равно в конечном итоге будут выглядеть на сайте вызовов:
Foo(false,true,false,false);
Foo(Ability.Enabled,Ability.Enabled,Ability.Disabled,Ability.Enabled);
Ни то, ни другое.
Использование специфических перечислений для рассматриваемого случая:
enum BarOption { Off, On }
enum BazConsidered { Low, High }
enum FlibbleOption { Off, On }
// for case sensitivity use System.StringComparison
тогда вы получите
Foo(Bar.On,
BazConsidered.Low,
FlibbleOption.On,
StringComparison.IgnoreCase );
или, если все являются простыми логическими состояниями и, вероятно, останутся таковыми, тогда лучше использовать перечислимое помеченное.
[Flags]
enum FooOptions
{
None = 0,
UseBaz = 1,
BazConsideredHigh = 2,
UseFlibble = 4,
}
Тогда вы бы получили:
Foo(FooOptions.UseBar | FooOptions.UseFlibble, StringComparison.IgnoreCase);
Соответствующий выбор «активных» флагов, так что вы указываете только то, что необычно, приведет к выделению «необычных» случаев использования.