Java GameManager类的单一责任原则
我想知道,在考虑单一责任原则(SRP)的同时,有人如何证明创建一个游戏经理是合理的。具体示例:记忆游戏的GameManager(带有您必须匹配的卡)。它显然有很多责任:跟踪轮到谁了,在轮次之间切换,跟踪游戏结束时,谁是赢家等等。关键是,如果你做得好,GameManager类将不会直接承担你提到的所有责任。相反,它将把这些职责委托给其他类,这些类将通过某种形式的依赖注入传递给它。所以你可以说GameManager类只有一个职责:协调其他类的工作;只有一个原因需要改变:适应游戏逻辑的变化,需要新类参与,或者改变类之间交互的顺序 一个非常简单的例子(对不起,C#语法,但你明白了):Java GameManager类的单一责任原则,java,oop,Java,Oop,我想知道,在考虑单一责任原则(SRP)的同时,有人如何证明创建一个游戏经理是合理的。具体示例:记忆游戏的GameManager(带有您必须匹配的卡)。它显然有很多责任:跟踪轮到谁了,在轮次之间切换,跟踪游戏结束时,谁是赢家等等。关键是,如果你做得好,GameManager类将不会直接承担你提到的所有责任。相反,它将把这些职责委托给其他类,这些类将通过某种形式的依赖注入传递给它。所以你可以说GameManager类只有一个职责:协调其他类的工作;只有一个原因需要改变:适应游戏逻辑的变化,需要新类参
当怀疑是否超出目标责任时。有一个与SRP相关的概念,它非常客观。在中,GameManager具有100%的凝聚力。这意味着所有依赖项(实例字段)都在所有公共方法中使用 0%则相反:
class GameManager {
private int anInt;
private object aObj;
public void Foo() {
// Do anything but using anInt or aObj
}
}
如果在对象中发现多个内聚组件:
class GameManager {
private T1 obj1;
private T2 obj2;
public void Foo() {
T1.F1();
}
public void Goo() {
T2.G1();
}
}
该类应分为两部分:
class GameManagerFoo {
private T1 obj1;
public void Foo() {
T1.F1();
}
}
class GameManagerGoo {
public void Goo() {
T2.G1();
}
}
Jackl56:关于属性设置器和获取器,您有两个选项。你不能把它们考虑进去,或者你可以认为它们降低了你的凝聚力,但是达到了一个可接受的水平。这种设计的后续问题是:您是否总是使用接口(IPlayerManager、iTunesManager),或者在某些情况下,您可能会说,编程到一个实现是可以的,因为它不太可能改变。换句话说,我质疑抽象的必要性。(否则,在整个程序生命周期中,每个接口关系有一个类,这似乎是多余的)@Jackl56您的代码应该始终依赖于实现,而不是具体的类。否则,您将得到不可测试的紧密耦合代码。看看这里:我已经阅读了链接。非常有用。所以我知道它不会那么容易测试,但撇开可测试性不谈,编写具体类有什么错?我同意这会使这些类之间紧密耦合,但这有什么错呢?(除了可测试性)撇开你不能呼吸这一事实不谈,溺水有什么不对吗?:-)不要低估可测试性,它是您的代码无论如何都必须具备的关键特性。好主意。但是,如果一辆汽车具有不同的特性,例如颜色和车轮数量,那该怎么办呢。然后,我将拥有只对类成员变量子集进行操作的属性(get/set)方法。或者再想想,这些都不是依赖关系。所以,当你说依赖关系时,你指的是引用其他类的成员变量。这样说对吗?
class GameManagerFoo {
private T1 obj1;
public void Foo() {
T1.F1();
}
}
class GameManagerGoo {
public void Goo() {
T2.G1();
}
}