Berikut ini contoh ketika bendera berguna.
Saya memiliki sepotong kode yang menghasilkan kata sandi (menggunakan generator nomor pseudorandom yang aman secara kriptografis). Penelepon metode memilih apakah kata sandi harus mengandung huruf kapital, huruf kecil, digit, simbol dasar, simbol diperluas, simbol Yunani, Cyrillic dan unicode.
Dengan tanda, memanggil metode ini mudah:
var password = this.PasswordGenerator.Generate(
CharacterSet.Digits | CharacterSet.LowercaseLetters | CharacterSet.UppercaseLetters);
dan bahkan dapat disederhanakan untuk:
var password = this.PasswordGenerator.Generate(CharacterSet.LettersAndDigits);
Tanpa bendera, apa yang akan menjadi metode tanda tangan?
public byte[] Generate(
bool uppercaseLetters, bool lowercaseLetters, bool digits, bool basicSymbols,
bool extendedSymbols, bool greekLetters, bool cyrillicLetters, bool unicode);
disebut seperti ini:
// 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);
Seperti disebutkan dalam komentar, pendekatan lain adalah menggunakan koleksi:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LowercaseLetters,
CharacterSet.UppercaseLetters,
});
Ini jauh lebih mudah dibaca dibandingkan dengan himpunan true
dan false
, tetapi masih memiliki dua kelemahan:
Kelemahan utama adalah bahwa untuk memungkinkan nilai gabungan, seperti CharacterSet.LettersAndDigits
Anda akan menulis sesuatu seperti itu dalam Generate()
metode:
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.
}
mungkin ditulis ulang seperti ini:
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.
}
Bandingkan ini dengan yang Anda miliki dengan menggunakan flag:
if (set & CharacterSet.LowercaseLetters == CharacterSet.LowercaseLetters)
{
// The password should contain lowercase letters.
}
Kelemahan kedua yang sangat kecil adalah bahwa tidak jelas bagaimana metode akan berperilaku jika dipanggil seperti ini:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LettersAndDigits, // So digits are requested two times.
});