我已经在很多地方读过SRP是一个很好的应用原则,我想在我的项目中应用它。
实际上,它是一个游戏,我的对象基本上有两个函数update
和draw
,因此它们有两个响应(定义为"改变的原因" )。它看起来像这样:
class Object {
public:
void update() {
// implementation...
}
void draw() {
// implementation...
}
};
我们假设我选择使用组件设计模式将update
和draw
拆分为UpdateComponent
和DisplayComponent
,使用这些的对象组件仍然会有update
/ draw
对,但不再是它们的实现。所以它现在看起来像这样:
class Object {
public:
void update() {
m_updateComponent.update(*this);
}
void draw() {
m_displayComponent.draw(*this);
}
private:
UpdateComponent m_updateComponent;
DisplayComponent m_displayComponent;
};
在此实现中,update
和draw
被视为对象和的组件的责任,还是仅被视为组件的责任,因此对象与SRP一致?< / p>
答案 0 :(得分:1)
您已经考虑了改变&#34;的理由。并移动它。现在,如果需要更改绘图或更新,则无需更改Object
类。这与SRP一致。
但是,你有一些不必要的耦合。您可以判断,因为DisplayComponent
和Object
之间存在双向依赖关系。为什么Object
需要了解(依赖于)DisplayComponent
甚至UpdateComponent
?
你有:
DisplayComponent <--> Object
(这些线代表一种依赖关系,即你不能在没有指向另一个的情况下编译一个)
你只需要:
DisplayComponent ---> Object
但是,如果你不能从对象那里做到这一点,你将如何到DisplayComponent
致电draw
?
ObjectContainer --\
--> UpdateComponent ---> Object
--> DisplayComponent --/
所以我介绍了一个新的ObjectContainer
类,它知道(取决于)UpdateComponent
,DisplayComponent
和Object
。
您的外部游戏循环只能访问ObjectContainer
,只能通过m_updateComponent
更改游戏状态,并通过m_displayComponent
进行抽奖。 Object
现在唯一的责任就是坚持对象的状态:
class Object {
public:
//getters/setters maybe
private:
int x;
int y;
float speed;
float health;
//etc
};
class ObjectContainer {
public:
void update() {
m_updateComponent.update(object);
}
void draw() {
m_displayComponent.draw(object);
}
private:
Object object;
UpdateComponent m_updateComponent;
DisplayComponent m_displayComponent;
};
上述ObjectContainer
与您的Object
非常相似,但没有双向依赖。