Есть ли в BCL (хорошо скрытый) универсальный enum для Enabled / Disabled? - PullRequest
6 голосов
/ 20 августа 2009

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

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

public enum Clickability
{
    Disabled,
    Enabled
}

public enum Editability
{
    Disabled,
    Enabled
}

public enum Serializability
{
    Disabled,
    Enabled
}

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

Ответы [ 3 ]

7 голосов
/ 20 августа 2009

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

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

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

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

0 голосов
/ 20 августа 2009

Что не так с использованием 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 параметров.

0 голосов
/ 20 августа 2009

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

public enum Ability
{
    Disabled,
    Enabled
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...