Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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

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
Design patterns 依赖项注入链接是一种反模式吗?_Design Patterns_Oop_Dependency Injection - Fatal编程技术网

Design patterns 依赖项注入链接是一种反模式吗?

Design patterns 依赖项注入链接是一种反模式吗?,design-patterns,oop,dependency-injection,Design Patterns,Oop,Dependency Injection,这就是问题所在,假设我们正在制作一个视频游戏,并且想要使用依赖注入。以下是我们所拥有的: Game Class // This is just the code to keep track of the overall game logic Character Class // This would be the guys in the game, good and bad guys both Weapon Class // The weapons for the characters 所以

这就是问题所在,假设我们正在制作一个视频游戏,并且想要使用依赖注入。以下是我们所拥有的:

Game Class  // This is just the code to keep track of the overall game logic
Character Class // This would be the guys in the game, good and bad guys both
Weapon Class // The weapons for the characters
所以通常当我进行依赖注入时,我会将地图上的当前位置和游戏状态注入角色,这样我的角色就可以知道在哪里创建自己,等等。然后我让角色创建武器,并注入武器强度的值,以及游戏类中的一些其他一般游戏状态等

在我看来,这几乎是一种反模式。我这么说是因为现在你有(至少在我看来是这样)非常脆弱和难以更改的代码。如果我们想更改传递的游戏状态信息,我们必须更改所有三个类。我们对游戏类进行原始更改,然后修改角色,最后修改武器类。这是一个很大的工作,特别是如果你要去5个层次的深度,而不仅仅是这里的3个层次。虽然是的,但它比没有DI更容易进行单元测试

这听起来又像是坏习惯。这就是通常的做事方式吗?什么是我们有一种“母舰”模式,一切都在顶级。所以,我们让游戏(或其他职业)创建所有角色,而不是游戏创建角色创建武器


这样,如果我们想为角色添加新武器,游戏类只需创建武器本身并将其注入。我不知道该怎么办。谢谢

设计问题很难回答,尤其是当示例似乎没有意义时。在这种情况下,角色创建武器是没有意义的。一个角色应该对这个角色负责。也许你可以给一个角色添加武器,但是,除非这个角色是一个武器制造者,否则我认为它实际上不会创建一个新的武器类


顺便说一句,我认为比这两种模式更好的模式是工厂模式。创建一个负责创建武器的类。以及一个负责创建角色的类。这样,如果在创建角色时有3或4个位置需要更改,则该工厂可以处理该行为,并包含该行为以备将来更改。

链接或嵌套依赖项是一种非常自然的做法(尽管我不得不同意tster的观点,您的示例听起来有点奇怪),但我想我能理解为什么你觉得它很脆弱——也就是说,如果你把混凝土类型注入到消费者身上

诀窍是在每个依赖级别引入一个接口,这样您就可以独立于使用者改变实现。例如,您应该定义一个
IGame
接口,并将其注入
角色
类,而不是
游戏
类本身


即使如此,具有大量深层嵌套的接口仍然可能很脆弱,因为您可能需要太频繁地更改接口本身。这最好是通过尽可能地遵守和来解决。

我认为设计问题对您来说可能没有意义,因为您可能已经知道了正确的方法?那只是猜测。我想我仍然停留在旧式的OO思维中,每个班级都有很多子班级(就像一个世界有房子,有房子的人,有衣服的人等等)。你的建议对我来说很有意义。我认为一个角色必须知道他的武器,但那可以直接注射。感谢您提供有关工厂模式的提示。不过,我通常遇到的情况只是一个例子。这个例子是我见过的最好的一个。你必须注意的是,对象实际上是在哪里创建的。当您使用“new”关键字时,您将自己锁定在单个实现中,因此需要对其进行控制。此外,无论是谁创建了一个对象,都要对它负责,直到他们能够将它传递给负责它的其他人为止。在{House,Person,costs}示例中,衣服类型的对象应该在其他地方创建,并提供给Person或House对象。好的,这就是我的问题。我的依赖性倒过来了。前几天我写了一个类似的问题,很多人认为依赖链是完全正常的,所以我想这并不是每个人都知道的。您是否知道有任何原则或书籍真正涉及正确的依赖顺序和重要实践,如这些?谢谢