C++11 Getters&;C+中的setter+;

C++11 Getters&;C+中的setter+;,c++11,C++11,我一直在写一个简单的程序,我设计了一个简单的文本抽象——屏幕上的位置X/Y、框的大小X/Y、框中的文本以及对齐方式 但是现在我有了一个抽象概念,它只是一堆getter和setter。通常,我只会将这些内容公开给数据成员,但问题是我不能仅仅丢弃数据成员,因为在未来,有一种替代的代码路径,它们不存在于我的代码中,而是存在于外部库中。现在我有了一个可怕的笨拙的get/set接口(通过方法链进行了一些改进)。我能做些什么使它更干净 编辑:我的类定义 class Text { public: en

我一直在写一个简单的程序,我设计了一个简单的文本抽象——屏幕上的位置X/Y、框的大小X/Y、框中的文本以及对齐方式

但是现在我有了一个抽象概念,它只是一堆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();
};
类文本{
公众:
枚举文本布局{
左上角,
右上角,
左下角,
右下角,
居中
};
//正文
虚拟字符串GetText()=0;
虚拟文本*SetText(常量字符串&ref)=0;
虚拟文本*SetText(string&&ref)=0;
//位置
虚拟int GetPositionX()=0;
虚拟文本*SetPositionX(intx)=0;
虚拟int GetPositionY()=0;
虚拟文本*SetPositionY(inty)=0;
虚拟int GetSizeX()=0;
虚拟文本*SetSizeX(int sizex)=0;
虚拟int GetSizeY()=0;
虚拟文本*SetSizeY(int sizey)=0;
虚拟文本布局GetTextLayout()=0;
虚拟文本*SetTextLayout(TextLayout布局)=0;
虚拟std::shared_ptr GetFont()=0;
虚拟文本*SetFont(const std::shared_ptr&)=0;
虚拟文本*SetFont(std::shared_ptr&&)=0;
虚拟文本*SetColor(无符号整数颜色)=0;
虚拟无符号int getcolor()=0;
虚拟渲染*GetRender()=0;
虚拟文本();
};

我看不出你的代码有什么问题。但是,您可能会将其拆分为几个接口,例如Ipositiable(x,y)、iResizeable(width,height)、IAlignable(…) 然后制作一些超级接口ITextField,扩展ipositiable、iresizeable和IAlignable。但是,如果你不打算在其他地方使用更小的接口,那就太过分了。
这是一个基本的想法,但我通常将接口拆分为最小的逻辑位组。

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

我认为: 应该有一个班级职位,你的班级有一个职位成员。 应该有一个班级规模,并且你的班级有一个规模成员。 那么你就少了4个函数。和更干净的封装


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

您介意共享您的类定义吗?在我看来非常好…C++0x移动语义旨在强制执行便宜的返回值,而不是依赖优化器。我建议放弃“良好实践”,转而专注于编写清晰的代码。不仅如此,还可以轻松地允许移动,同时不允许复制,这也是非常强大的(因此移动语义)。很棒的编辑。您的单一责任评论非常有用。:cough:Java:cough:。说真的,虽然这是个很好的建议。如果您决定遵循此建议,请务必重温虚拟/菱形继承和其他多重继承难题。