如何将业务逻辑与UI分离

时间:2014-10-08 19:16:35

标签: user-interface separation-of-concerns code-separation

我正在创建一个计算器应用程序,我正在尝试将业务逻辑与UI分离,以提高代码可维护性并允许更好的单元测试。

我创建了一个CalculatorUI类来管理当用户点击应用程序中的各个按钮时会发生什么。

我还创建了一个执行数学运算的Calculator类,并根据用户要求对计算结果进行了一些验证。 CalculatorUI创建Calculator类的实例,并调用Calculator类中的函数来响应用户的点击。我的问题是,在Calculator类中,如何编写清除文本框的代码并显示消息框以使用户知道无效结果?

我是编程新手,根据我的一位同事(高级程序员)的说法,最好将UI与业务逻辑和数据库分开。

我得到的错误表明当前上下文中不存在'txtDisplay'和'resultValue'...另外,我应该如何使用bool变量?

这是我在计算器类中的代码:

class Calculator
{
    public double Addition(double value1, double value2)
    {
        double result = 0;

        result = value1 + value2;
        return result;
    }

    public double Subtraction(double value1, double value2)
    {
        double result = 0;

        result = value1 - value2;
        return result;
    }

    public double Multiplication(double value1, double value2)
    {
        double result = 0;

        result = value1 * value2;

        return result;
    }

    public double Division(double value1, double value2)
    {
        double result = 0;

        result = value1 / value2;

        return result;
    }

    public bool CalculationValidation(double result)
    {
        bool isValid;
        bool isFalse;
        // determine if the initial result is within the specified range
        if ((result < -4000000000) || (result > 4000000000))
        {
            MessageBox.Show("The result is too large or small to be displayed.");
            txtDisplay.text = "0";
            resultValue = 0;
            return;
        }

        // round the result if necessary
        string test = result.ToString();
        if (test.Contains("."))
        {
            test = (Math.Round(double.Parse(test), 10 - test.Split('.')[0].Count())).ToString();
        }
        else if (test.Length > 10)
        {
            test = (Math.Round(double.Parse(test), 10).ToString());
        }

        txtDisplay.Text = test;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以在计算器类中引发异常,然后在您的UI中捕获它并执行重置并显示消息。显示消息并将显示设置为0是UI逻辑。在这种情况下,这是一个很好的分离方式。

这样,您的UI依赖于业务逻辑(Calculator类),但Calculator类不了解UI。目标应该是所有依赖关系都应指向您的域对象。

为了分离更复杂的域名,我建议查看Facade,Command和Observer模式。