簡體   English   中英

我怎樣才能使我的 if 語句不那么矛盾?

[英]How can I make my if statements less contradictory?

我有一個我正在研究的密碼強度檢查器的積分系統。

目前,規則的工作方式如下:如果用戶條目有小寫字母,則 +5,如果用戶條目有大小寫字母、數字或特殊字符等,則 +10。

我遇到的問題是我的 if 語句是矛盾的,如果有任何我可以使用的替代方案,我正在徘徊。

下面的陳述是我試圖得到它,所以如果他們放入某種類型的角色,他們將獲得積分,這將有助於得分,即如果它有一個數字,那么 +5 得分。

if (userPassword.Any(char.IsDigit))
{
    points += 5;
}

if (userPassword.Any(char.IsLower))
{
    points += 5;
}

if (userPassword.Any(char.IsUpper))
{
    points += 5;
}

if (userPassword.Any(c => specialCharacters.Contains(c)))
{
    points += 5;
}

為了擺脫矛盾,我嘗試在可能會扣除用戶積分的陳述上做一個.all function,但似乎不夠,我認為這對這個程序來說不太合適。

如果用戶只使用一種類型的字符,我基本上試圖讓它扣分,即如果他們只使用數字而不使用其他任何東西,他們將失去積分。

if (userPassword.All(char.IsLower) || userPassword.All(char.IsUpper)) 
{
    points -= 5;
}

if (userPassword.All(char.IsDigit)) 
{
    points -= 5;
}

if (userPassword.All(c => specialCharacters.Contains(c))) 
{
    points -= 5;
}

解決這個問題的替代方法是什么?

編輯:好的,感謝您澄清我的 if 語句沒有任何問題。 我現在想添加一個 if 語句,如果它包含大寫、小寫、數字和特殊字符,則加 10 分。 我試圖使用 .contain 語句來嘗試將其與其他添加 if 語句區分開來,但它給了我參數 1 的錯誤:無法從“方法組”轉換為“字符串”,我不知道該怎么做用來繞過它。

if (userPassword.Contains(char.IsUpper) &&
    userPassword.Contains(char.IsLower) &&
    userPassword.Contains(char.IsDigit) &&
    userPassword.Contains(c => specialCharacters.Contains(c)))
{
    points += 10;
}

如果我理解正確,您希望密碼適合“全大寫”等條件來減去分數,同時也不為具有單個大寫字母添加分數。 就像目前一樣,您的示例中的“abc”將獲得+5,因為有一個小寫字母,然后會因為所有小寫字母而失去5,最后是0而不是-5。

我會在開頭將您的減分條件放入一個 if 語句中,然后將所有加分條件放入 else 語句中的 if 語句中:

 if (userPassword.All(char.IsLower) || userPassword.All(char.IsUpper) || userPassword.All(char.IsDigit) || userPassword.All(c => specialCharacters.Contains(c)) { points -= 5; } else { if (userPassword.Any(char.IsDigit)) { points += 5; } if (userPassword.Any(char.IsLower)) { points += 5; } if (userPassword.Any(char.IsUpper)) { points += 5; } if (userPassword.Any(c => specialCharacters.Contains(c))) { points += 5; } }

或者,如果您需要將這些扣分條件分開以允許針對不同條件的不同扣分值,只需對壞的條件使用更多 else if 語句:

 if (userPassword.All(char.IsLower) || userPassword.All(char.IsUpper)) { points -= 5; } else if (userPassword.All(char.IsDigit)) { points -= 5; } else if (userPassword.All(c => specialCharacters.Contains(c))) { points -= 5; } else { if (userPassword.Any(char.IsDigit)) { points += 5; } if (userPassword.Any(char.IsLower)) { points += 5; } if (userPassword.Any(char.IsUpper)) { points += 5; } if (userPassword.Any(c => specialCharacters.Contains(c))) { points += 5; } }

將您的“矛盾”檢查與相關的“確認”檢查結合起來。 例如,在測試是否包含數字時,還要確保它們不都是數字:

if( userPassword.Any(char.isDigit)
    && !userPassword.All(char.isDigit) )
{
    points += 5;
}
else /*if(userPassword.All(char.isDigit)*/ // if desired
{
    points -= 5; // if appropriate
}

現在讓我們討論重構你的算法。 讓我們創建一個 class 來定義檢查,而不是定義長鏈ifif/else語句:

public class PasswordEvaluator
{
    public Func<string, bool> TestCondition { get; init set; }
    public int AffirmativeResultValue { get; init set; }
    public int NegativeResultValue { get; init set; }

    public int Evaluate(string password) =>
        TestCondition(password)
            ? AffirmativeResultValue 
            : NegativeResultValue ;
}

然后你可以定義你的測試。 使用上述解決方案:

var hasDigitEvaluator = new PasswordEvaluator
{
    Condition = (string password) => password.Any(char.isDigit)
        && !password.All(char.isDigit),
    AffirmativeResultValue = 5,
    NegativeResultValue = -5, // or 0, whatever
};

然后可以使用這個 object 來執行操作:

points += hasDigitEvaluator.Evalutate(userPassword);

現在,要處理多個評估器,您可以編寫一個IEnumerable<PasswordEvaluator> ,然后對其調用單個操作以獲得聚合結果:

var passwordEvaluators = new[]
{
    new PasswordEvaluator { ... },
    new PasswordEvaluator { ... },
    ...
};

var points = passwordEvaluators
    .Select(test => test.Evaluate(userPassword))
    .Sum();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM