您好,登錄后才能下訂單哦!
我們在實現(xiàn)計算器的時候,得考慮到界面與邏輯的分離。
那么基本程序的架構(gòu)一般包含:1、用戶界面模塊(UI),用來接受用戶輸入及呈現(xiàn)數(shù)據(jù);2、業(yè)務(wù)邏輯模塊(Business Logic),根據(jù)用戶需求處理數(shù)據(jù)。
那么基本的設(shè)計原則是:功能模塊之間需要進(jìn)行解耦;核心思想是強(qiáng)內(nèi)聚,弱耦合:1. 每個模塊應(yīng)該只實現(xiàn)單一的功能;2. 模塊內(nèi)部的子模塊只為整體的單一功能而存在;3. 模塊之間通過約定好的接口進(jìn)行交互。
那么在工程開發(fā)中接口是什么呢?從廣義上來說,接口是一種契約(協(xié)議,語法,格式等)。從狹義上來說,分為面向?qū)ο蠛兔嫦蜻^程兩個方面。對于面向過程而言,接口是一組預(yù)定義的函數(shù)原型。對于面向?qū)ο蠖?,接口是純虛類(C# 和 Java 直接支持接口)。
那么我們實現(xiàn)的用戶界面與業(yè)務(wù)邏輯的交互可以用下圖來描述:
模塊之間僅通過接口進(jìn)行關(guān)聯(lián):必然存在模塊會使用接口,必然存在模塊實現(xiàn)對應(yīng)的接口。
模塊間的關(guān)系是單向依賴的:避免模塊間存在循環(huán)依賴的情況,循環(huán)依賴是最糟糕設(shè)計的標(biāo)準(zhǔn)之一。
我們建立一個 ICalculator 頭文件,包含兩個純虛函數(shù):virtual bool expression(const QString& exp) = 0; virtual QString result() = 0;
建立 QCalculator 類,頭文件如圖所示:
Qcalculator.cpp 文件實現(xiàn)如下:
bool QCalculator::construct()
{
m_ui = QCalculatorUI::NewInstance();
if( m_ui != NULL )
{
m_ui->setCalculator(&m_cal);
}
return (m_ui != NULL);
}
QCalculator* QCalculator::NewInstance()
{
QCalculator* ret = new QCalculator();
if( (ret == NULL) || !ret->construct() )
{
delete ret;
ret = NULL;
}
return ret;
}
void QCalculator::show()
{
m_ui->show();
}
QCalculator::~QCalculator()
{
delete m_ui;
}
在 QCalculatorUI.cpp 中我們加入
void setCalculator(ICalculator* cal)
{
m_cal = cal;
}
ICalculator* getCalculator()
{
return m_cal;
}
那么我們最終運(yùn)行得到的可執(zhí)行程序就是一個已經(jīng)可以進(jìn)行計算的計算器了,我們輸入 3 * (2 + 3)/ 5, 結(jié)果應(yīng)該為 3 。如下:
我們再除 0 ,結(jié)果為 Error。
那么關(guān)于這個小項目計算器的學(xué)習(xí),我們就到此結(jié)束了。后面繼續(xù)學(xué)習(xí)QT其他相關(guān)的知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。