Bayrakların kullanışlı olduğu bir örnek.
Şifreler üreten bir kod parçam var (şifreli olarak güvenli bir sözde rasgele sayı üreteci kullanarak). Yöntemin arayanı, şifrenin büyük harfler, küçük harfler, rakamlar, temel semboller, genişletilmiş semboller, Yunanca semboller, Kiril harfleri ve unicode içermesi gerektiğini seçer.
Bayraklarla bu yöntemi çağırmak kolaydır:
var password = this.PasswordGenerator.Generate(
CharacterSet.Digits | CharacterSet.LowercaseLetters | CharacterSet.UppercaseLetters);
ve hatta için basitleştirilmiş olabilir:
var password = this.PasswordGenerator.Generate(CharacterSet.LettersAndDigits);
Bayraklar olmadan, yöntem imzası ne olurdu?
public byte[] Generate(
bool uppercaseLetters, bool lowercaseLetters, bool digits, bool basicSymbols,
bool extendedSymbols, bool greekLetters, bool cyrillicLetters, bool unicode);
böyle denir:
// 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);
Yorumlarda belirtildiği gibi, başka bir yaklaşım bir koleksiyon kullanmak olacaktır:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LowercaseLetters,
CharacterSet.UppercaseLetters,
});
Bu setine kıyasla çok daha okunabilir true
ve false
fakat yine de iki dezavantajları vardır:
En büyük dezavantajı, birleştirilmiş değerlere izin vermek için, CharacterSet.LettersAndDigits
sizin gibi Generate()
yöntemde şöyle bir şeyler yazmanızdır :
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.
}
muhtemelen şöyle yeniden yazılmıştır:
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.
}
Bayrakları kullanarak bunu sahip olduklarınızla karşılaştırın:
if (set & CharacterSet.LowercaseLetters == CharacterSet.LowercaseLetters)
{
// The password should contain lowercase letters.
}
İkincisi, çok küçük dezavantajı, böyle çağrılırsa yöntemin nasıl davranacağının açık olmamasıdır:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LettersAndDigits, // So digits are requested two times.
});