2010-12-21 145 views
2

我已經寫了一個簡單的程序,我已經設計了一個簡單的文本抽象。吸氣劑和二傳手在C++

但現在我有這樣的抽象模型,它只是一堆getter和setter。通常情況下,我只是把這些東西當成公共數據成員,但問題在於我不能僅僅查看數據成員,因爲將來會有一個替代代碼路徑,它們不存在於我的代碼中,但是在一個外部庫。現在我有一個可怕的笨重的get/set接口(通過方法鏈有所改進)。我能做些什麼來使它更清潔?

編輯:我的班級定義。

class Text { 
public: 
    enum TextLayout { 
     TopLeft, 
     TopRight, 
     BottomLeft, 
     BottomRight, 
     Center 
    }; 
    // Text 
    virtual string GetText() = 0; 
    virtual Text* SetText(const string& ref) = 0; 
    virtual Text* SetText(string&& ref) = 0; 

    // Position 
    virtual int GetPositionX() = 0; 
    virtual Text* SetPositionX(int x) = 0; 
    virtual int GetPositionY() = 0; 
    virtual Text* SetPositionY(int y) = 0; 
    virtual int GetSizeX() = 0; 
    virtual Text* SetSizeX(int sizex) = 0; 
    virtual int GetSizeY() = 0; 
    virtual Text* SetSizeY(int sizey) = 0; 
    virtual TextLayout GetTextLayout() = 0; 
    virtual Text* SetTextLayout(TextLayout layout) = 0; 

    virtual std::shared_ptr<Font> GetFont() = 0; 
    virtual Text* SetFont(const std::shared_ptr<Font>&) = 0; 
    virtual Text* SetFont(std::shared_ptr<Font>&&) = 0; 

    virtual Text* SetColour(unsigned int colour) = 0; 
    virtual unsigned int GetColour() = 0; 

    virtual Render* GetRender() = 0; 

    virtual ~Text(); 
}; 
+0

返回傳遞參數你介意分享類定義有何評論? – karlphillip 2010-12-21 15:44:06

+0

看起來對我來說完全不錯... – bezmax 2010-12-21 15:52:07

回答

3

你應該精確封裝每一個概念。比照Single Responsibility Principle

我認爲: 應該有一個職位職位,而你的職位有一個職位成員。 應該有一個班級大小,而你的班級有一個大小的成員。 然後你有4個功能少。和一個更清潔的封裝。

編輯:刪除我的有關文獻,而不是通過複製

1

我看不出你的代碼有什麼問題。但是,你很可能它分成幾個接口,例如IPositionable(X,Y),IResizable(寬,高),IAlignable(...) 然後使擴展IPositionable,IResizable和IAlignable一些超級接口ITextField。但是如果你不打算在其他任何地方使用這些小接口 - 這只是一個矯枉過正的問題。 這是一個基本的想法,但我通常將接口拆分爲最小的邏輯位組。

+0

:咳嗽:Java:咳嗽:.儘管在這種情況下這是很好的建議。如果你決定遵循這個建議,一定要記住虛擬/鑽石繼承和其他多重繼承問題。 – 2010-12-21 16:55:35