繁体   English   中英

如何在下面的代码中应用 oops 以减少冗余代码?

[英]How can I apply oops in the code below to make it less redundant code?

我创建了一个简单的计算器来执行加减乘除。 下面代码中的问题是重复代码以从 textField 获取文本并在每次执行操作时将其解析为 int。 而且我知道有一种方法可以用更少的代码行来做到这一点,所以请在这里帮助我。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace formApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void nameLbl_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Submit_Click(object sender, EventArgs e)
        {
        }

        private void label1_Click_1(object sender, EventArgs e)
        {

        }
      
      
        private void addBtn_Click(object sender, EventArgs e)
        {
            int num1 = 0;
            int num2 = 0;
            String num = firstNum.Text;
            String sNum = secondNum.Text;
            if (num == "")
            {
                MessageBox.Show("error type both num");
            }
            else
            {
              num1 = int.Parse(num);
              num2 = int.Parse(sNum);
            }
            int total = num1 + num2;

            String sum = (total).ToString();

            MessageBox.Show(sum);




        }

        private void firstNum_TextChanged(object sender, EventArgs e)
        {

        }

        private void multBtn_Click(object sender, EventArgs e)
        {
            int num1 = 0;
            int num2 = 0;
            String num = firstNum.Text;
            String sNum = secondNum.Text;
            if (num == "")
            {
                MessageBox.Show("error type both num");
            }
            else
            {
                num1 = int.Parse(num);
                num2 = int.Parse(sNum);
            }
           int total = num1 * num2;

            MessageBox.Show(total.ToString());

        }

        private void subBtn_Click(object sender, EventArgs e)
        {
            int num1 = 0;
            int num2 = 0;
            String num = firstNum.Text;
            String sNum = secondNum.Text;
            if (num == "")
            {
                MessageBox.Show("error type both num");
            }
            else
            {
                num1 = int.Parse(num);
                num2 = int.Parse(sNum);
            }
           int total = num1 - num2;
            MessageBox.Show(total.ToString());
        }

        private void divideBtn_Click(object sender, EventArgs e)
        {
            int num1 = 0;
            int num2 = 0;
            String num = firstNum.Text;
            String sNum = secondNum.Text;
            if (num == "")
            {
                MessageBox.Show("error type both num");
            }
            else
            {
                num1 = int.Parse(num);
                num2 = int.Parse(sNum);
            }
            int total = num1 / num2;
            MessageBox.Show(total.ToString());

            firstNum.Text = string.Empty;

            secondNum.Text = string.Empty;

            
        }
    }
}

您知道可以将多个按钮链接到同一个事件处理程序吗? 请参阅此答案以了解如何操作。

一旦您将所有按钮都指向同一个处理程序,您就可以使用相同的代码,除了决定是加、乘、除还是减的部分。 为此,您将需要一系列if语句,检查sender以查看哪个按钮引发了事件。

private void MyClickHandler(object sender, EventArgs e)
{
    int num1 = 0;
    int num2 = 0;
    String num = firstNum.Text;
    String sNum = secondNum.Text;
    if (num == "")
    {
        MessageBox.Show("error type both num");
    }
    else
    {
        num1 = int.Parse(num);
        num2 = int.Parse(sNum);
    }
    int total = 0;
    if (sender == addBtn) total = num1 + num2;
    if (sender == subBtn) total = num1 - num2;
    if (sender == multBtn) total = num1 * num2;
    if (sender == divideBtn) total = num1 / num2;
   
    MessageBox.Show(total.ToString());

    firstNum.Text = string.Empty;
    secondNum.Text = string.Empty;
}

额外学分

如果您真的想要花哨,您可以通过为每个操作使用带有委托的查找表来摆脱混乱的if语句。

private Dictionary<Control,Func<int,int,int>> _operations = new Dictionary<Control,Func<int,int,int>>
{
    { addBtn,    (x,y) => x + y },
    { subBtn,    (x,y) => x - y },
    { multBtn,   (x,y) => x * y },
    { divideBtn, (x,y) => x / y }
};

