다음은 플래그가 유용한 예입니다.
암호를 생성하는 코드 조각이 있습니다 (암호 적으로 안전한 의사 난수 생성기를 사용하여). 이 메소드의 호출자는 비밀번호에 대문자, 소문자, 숫자, 기본 기호, 확장 기호, 그리스어 기호, 키릴 문자 및 유니 코드를 포함해야하는지 여부를 선택합니다.
플래그를 사용하면이 메소드를 호출하는 것이 쉽습니다.
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
and 세트에 비해 훨씬 더 읽기 false
쉽지만 여전히 두 가지 단점이 있습니다.
가장 큰 단점은 결합 된 값을 허용하기 위해 메소드 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.
}
둘째, 매우 사소한 단점은 다음과 같이 호출하면 메소드가 어떻게 작동하는지 명확하지 않다는 것입니다.
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LettersAndDigits, // So digits are requested two times.
});