1. 程式人生 > >QT之界面與業務邏輯的分離

QT之界面與業務邏輯的分離

QT 計算器

我們在實現計算器的時候,得考慮到界面與邏輯的分離。

那麽基本程序的架構一般包含:1、用戶界面模塊(UI),用來接受用戶輸入及呈現數據;2、業務邏輯模塊(Business Logic),根據用戶需求處理數據。
那麽基本的設計原則是:功能模塊之間需要進行解耦;核心思想是強內聚,弱耦合:1. 每個模塊應該只實現單一的功能;2. 模塊內部的子模塊只為整體的單一功能而存在;3. 模塊之間通過約定好的接口進行交互。
那麽在工程開發中接口是什麽呢?從廣義上來說,接口是一種契約(協議,語法,格式等)。從狹義上來說,分為面向對象和面向過程兩個方面。對於面向過程而言,接口是一組預定義的函數原型。對於面向對象而言,接口是純虛類(C# 和 Java 直接支持接口)。

那麽我們實現的用戶界面與業務邏輯的交互可以用下圖來描述:
技術分享圖片
模塊之間僅通過接口進行關聯:必然存在模塊會使用接口,必然存在模塊實現對應的接口。
模塊間的關系是單向依賴的:避免模塊間存在循環依賴的情況,循環依賴是最糟糕設計的標準之一。
我們建立一個 ICalculator 頭文件,包含兩個純虛函數:virtual bool expression(const QString& exp) = 0; virtual QString result() = 0;
建立 QCalculator 類,頭文件如圖所示:
技術分享圖片
Qcalculator.cpp 文件實現如下:
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;
}

那麽我們最終運行得到的可執行程序就是一個已經可以進行計算的計算器了,我們輸入 3 * (2 + 3)/ 5, 結果應該為 3 。如下:
技術分享圖片 技術分享圖片

 我們再除 0 ,結果為 Error。

技術分享圖片技術分享圖片
那麽關於這個小項目計算器的學習,我們就到此結束了。後面繼續學習QT其他相關的知識。

以上內容來自狄泰軟件學院的QT教程,歡迎大家一起來學習,可以加我QQ:243343083,一起學習。狄泰技術交流群:199546072 

QT之界面與業務邏輯的分離