private void MyClickHandler(object sender, EventArgs e)
{
    int num1 = 0;
    int num2 = 0;
    String num = firstNum.Text;
    String sNum = secondNum.Text;
    if (num == "")
    {
        MessageBox.Show("error type both num");
    }
    else
    {
        num1 = int.Parse(num);
        num2 = int.Parse(sNum);
    }
    int total = _operations[sender](num1,num2);
   
    MessageBox.Show(total.ToString());

    firstNum.Text = string.Empty;
    secondNum.Text = string.Empty;
}

更好的方法是创建字符串扩展:只需在代码中创建一个静态类,如下所示:

public static class Ext {
    public static int ToInt(this string str) {
       var x = 0;
       if(int.TryParse(str, out x)) {
          return x;
       } else {
          throw new Exception("Please enter only digits");
       }
    }
}

上完这门课后,您可以轻松地做到这一点:

int y = "125".ToInt();

或者

string ss = "125";
int z = ss.ToInt();

或者

int w = textBox1.Text.ToInt();

如何更进一步,创建一个私有嵌套类来保存用户输入值,并使用该类还有一个方法来解析用户输入值并返回一个包含解析值的用户输入类的新实例。 我们还可以使用enum来区分运算符(加法、减法等)。

在父类Form1我们可以添加三个方法。 一种用于获取解析的用户输入,一种用于获取计算结果,一种用于向用户显示结果。

将它们链接在一起,我们将有一个单一方法,用于每个事件传递我们创建的enum ,然后进行计算并向用户显示结果(或错误,如果有)。

这是示例:

public partial class Form1 : Form
{
    private enum CalculationType
    {
        Addition,
        Subtraction,
        Multiplication, 
        Division
    }
    private class UserInput
    {
        public int FirstNumber { get; set; }
        
        public int SecondNumber { get; set; }
        
        public UserInput() { }
        
        public UserInput(int first, int second)
        {
            FirstNumber = first;
            SecondNumber = second;
        }
        
        public static bool TryParse(string first, string second, out UserInput result)
        {
            UserInput = null;
            
            if(int.TryParse(first, out int firstResult) && int.TryParse(second, out int secondResult))
            {
                UserInput = new UserInput(firstResult, secondResult);
                return true;
            }
            
            return false;
        }   
    }
    
    private UserInput GetUserInput()
    {
        if(UserInput.TryParse(firstNum.Text, secondNum.Text, out UserInput result))
        {
            MessageBox.Show("error type both num"); 
        }
        else
        {
            return result;
        }       
        
        return null;
    }

    private int GetResult(UserInput input, CalculationType type)
    {
        switch(type)
        {
            case CalculationType.Addition:
                return input.FirstNumber + input.SecondNumber;
            case CalculationType.Subtraction:
                return input.FirstNumber - input.SecondNumber;
            case CalculationType.Multiplication:
                return input.FirstNumber * input.SecondNumber;
            case CalculationType.Division:
                return input.FirstNumber / input.SecondNumber;              
            default:
                return 0;
        }
    }

    private void ShowResult(CalculationType type)
    {
        var userInput = GetUserInput();
        
        if(userInput == null)
        {
            MessageBox.Show("error");
        }
        else
        {
            int total = GetResult(userInput, type);
            MessageBox.Show(total.ToString());                          
        }
    }

    private void addBtn_Click(object sender, EventArgs e)
    {
        ShowResult(CalculationType.Addition);
    }
    
    private void multBtn_Click(object sender, EventArgs e)
    {
        ShowResult(CalculationType.Multiplication);
    }
    
    private void subBtn_Click(object sender, EventArgs e)
    {
        ShowResult(CalculationType.Subtraction);
    }
    
    private void divideBtn_Click(object sender, EventArgs e)
    {
        ShowResult(CalculationType.Division);
    }   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM