2010-12-21 78 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