我即将开始制作视频游戏而且我有一个设计难题。
我有一个名为GameWorld的主类,还有一个名为Missile的小类。当一个导弹实例爆炸时,它应该会损坏它周围的所有船只。
我提出了两种方法:
// APPROACH A:
// in class Missile
explode()
{
for each (ship in GameWorld.getShips()) {
if (distanceTo(ship)) <= BLAST_RADIUS) {
ship.dealDamage(DAMAGE);
}
}
}
/* creates coupling that allows Missile to call GameWorld and all of
* it's methods, which is bad. but also keeps the entire explosion
* process within Missile which is intuitive object design.
*/
// APPROACH B:
// in class GameWorld
update()
{
.
.
.
if (missile.position.equals(missile.destination)) {
for each (ship in shipsArray) {
if (distanceTo(ship)) <= missile.BLAST_RADIUS) {
ship.dealDamage(missile.DAMAGE);
}
}
}
.
.
.
}
/* no two-way coupling from GameWorld to Missile since Missile has no
* reference to GameWorld which is good.
* but explosion is now something being done by the GameWorld and not
* Missile, which is an unintuitive design. also when expanding this design
* approach to the rest of the objects and interactions
* GameWorld can become sort of a "god class" with all smaller objects being very thin
*/
那么哪种方法更好?是否值得通过向GameWorld提供导弹参考来联接这些类,以便它可以使用它的getter来在Missile.explode()中完成整个爆炸过程,或者第二个不那么直观且耦合度较低的方法应该更好?
提前感谢。
答案 0 :(得分:3)
方法1绝对优于方案2。
你知道, GameWorld 可能是你游戏中真正的核心元素;你不能没有它。当然,你要确保这个中心类......仍然尽可能少地管理(你想避免这个类......最后,做一切)。
从这个意义上讲,似乎非常合理, GameWorld 具有查询该世界的元素(船只)的方法。而其他类,例如 Missile 可以调用此类方法来收集所需的信息以及他们的&#34;工作
对于选项2,您或多或少地放弃了对 Missile 类的需求。由于 GameWorld 类实际上正在完成大部分/全部关键工作。
你看,你选择的模型似乎区分了元素(如船只或导弹);和#34;世界&#34;这些元素存在于中。在这个意义上: GameWorld 的责任是跟踪你世界中的所有元素。但是当时的每个元素都要负责做自己的事情&#34;到底。