Есть ли (хорошо скрытое) общее перечисление в любом месте BCL для Enabled/Disabled?

Итак, я просто ненавижу используя true/false в качестве аргументов метода для "enabled"/"disabled". Чтобы свободно цитировать Джеффа:"мне это не нравится на фундаментальном уровне".

Я неоднократно обнаруживаю, что определяю свои собственные перечисления для каждого нового проекта в разных пространствах имен повсюду, например:

public enum Clickability
{
    Disabled,
    Enabled
}

public enum Editability
{
    Disabled,
    Enabled
}

public enum Serializability
{
    Disabled,
    Enabled
}

есть ли общее перечисление, которое я могу использовать для этих сценариев?

3 ответов


проблема в том, что это на самом деле не помогает в реальных проблемных случаях, когда есть несколько аргументов, и неясно, что контролирует "флаг".

если вы следуете правилу, что вы должны "избегать двойных негативов", то простые одиночные логические значения в порядке:

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);

соответствующий выбор "активных" флагов, чтобы вы указывали только то, что необычно, приведет к выделению "необычных" обычаев.


нет, в BCL нет такого перечисления (насколько мне известно). Но нетрудно взять один из тех, которые вы неоднократно создавали и сделать его более общим:

public enum Ability
{
    Disabled,
    Enabled
}

вставьте его в некоторую библиотеку классов с аналогичными общими материалами и повторно используйте его в своих проектах.


что не так с использованием bool параметры со значимыми именами?

public void Foo(bool clickabilityEnabled, bool editabilityEnabled) { ... }

или, еще лучше, что-то немного менее многословный:

public void Bar(bool isClickable, bool isEditable, bool isSerializable) { ... }

public void Baz(bool canClick, bool canEdit, bool canSerialize) { ... }

Я бы нашел это гораздо более читаемым, чем грузы enum параметры.