我有一个相当大的课程,我想分开关键部分,但我不知道我的代码设计是否首选
class Something
{
public:
void draw()
{
m_drawer.draw();
}
private:
SomethingDrawer m_drawer;
}
class SomethingDrawer
{
public:
SomethingDrawer(Something* something) :
m_something(something)
{}
void draw()
{
drawSomethingObject();
drawSomeOtherObject();
}
private:
void drawSomethingObject();
void drawSomeOtherObject();
Something* m_something;
}
或者我应该将绘制所需的Something对象传递给drawSomethingObject/drawSomeOtherObject
,而SomethingDrawer不需要对Something的引用。
答案 0 :(得分:1)
虽然"首选"方法是一种意见问题,可能取决于你想要实现的细节,single responsibility principle表明最好不要将抽屉包装为实例属性而是通过你的#34 ;东西"对象"抽屉"如所须。如果是一个" Something"是保存关于某事物的数据,然后没有必要承担以某种形式呈现该数据的额外责任。
事实上,Model-View-Controller (MVC)设计模式正好利用了这种区别。如果" Something"保存您的数据(是模型),然后您决定要多种方式来绘制"绘制" (查看)该数据,然后避免绘图和数据保持类之间的耦合将为您提供更大的灵活性。
这里值得考虑的另一件事是,除非抽屉需要保持特定状态,否则#34; Something"数据(已经有点代码味道),你可以创建一个抽屉并传递它#34; Somethings"根据需要而不是为每个Something实例创建一个。