低耦合与直观的对象设计
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" 。
我即将开始制作视频游戏,但遇到了设计难题。
我有一个名为 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" 。