计算器用户界面与业务逻辑的分离

1 计算器用户界面与业务逻辑的分离

1.1 分析

界面与逻辑:
基本程序架构一般包含:

  • 用户界面模块(UI):接受用户输入及呈现数据。
  • 业务逻辑模块(Business Logic):根据用户需求处理数据。

问题:用户界面与业务逻辑如何交互?

基本设计原则:

  • 功能模块之间需要进行解耦。
  • 核心思想:强内聚,弱耦合。
    • 每个模块应该只实现单一的功能。
    • 模块内部的子模块只为整体的单一功能而存在。
    • 模块之间通过约定好的接口进行交互。

在开发中接口是什么?

  • 广义:
    • 接口是一种契约。
  • 狭义:
    • 面向过程:接口是一组预定义的函数原型。
    • 面向对象:接口是纯虚类(C#和java直接支持接口)。

用户界面与业务逻辑的交互:
在这里插入图片描述
模块之间仅通过接口进行关联:

  • 必然存在模块会使用接口。
  • 必然存在模块实现对应的接口。

模块间的关系是单项依赖的:

  • 避免模块间存在循环依赖的情况。
  • 循环依赖是糟糕设计的标准之一。

计算器应用程序的整体架构:
在这里插入图片描述

1.2 代码实现

项目目录如下:
在这里插入图片描述
代码如下:
ICalculator.h:

#ifndef _ICALCULATOR_H_
#define _ICALCULATOR_H_

#include <QString>

class ICalculator
{
   
   
public:
    virtual bool expression(const QString& exp) = 0;
    virtual QString result() = 0;
};

#endif

QCalculatorDec.h:

#ifndef _CALCULATORCORE_H_
#define _CALCULATORCORE_H_

#include <QString>
#include <QStack>
#include <QQueue>

#include "ICalculator.h"

class QCalculatorDec : public ICalculator
{
   
   
protected:
    QString m_exp;
    QString m_result;

    bool isDigitOrDot(QChar c);
    bool isSymbol(QChar c);
    bool isSign(QChar c);
    bool isNumber(QString s);
    bool isOperator(QString s);
    bool isLeft(QString s);
    bool isRight(QString s);
    int priority(QString s);
    bool match(QQueue<QString>& exp);
    QString calculate(QQueue<QString>& exp);
    QString calculate(QString l, QString op, QString r);
    bool transform(QQueue<QString>& exp, QQueue<QString>& output);
    QQueue<QString> split(const QString& exp);
public:
    QCalculatorDec();
    ~QCalculatorDec();
    bool expression(const QString& exp);
    QString expression();
    QString result();
};

#endif

QCalculatorDec.cpp:

#include "QCalculatorDec.h"

QCalculatorDec::QCalculatorDec()
{
   
   
    m_exp = "";
    m_result = "";
}

QCalculatorDec::~QCalculatorDec()
{
   
   

}

bool QCalculatorDec::isDigitOrDot(QChar c)
{
   
   
    return (('0' <= c) && (c <= '9')) || (c == '.');
}

bool QCalculatorDec::isSymbol(QChar c)
{
   
   
    return isOperator(c) || (c == '(') || (c == ')');
}

bool QCalculatorDec::isSign(QChar c)
{
   
   
    return (c == '+') || (c == '-');
}

bool QCalculatorDec::isNumber(QString s)
{
   
   
    bool ret = false;

    s.toDouble(&ret);

    return ret;
}

bool QCalculatorDec::isOperator(QString s)
{
   
   
    return (s == "+") || (s == "-") || (s == "*") || (s == "/");
}

bool QCalculatorDec::isLeft(QString s)
{
   
   
    return (s == "(");
}

bool QCalculatorDec::isRight(QString s)
{
   
   
    return (s == ")");
}

int QCalculatorDec::priority(QString s)
{
   
   
    int ret = 0;

    if( (s == "+") || (s == "-") )
    {
   
   
        ret = 1;
    }

    if( (s == "*") || (s == "/") )
    {
   
   
        ret = 2;
    }

    return ret;
}

bool QCalculatorDec::expression(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值