多个if和else语句混乱

时间:2018-12-04 06:25:09

标签: c# .net if-statement refactoring

我正在使用使用登录窗口的Windows窗体应用程序,并根据所选的用户名将您重定向到属于该用户名的表单。在登录窗口中,用户从ComboBox中选择其帐户名,然后在文本框中键入正确的密码。如果输入了错误的密码,则用户将收到警告MessageBox。问题是我为此登录使用ifelse语句的过程完全混乱。

我的问题:如果我正确登录其中一个帐户,则会打开新表格,但是其他MessageBoxes条错误为else的其他MessageBoxs条仍会显示在新表格。我该如何设计不同。注意:Guest用户不需要密码。

我的代码:

private void button1_Click(object sender, EventArgs e)
{
    string selectedUser = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);

    if (selectedUser == "Guest")
    {
        Form3 form5 = new Form3();
        form5.Show();
        form5.Activate();
        this.Hide();
    }

    if ((selectedUser == "Admin") && (textBox1.Text== "password"))
    {
        Form1 form3 = new Form1();
        form3.Show();
        form3.Activate();
        this.Hide();
    }
    else MessageBox.Show("Password is incorrect!", "ERROR!");

    if ((selectedUser == "Limited") && (textBox1.Text== "limited"))
    {
        Form2 form4 = new Form2();
        form4.Show();
        form4.Activate();
        this.Hide();
    }
    else MessageBox.Show("Password is incorrect!", "ERROR!")
}

7 个答案:

答案 0 :(得分:1)

我通常会使用Dictionary

Dictionary<string, Form> dictionary = new Dictionary<string, Form>()
{
    {"Guest",  new Form3()},
    {"Admin", textBox1.Text == @"password" ? new Form1() : null},
    {"Limited", textBox1.Text == @"limited" ? new Form2() : null}
};

Form value;
dictionary.TryGetValue(selectedUser, out value);

if (value != null)
{
    value.Show();
    value.Activate();
    this.Hide();
}

答案 1 :(得分:1)

private void button1_Click(object sender, EventArgs e)
{
    string selectedUser = this.comboBox1.GetItemText      (this.comboBox1.SelectedItem);

    if (selectedUser == "Guest")
    {
        Form3 form5 = new Form3();
        form5.Show();
        form5.Activate();
        this.Hide();
    }
    else if ((selectedUser == "Admin") && (textBox1.Text         == "password"))
    {
        Form1 form3 = new Form1();
        form3.Show();
        form3.Activate();
        this.Hide();
    }
    else if ((selectedUser == "Limited") && (textBox1.Text     == "limited"))
    {
        Form2 form4 = new Form2();
        form4.Show();
        form4.Activate();
        this.Hide();
    }
    else{ 
        MessageBox.Show("Password is incorrect!", "ERROR!");
    }

}

答案 2 :(得分:1)

一种解决方案是在每个if分支之后立即返回:

if (selectedUser == "Guest")
{
    Form3 form5 = new Form3();
    form5.Show();
    form5.Activate();
    this.Hide();
    return;
}

if ((selectedUser == "Admin") && (textBox1.Text == "password"))
{
    Form1 form3 = new Form1();
    form3.Show();
    form3.Activate();
    this.Hide();
    return;
}

if ((selectedUser == "Limited") && (textBox1.Text == "limited"))
{
    Form2 form4 = new Form2();
    form4.Show();
    form4.Activate();
    this.Hide();
    return;
}

如果不同用户的表单非常相似。您可以考虑从通用基类继承它们,以减少代码重复。

// "return" will cause this method to stop running immediately, so this 
// statement will only be run if none of the ifs gets run.
MessageBox.Show("Password is incorrect!", "ERROR!");

答案 3 :(得分:0)

代码的问题是,您到处散布了IF语句。您应该将它们全部合并为一个。

string selectedUser = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);

