Каждый раз я пишу метод, который берет булев параметр, представляющий опцию, я думаю: "я должен заменить это перечислением, которое сделало бы чтение вызовов метода намного легче?".
Рассмотрите следующее с объектом, который берет параметр, говорящий, должна ли реализация использовать свою ориентированную на многопотоковое исполнение версию или не (я не спрашиваю здесь, если этим способом сделать это является хороший дизайн или нет, только использование булевской переменной):
public void CreateSomeObject(bool makeThreadSafe);
CreateSomeObject(true);
Когда вызов рядом с объявлением, цель параметра кажется, конечно, очевидной. Когда это находится в некоторой сторонней библиотеке, Вы едва знаете, более трудно сразу видеть то, по сравнению с чем код делает:
public enum CreationOptions { None, MakeThreadSafe }
public void CreateSomeObject(CreationOptions options);
CreateSomeObject(CreationOptions.MakeThreadSafe);
который описывает намерение намного лучше.
Вещи ухудшаются, когда существует две опции представления булевых параметров. Посмотрите то, что произошло с ObjectContext.SaveChanges(bool)
между Платформой 3.5 и 4.0. Это был obsoleted, потому что вторая опция была представлена, и все это было преобразовано в перечисление.
В то время как кажется очевидным использовать перечисление, когда существует три элемента или больше, каковы Ваше мнение и события об использовании перечисления вместо этого булевская переменная в этих конкретных случаях?
.NET 4.0 может помочь здесь. Вы можете использовать именованные параметры:
CreateSomeObject(makeThreadSafe : true);
Для старых версий может быть полезно создать временные переменные.
bool makeThreadSafe = true;
CreateSomeObject(makeThreadSafe);
Очевидно, что второй подход более читабелен без IDE. Если вы работаете в VS, вы можете использовать intellisense, чтобы понять параметры, хотя, по общему признанию, иногда это может быть немного неуклюже.
Если вы работаете в C# 4.0, вы можете использовать именованные параметры, чтобы сделать ваше намерение ясным.
Вы можете использовать именованные параметры в C # 4.0:
CreateSomeObject(makeThreadSafe : true);
Я думаю, это будет зависеть от семантики ваших методов, например, действительно ли ваше булево значение представляет булево? Или оно используется только для того, чтобы отметить наличие, а не отсутствие другой вещи?
Например:
// If true, uses 64 bit numbers, if false, 32.
doSomething(boolean)
Даже если вы знаете (что по крайней мере в обозримом будущем это не изменится (если вы не хотите поддерживать 16 или даже 8 бит), будет гораздо легче читать, если вы используете перечисление:
Options.Use32Bit,
Options.Use64Bit.