簡體   English   中英

關於MVC視圖界面的良好設計實踐

[英]Good design practice concerning MVC view interface

我不經常創建GUI,但今天我這樣做,我希望有一些設計輸入。

基本上我有一個后端,我打算使用MVC模式添加一個GUI。 問題是我覺得無論什么類封裝主GUI窗口都會有很多狀態(所有的子元素); 最重要的是,它將有很多制定者,可能還有吸氣劑,清晰度,顏色,尺寸,位置和刷新功能。

  • 一個選擇是繼續前進這個想法,並有一個非常大的公共接口,處理GUI使用的類型( std::stringstd::vector<std::string> ...)我想要的控制越多UI我需要的公共成員功能越多。

  • 另一個選擇是將程序狀態傳遞給GUI並讓它決定它如何顯示它,我擔心這樣做會意味着它會給我不那么精細的細節控制並且會打破關注點的分離並且意味着任何改變程序狀態的表示也需要在GUI中進行更改。

對此事的任何意見都會有很大幫助。

如果它有所不同,那么這是一個使用ncurses抽象的C ++ gui。

聽起來我對你有很多關於M和V的看法,但對C來說並不多。該模式應該真正稱為MCV,因為整個想法是控制器是你的模型(數據)和視圖之間的橋梁(GUI)。 聽起來你需要一個具有你提到的大部分功能的控制器。

簡而言之,您的模型顯然應該對顯示一無所知,並且您的顯示(視圖)不應該知道如何訪問模型。 您需要一個讀取數據(模型)的控制器並向顯示器(視圖)發出指令。 如果您在視圖中有用戶交互,則控制器可以解釋該操作並根據需要修改模型。

這個想法是你永遠不必改變所有3,但如果你改變模型或視圖,你幾乎總是需要更新控制器。

希望有幫助......

巨型界面至少有一種替代方案。 而不是具有處理每個事物的功能(大小,字體,顏色,顯示內容等)具有接受“角色”的單一功能和表示角色的數據。 這需要某種包含多種數據類型的包裝器。

QT的QAbstractItemModel類參考有一個很好的例子:

QVariant QAbstractItemModel :: data(const QModelIndex&index,int role = Qt :: DisplayRole)const [pure virtual]

該函數將執行的操作是返回表示所提供索引處指示的角色的QVariant。

這種方法的缺點是,您必須知道存在哪些角色以及它們的作用。 QT的默認角色如下所示。

我希望模型的某些部分能夠自行測量:

class Model {
private:
    int value;
public:
    void instrument(Instrumenter& instrumenter);
};

Instrumenter管理控件的創建。 該模型將告訴它如何控制它並讓它訪問數據。

void Model::instrument(Instrumenter& instrumenter) {
    instrumenter.addRangeController(0, 100, 5, value);
}

然后,對於不同的輸入設備(例如鍵盤,觸摸屏),您可以創建適當的控件:

class KeyboardInstrumenter : public Instrumenter {
public:
    void addRangeController(int min, int max, int increments, int& controlled) {
        // create 3 widgets, up arrow, down arrow, and value
    }
};

class TouchscreenInstrumenter : public Instrumenter {
public:
    void addRangeController(int min, int max, int increments, int& controlled) {
        // create slider with min, max and increments
    }
};

我們可以將它包裝在一個控制對象中,而不是直接傳入int ,以幫助封裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM