2015-10-09 33 views
0

在Qt中,顯然有一個類可以讀取和寫入註冊表QSettings(我只在Windows透視圖中說話)。當我們需要讀/寫值到註冊表時,正常的本能就是使用那個類,但它真的是「面向對象」的嗎?已經存在的註冊表類的包裝類是一種好方法嗎?

我覺得(以及我所做的)是爲我的應用程序編寫我自己的註冊表類,它在內部使用'QSettings'。我禁止我的申請直接使用QSettings,並要求所有註冊表都應該通過我自己的課程來處理,我已經命名爲'註冊表'。

從我的舊代碼,請看下面的例子:

void MainWindow::on_actionSettings_triggered() 
{ 
    SettingsDialog * settings = new SettingsDialog; 

    settings->exec(); 

    if (settings->result() == QDialog::Accepted) 
    { 
     IP = QSettings().value(IP_ADDRESS, DEFAULT_IP_ADDRESS).toString(); 
     emit ui->actionRefresh_Devices->triggered(); 
    } 

    delete settings; 
} 

在我的新代碼的功能性能稍微改變:

void MainWindow::on_actionSettings_triggered() 
{ 
    SettingsDialog * settings = new SettingsDialog; 

    settings->exec(); 

    if (settings->result() == QDialog::Accepted) 
    { 
     IP = Registry().getLastIP(); 
     emit ui->actionRefresh_Devices->triggered(); 
    } 

    delete settings; 
} 

即使它很微小的變化,但感覺多了很多對象面向我。你會同意嗎?

沿着相同的路線,我對每個數量都有單獨的功能,即使它們都是字符串。你會同意這是好的做法還是隻是增加額外的代碼?這是我的小課Registry

class Registry 
{ 
public: 
    Registry(); 
    ~Registry(); 

protected: 
    QSettings settings; 

public: 
    QString getSyncPath(); 
    void setSyncPath(QString syncPath); 

    QString getLastIP(); 
    void setLastIP(QString ip); 

    void writeCustomIPs(const QStringList& customIPs); 
    QStringList readCustomIPs(); 

}; 

總之,面向對象是用類,我們確實有一個類註冊表,以便檢查標記爲,但它仍然只是太普通。把這樣的泛型類包裝到另一個更具體的類中是否構成了一般的良好實踐?

回答

1

你所做的是一個門面。您已經在事件方法和與註冊表的交互之間放置了一層抽象。

使用外觀的最大好處之一是,您可以通過僅對外觀進行更改來更改程序與註冊表的交互方式的底層實現 - 即,如果將來您決定使用不同的方式讀取註冊表,而不是QSettings的,那麼你的事件方法調用Registry().getLastIP()沒有改變,只是getLastIP方法中的實現必須改變,這是一件好事。

添加抽象爲沒有理由的額外層是不是一個好主意 - 它使代碼更難維護(難於理解和難於調試)。所以總是要評估你是否增加了不必要的複雜性但總的來說,你所做的並不是一個糟糕的設計。

+0

謝謝,我沒想到這樣一來,但是因爲你所指出的,是的,它是門面有意義。我覺得像我的代碼更容易通過類似於'Registry()。getLastIP()'的調用這樣的方式進行讀取,而不是在那裏使用QSettings。 – zar

相關問題