if (selectedUser == "Guest"){
    Form3 form5 = new Form3();
    form5.Show();
    form5.Activate();
    this.Hide();
} else if ((selectedUser == "Admin") && (textBox1.Text == "password")){
    Form1 form3 = new Form1();
    form3.Show();
    form3.Activate();
    this.Hide();
} else if ((selectedUser == "Limited") && (textBox1.Text == "limited")) {
    Form2 form4 = new Form2();
    form4.Show();
    form4.Activate();
    this.Hide();
} else {
    MessageBox.Show("Password is incorrect!", "ERROR!");
}

答案 4 :(得分:0)

首先,我建议您为多次执行的事情编写一种方法。

考虑到这一点,我认为在您的情况下,使用switch语句可能是一个不错的选择:

switch(selectedUser)
{
    case "Guest": return ShowForm(new Form3());
    case "Admin":
        if(textBox1.Text == "password")
        {
            ShowForm(new Form1());
        }
        else
        {
            MessageBox.Show("Password is incorrect!", "ERROR!");
        }
        return;
    case "Limited":
        if(textBox1.Text == "limited")
        {
            ShowForm(new Form2());      
        }
        else
        {
            MessageBox.Show("Password is incorrect!", "ERROR!");
        }
        return;
    default: return;
}

然后使用您的ShowForm()方法:

private void ShowForm(Form FormToShow)
{
    FormToShow.Show();
    FormToShow.Activate();
    this.Hide();
}

答案 5 :(得分:0)

不要害怕将逻辑提取到更小和更简单的函数中。这确实可以帮助管理复杂性。

例如,您可以编写一个简单的函数来验证凭据。...

Observable

还有一个简单的函数可以选择正确的形式:

bool IsPasswordCorrect(string userName, string password)
{
    if (userName == "Guest") return true;
    if (userName == "Limited" && password == "limited") return true;
    if (userName == "Admin" && password == "admin") return true;
    return false;
}

现在剩下的很简单了:

Form CreateFormForUser(string userName)
{
    if (userName == "Admin") return new Form1();
    if (userName == "Limited") return new Form2();
    return new Form3();
}

当然,有更多聪明的方法来编写此代码(例如,使用工厂,使用字典等),但是在我看来,更重要的概念是将复杂的问题分解为更简单的问题。处理琐碎的软件问题以外的其他事情时,精通这种思维方式至关重要。

答案 6 :(得分:0)

您的方法很混乱,因为您试图一次做太多事情。

有关各方的担忧;创建一个验证用户的方法,创建另一个向用户显示正确形式的方法。在这种情况下,我将使用字典(或地图),因为它们非常方便(为清楚起见,我将它们更新为本地语言)。

用户验证:

bool AuthorizeUser(string userName, string password)
{
    var users = new Dictionary<string, string>()
    {
        {"GUEST", null},
        {"ADMIN", "admin"},
        {"LIMITED", "limited"}
    };

    var upperInvariantUserName = userName.ToUpperInvariant();

    if (users.TryGetValue(upperInvariantUserName,
        out var storedPassword))
    {
        if (storedPassword == null ||
            password == storedPassword)
            return true;
    }

    return false;        
} 

现在显示适当的形式:

void ShowForm(string userName, string password)
{
    var formSelectors = new Dictionary<string, Func<Form>>()
    {
        {"GUEST", () => new Form3()},
        {"ADMIN", () => new Form1()},
        {"LIMITED", () => new Form2()}
    };

    if (AuthorizeUser(userName, password))
    {
        if (formSelectors.TryGetValue(
            user, 
            out var formCreator))
        {
             var form = formCreator();
             form.Show();
             this.Hide();
             form.Activate();
        }
        else
        {
            //user not supported!
            throw new NotImplementedException(
                "This user is currently not supported.");
        }
    }
    else
       MessageBox.Show("Unknown or unauthorised user.");
} 

始终牢记黄金法则:没有一项任务足够小,不值得采用自己的方法。将所有事情分解成愚蠢的小任务;很难弄错他们。