2013-01-20 42 views
-1

我有一個類的成員的值有限的範圍。例如什麼是驗證輸入的好方法?

class Sphere 
{ 
public: 
    void setRadius(double radius) 
    { 
     m_radius = radius; 
    } 

private: 
    double m_radius; // must >= 0. 
}; 

我也有一個對話框來輸入半徑。我可以在setRadius()方法中檢查半徑驗證,或者檢查對話框。哪種方法更好?這似乎是一個很常見的問題。傳統方式或最佳方式是什麼?謝謝。

回答

1

在OOP中,您通常會在函數中進行驗證,並且在您的情況下,如果該值不在您的可接受範圍內,該函數會拋出異常。

不過,如果你這樣做是爲一類,而且預計不會知道拋出/捕捉異常的是,你可以做兩件事情之一:

  1. 有你的函數返回一個int,布爾等等。如果參數在範圍內,那麼你的函數返回一些值,從而表示如此。否則,該函數返回一些值,表明參數不在範圍內。

事情是這樣的:

bool setRadius(double radius) 
{ 
    if(radius >= 0) 
    { 
     m_radius = radius; 
     return true; 
    } 
    else return false; 
} 

注意不要啓動/更改存儲在m_radius值如果「半徑」的說法是不是你的範圍內。將m_radius的價值改變爲不可接受的價值沒有意義 - 這是浪費時間。

  1. 在main()中檢查它(「在對話框中」?)

如果您想了解更多有關異常,可以參考這個頁面的一個例外就是一個更深入的瞭解:http://www.cplusplus.com/doc/tutorial/exceptions/

所以,我++和締結,該公約是檢查它在該方法中,並且如果該值超出可接受的範圍,則該方法會拋出異常。你可能不需要,如果你在課堂上,但還沒有涉及例外。祝你好運! :)

+0

您推薦的網站因其不正確和錯誤的文檔而臭名昭着。 –

+0

真的嗎?我提到它很多。 – user1899020

1

我可以在setRadius()方法中檢查半徑驗證,或者在對話框中檢查 。哪種方法更好?

如果系統非常小,GUI相對簡單,您可以在對話框類中檢查輸入。另一種解決方案是提供第三類作爲輸入驗證策略來檢查用戶輸入。

下面是一個非常簡單的代碼,可以使用模板爲不同的GUI設置不同的策略。

class CheckPolicy 
{ 
public: 
    CheckPolicy() {} 

    virtual bool ValidInput(double f) 
    { 
    return f > 0; 
    } 
}; 

class GUI 
{ 
public: 
    GUI(){} 
    void GetInput() 
    { 
     float f = 1.0f; 
     if (policy_.ValidInput(f)) 
     { 
     sphere_.setRadius(f); 
     } 
    } 
private: 
    CheckPolicy policy_; 
    Sphere  sphere_; 
}; 
3

我假設將根據用戶輸入調用set方法。如果是這樣,傳統的方法是set方法在提供異常值時拋出異常。例外應該一直傳播到UI

0

在我看來,這太過於面向對象。對於少於二三個變量,我不會創建一個具有getter-setter和一個私有數據的類 - 它沒有任何意義。它需要很多不必要的代碼。

您最好在UI前端進行數據驗證(例如通過DoDataExchange)。

如果您必須設計一個類來保存數據並進行數據驗證,請使用模板!

+0

我對你的方法很感興趣。我有很多隻有幾個成員的課程。你的意思是讓這些成員公開?你能告訴我一個非常簡單的例子,使用模板來保存數據並進行數據驗證嗎?非常感謝!! – user1899020

+0

首先告訴我們(在你的問題中),你使用的是什麼UI。 MFC? Win32的? Qt的?顯示一些代碼! – Ajay

+0

我打算使用Qt,並且仍處於設計階段。 – user1899020

1

我會建議一個不同的方法比在這裏休息。我只是把價值儲存在那裏。相反,當我調用球體上的Render(Image& target)函數來查看我的水晶球時,我會驗證所有參數都符合。也可以採用混合方法,在渲染時驗證球體在圖像邊界內時,驗證半徑是設置器中的非負浮點數。

還有就是辦法的一個根本區別:

  • 不使半徑變爲負值實際上意味着一個非負半徑是一類不變。將所有類不變量驗證成您通過RAII助手在所有(變異)成員函數的入口和出口處調用的效用函數對於調試是一件好事,因爲它會立即捕獲內部狀態(可能更多複雜而不僅僅是一個標量)在某種程度上變得不一致。爲了提高速度,我通常禁用這些發佈二進制文件的檢查,所以即使進行廣泛的檢查,您甚至不會失去任何性能。
  • 允許半徑變爲負值,但在稍後引發異常時會將其轉化爲由使用該值的操作(例如渲染)導致的故障。在某些情況下,這會使該操作期間無效的輸入值與內存不足無法區分,但它的優點是隻需將這些錯誤捕獲到一個地方。
相關問題