我一直在写一个简单的程序,我设计了一个简单的文本抽象 - 屏幕上的位置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();
};
答案 0 :(得分:3)
您应该精确地封装每个概念。比照Single Responsibility Principle
我认为: 应该有一个职位,你的班级有职位成员。 应该有一个类Size,并且你的类有一个size成员。 那你就少了4个功能。更清洁的封装。
编辑:删除了关于通过引用传递参数而不是按副本返回
的注释答案 1 :(得分:1)
我看不出你的代码有什么问题。但是,您可以将其拆分为多个接口,例如IPositionable(x,y),IResizable(宽度,高度),IAlignable(...) 然后制作一些超级接口ITextField,扩展IPositionable,IResizable和IAlignable。但是如果你不打算在其他任何地方使用那些较小的接口 - 这只是一种矫枉过正。 这是一个基本的想法,但我通常将接口拆分为最小的逻辑位组。