Đây là một ví dụ khi cờ hữu ích.
Tôi có một đoạn mã tạo mật khẩu (sử dụng trình tạo số giả ngẫu nhiên bảo mật bằng mật mã). Người gọi phương thức chọn có hay không mật khẩu nên chứa chữ in hoa, chữ nhỏ, chữ số, ký hiệu cơ bản, ký hiệu mở rộng, ký hiệu Hy Lạp, ký hiệu Cyrillic và unicode.
Với cờ, gọi phương thức này thật dễ dàng:
var password = this.PasswordGenerator.Generate(
CharacterSet.Digits | CharacterSet.LowercaseLetters | CharacterSet.UppercaseLetters);
và thậm chí có thể được đơn giản hóa để:
var password = this.PasswordGenerator.Generate(CharacterSet.LettersAndDigits);
Không có cờ, chữ ký phương thức sẽ là gì?
public byte[] Generate(
bool uppercaseLetters, bool lowercaseLetters, bool digits, bool basicSymbols,
bool extendedSymbols, bool greekLetters, bool cyrillicLetters, bool unicode);
gọi như thế này:
// 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);
Như đã lưu ý trong các ý kiến, một cách tiếp cận khác là sử dụng một bộ sưu tập:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LowercaseLetters,
CharacterSet.UppercaseLetters,
});
Điều này dễ đọc hơn nhiều so với tập hợp true
và false
, nhưng vẫn có hai nhược điểm:
Hạn chế chính là để cho phép các giá trị kết hợp, giống như CharacterSet.LettersAndDigits
bạn sẽ viết một cái gì đó giống như vậy trong Generate()
phương thức:
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.
}
có thể viết lại như thế này:
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.
}
So sánh điều này với những gì bạn có bằng cách sử dụng cờ:
if (set & CharacterSet.LowercaseLetters == CharacterSet.LowercaseLetters)
{
// The password should contain lowercase letters.
}
Hạn chế thứ hai, rất nhỏ là không rõ phương thức này sẽ hoạt động như thế nào nếu được gọi như thế này:
var password = this.PasswordGenerator.Generate(
new []
{
CharacterSet.Digits,
CharacterSet.LettersAndDigits, // So digits are requested two times.
});