低耦合与直观的对象设计

low coupling vs intuitive object design

我即将开始制作视频游戏,但遇到了设计难题。

我有一个名为 GameWorld 的主 class 和一个名为 Missile 的小 class。当一个导弹实例爆炸时,它应该会损坏它周围的所有船只。

我想出了两种方法来做到这一点:

// 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 提供 Missile 引用来耦合 classes,以便它可以使用它的 getters 以便在 Missile.explode() 内完成整个爆炸过程,或者第二种不那么直观和耦合度较低的方法应该更好?

提前致谢。

方法 1 绝对优于选项 2。

您看,GameWorld 可能是您游戏中真​​正的核心元素;你离不开它。当然,你要确保这个中央 class ... 仍然管理尽可能少的事情(你想避免这个 class ... 最后,做所有事情)。

从这个意义上说,GameWorld 具有查询该世界的元素(飞船)的方法似乎非常合理。其他 classes,例如 Missile 可以调用此类方法来收集执行 "their" 工作所需的信息。

而对于选项 2,您或多或少地放弃了对 导弹 class 的需要。由于 GameWorld class 实际上正在做 most/all 关键工作本身。

你看,你选择的模型似乎可以区分元素(例如舰艇或导弹); "world" 这些元素存在于其中。从这个意义上说:GameWorld 有责任跟踪您世界中的所有元素。但是最后每个元素都负责 "doing its thing" 。