フラグが役立つ場合の例を次に示します。
パスワードを生成するコードがあります(暗号的に安全な擬似乱数ジェネレーターを使用)。メソッドの呼び出し元は、パスワードに大文字、小文字、数字、基本記号、拡張記号、ギリシャ語記号、キリル文字、およびUnicodeを含めるかどうかを選択します。
フラグを使用すると、このメソッドを簡単に呼び出すことができます。
var password = this.PasswordGenerator.Generate(
CharacterSet.Digits | CharacterSet.LowercaseLetters | CharacterSet.UppercaseLetters);
さらに、次のように簡略化することもできます。
var password = this.PasswordGenerator.Generate(CharacterSet.LettersAndDigits);
フラグがなければ、メソッドのシグネチャは何でしょうか?
public byte[] Generate(
bool uppercaseLetters, bool lowercaseLetters, bool digits, bool basicSymbols,
bool extendedSymbols, bool greekLetters, bool cyrillicLetters, bool unicode);
このように呼び出されます:
// Very readable, isn't it?
// Tell me just by looking at this code what symbols do I want to be included?
var password = this.PasswordGenerator.Generate(
true, true, true, false, false, false, false, false);
コメントで述べたように、別のアプローチはコレクションを使用することです。
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LowercaseLetters,
CharacterSet.UppercaseLetters,
});
これは、true
およびのセットに比べてはるかに読みやすいですfalse
が、まだ2つの欠点があります。
主な欠点は、結合された値を許可するためにCharacterSet.LettersAndDigits
、Generate()
メソッドでそのようなものを書くことです:
if (set.Contains(CharacterSet.LowercaseLetters) ||
set.Contains(CharacterSet.Letters) ||
set.Contains(CharacterSet.LettersAndDigits) ||
set.Contains(CharacterSet.Default) ||
set.Contains(CharacterSet.All))
{
// The password should contain lowercase letters.
}
おそらく次のように書き換えられます:
var lowercaseGroups = new []
{
CharacterSet.LowercaseLetters,
CharacterSet.Letters,
CharacterSet.LettersAndDigits,
CharacterSet.Default,
CharacterSet.All,
};
if (lowercaseGroups.Any(s => set.Contains(s)))
{
// The password should contain lowercase letters.
}
フラグを使用して、これをあなたの持っているものと比較してください:
if (set & CharacterSet.LowercaseLetters == CharacterSet.LowercaseLetters)
{
// The password should contain lowercase letters.
}
2番目の非常に小さな欠点は、次のように呼び出された場合にメソッドがどのように動作するかが明確でないことです。
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LettersAndDigits, // So digits are requested two times.
});