2

我是一名主要电子背景进入编程的学生。我越深入,我就越意识到我在这方面有多糟糕。我正在努力在 OO 设计方面做得更好。我一直在阅读的一件事是 Getter 和 Setter 的使用。

http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html?page=1 http://typicalprogrammer.com/?p=23

现在我可以看到他们在这里提出的观点,但我仍然无法避开一些简单的问题。这让我想到了我的问题(最后)。我正在 AS3 中设置一个简单的塔防游戏作为学习练习。我希望敌人跟随航路点,所以我要创建一个航路点数组,并将其作为地图对象的属性。一个方法是成为一个具有 x 和 ay 属性的对象(更像是一个结构)。现在我可以看到这正是文章不鼓励的那种不好的做法,但我似乎想不出更好的方法来做到这一点。任何有更多经验的人的帮助将不胜感激。

4

4 回答 4

3

首先概括;虽然您目前希望敌人跟随航路点,但在我看来,您拥有的是地图的特定实例,可确定某物的移动位置。

让我们称敌人为“GameEntity”的实例(可能是 MoveableGameEntity)。

您应该做的是告诉地图管理相关的游戏实体,然后地图可以保留这些对象的列表并根据需要移动它们。

代码片段。

interface  MoveableGameEntity
{
    void positionNotify(Position new_postition);
};

public class Barbarian implements MoveableGameEntity
{
    void positionNotify(Position new_postition)
    {
         // do something
    }
};

// during initialisation.
map.Add(new Enemy("Barbarian 1"));
map.Add(new Enemy("Barbarian 2"));

//during map processing
Position new_position = new Position();
for (MoveableGameEntityList moveable : moveable_game_entity_items)
{
   new_position = get_new_posistion(moveable);
   item.moveTo(new_position);
   moveable.positionNotify( new_position );
}

地图需要有一个方法 get_new_position(MoveableGameEntity ge) 来确定新的位置,并且敌人只会通过 positionNotify 方法被告知他们的新位置。

MoveableGameEntityList 是一个将游戏实体及其位置联系在一起的对象。这样,游戏实体不包含任何位置信息,并且由另一个对象管理。

于 2010-02-28T12:44:49.473 回答
2

好的,接下来是沉重的假设:我认为您对效率的考虑太多了。OO 编码与效率无关。这是关于优雅的设计。这是关于最大限度地减少外部因素的副作用并保护内部状态。这就是编译器“优化”的原因。您应该主要考虑可维护性和编码难度。您编写的行数可能比非 OO 代码多。那不是重点。

尝试将您的“对象”视为可以相互交流的有形物品。这种通信是一种协议(包括方法签名)。你们彼此“说”的语言。让它简单明了。永远不要假设任何对象有能力操纵另一个超出其传达建议或请求(封装)的能力。

不要只是毫无目的地向所有内容添加 getter 和 setter。你会错过整点,还不如用另一种风格编码。保护内部状态。一切的获取者和设置者只是意味着你将有一个普遍低效的实现。Setter 和 getter 是守门人。而已。如果它们没有意义,请消除它们。在他们做的地方使用它们。永远不要让其他东西干扰你的内部状态。它会制造混乱。

在编写游戏时,这些做法会失败,但不能放弃。优化您的关键循环和阻塞点。保留您的原始代码以供参考并作为优化代码的镜像模型。走你需要的捷径,仅此而已。优化必须始终排在最后……即使面对明显低效但深思熟虑的设计。

我曾与许多前 Java 编码员一起工作,不必要地将 setter 和 getter 放在属性上(每个属性)。这只是他们习惯的。10 例中有 9 例没有好处,但他们坚持这种模式。影响总是微不足道的(每分钟 50k 用户……当然,不使用 Java……但仍然如此)。在高级设计中,getter 和 setter 的总影响是最小的。较低级别,如在视频编解码器或 OpenGL 中,它是巨大的。

您可以选择不假思索地采用它们,或者考虑到适用性来实施它们。您发现许多教授告诉您您“错了”,因为您忽略了他们。牢记您对课程作业的期望。:)

于 2010-02-28T06:52:18.517 回答
1

我不希望将其视为坏习惯与好习惯,而是范式的转变。不幸的是,这并不像拨动开关那么简单。随着你对不同的看待事物的方式越来越有经验,这是逐渐发生的事情。

我能给你的最好建议就是开始编码。很多。

于 2010-02-28T05:48:37.357 回答
1

有点无关,但如果你想进入 OO 设计,我有 2 v. 好书给你,易于理解和掌握。

头部第一:OOAD

头部第一:设计模式

于 2010-02-28T12:49:31.820 回答