Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GameManager类的单一责任原则_Java_Oop - Fatal编程技术网

Java GameManager类的单一责任原则

Java GameManager类的单一责任原则,java,oop,Java,Oop,我想知道,在考虑单一责任原则(SRP)的同时,有人如何证明创建一个游戏经理是合理的。具体示例:记忆游戏的GameManager(带有您必须匹配的卡)。它显然有很多责任:跟踪轮到谁了,在轮次之间切换,跟踪游戏结束时,谁是赢家等等。关键是,如果你做得好,GameManager类将不会直接承担你提到的所有责任。相反,它将把这些职责委托给其他类,这些类将通过某种形式的依赖注入传递给它。所以你可以说GameManager类只有一个职责:协调其他类的工作;只有一个原因需要改变:适应游戏逻辑的变化,需要新类参

我想知道,在考虑单一责任原则(SRP)的同时,有人如何证明创建一个游戏经理是合理的。具体示例:记忆游戏的GameManager(带有您必须匹配的卡)。它显然有很多责任:跟踪轮到谁了,在轮次之间切换,跟踪游戏结束时,谁是赢家等等。

关键是,如果你做得好,GameManager类将不会直接承担你提到的所有责任。相反,它将把这些职责委托给其他类,这些类将通过某种形式的依赖注入传递给它。所以你可以说GameManager类只有一个职责:协调其他类的工作;只有一个原因需要改变:适应游戏逻辑的变化,需要新类参与,或者改变类之间交互的顺序

一个非常简单的例子(对不起,C#语法,但你明白了):


当怀疑是否超出目标责任时。有一个与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();
    }
}