吸气剂和用C ++编写

时间:2010-12-21 15:40:37

标签: c++11

我一直在写一个简单的程序,我设计了一个简单的文本抽象 - 屏幕上的位置X / Y,盒子X / Y的大小,文本内部和对齐。

但是现在我有了这个抽象,它只是一堆吸气剂和制定者。通常情况下,我只是将这些东西作为公共数据成员,但问题是我不能只是放入数据成员,因为在将来,有一个替代代码路径,在我的代码中它们不存在,但在外部图书馆。现在我有一个可怕的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();
};

2 个答案:

答案 0 :(得分:3)

您应该精确地封装每个概念。比照Single Responsibility Principle

我认为: 应该有一个职位,你的班级有职位成员。 应该有一个类Size,并且你的类有一个size成员。 那你就少了4个功能。更清洁的封装。

编辑:删除了关于通过引用传递参数而不是按副本返回

的注释

答案 1 :(得分:1)

我看不出你的代码有什么问题。但是,您可以将其拆分为多个接口,例如IPositionable(x,y),IResizable(宽度,高度),IAlignable(...) 然后制作一些超级接口ITextField,扩展IPositionable,IResizable和IAlignable。但是如果你不打算在其他任何地方使用那些较小的接口 - 这只是一种矫枉过正。 这是一个基本的想法,但我通常将接口拆分为最小的逻辑位组。