นี่คือตัวอย่างเมื่อธงมีประโยชน์
ฉันมีรหัสส่วนหนึ่งซึ่งสร้างรหัสผ่าน (โดยใช้เครื่องสร้างหมายเลขเทียมที่มีความปลอดภัยแบบเข้ารหัส) ผู้เรียกใช้วิธีการเลือกว่ารหัสผ่านควรประกอบด้วยตัวอักษรตัวใหญ่ตัวเล็กตัวเลขตัวเลขสัญลักษณ์พื้นฐานสัญลักษณ์เสริมสัญลักษณ์กรีกอักษรซีริลลิกและยูนิโค้ด
ด้วยแฟล็กการเรียกใช้เมธอดนี้เป็นเรื่องง่าย:
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
แต่ยังมีข้อเสียสองประการ:
ข้อเสียเปรียบที่สำคัญคือเพื่อที่จะอนุญาตให้มีค่ารวมกันเช่น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.
});