低耦合与直观对象设计

时间:2016-12-02 01:44:55

标签: oop coupling

我即将开始制作视频游戏而且我有一个设计难题。

我有一个名为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()中完成整个爆炸过程,或者第二个不那么直观且耦合度较低的方法应该更好?

提前感谢。

1 个答案:

答案 0 :(得分:3)

方法1绝对优于方案2。

你知道, GameWorld 可能是你游戏中真正的核心元素;你不能没有它。当然,你要确保这个中心类......仍然尽可能少地管理(你想避免这个类......最后,做一切)。

从这个意义上讲,似乎非常合理, GameWorld 具有查询该世界的元素(船只)的方法。而其他类,例如 Missile 可以调用此类方法来收集所需的信息以及他们的&#34;工作

对于选项2,您或多或少地放弃了对 Missile 类的需求。由于 GameWorld 类实际上正在完成大部分/全部关键工作。

你看,你选择的模型似乎区分了元素(如船只或导弹);和#34;世界&#34;这些元素存在于中。在这个意义上: GameWorld 的责任是跟踪你世界中的所有元素。但是当时的每个元素都要负责做自己的事情&#34;到底。