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(<

最低0.47元/天 解锁文章
9779

被折叠的 条评论
为什么被折叠?



