我有一个面向对象设计的问题 - 我有两个类,一个 Map (实际上是一个x,y网格)和 Items 放在地图上。地图包含所有项目及其位置,并控制程序流程。物品有一些智能,并确定是否希望在地图上移动。
例如,地图代码可能如下所示:
class Map
{
...
Items[,] map;
public void DoItemUpdate()
{
...
for (x = 0 to MaxX)
{
for (y = 0 to MaxY)
{
map[x,y].UpdateItem();
}
}
}
}
项目代码可能如下所示:
class Items
{
...
Vector2 location;
public void UpdateItem()
{
// determine if we want to move the unit
....
// if yes, move the unit
this.Move(fromXY, toXY);
}
public void Move(Vector2 from, Vector2 to)
{
// what goes in here - raise event, use reference to Map class?
}
}
基本上我正在努力解决的问题是如何构建移动代码,以便在移动是合法的时候询问地图,然后在地图中注册移动。
我想到了几种方法
对这些方法的任何评论 - 对OO代码最好/最干净/最合适的是什么? 谢谢!
答案 0 :(得分:3)
都不是。我会为你的Items添加一个方法(应该是Item?)class:
Vector2 GetMoveRequest();
定义Item可以返回的常量值,表示不想移动它。 (0,0)如果返回值表示增量,或者(-1,-1)如果返回值表示绝对位置。或者,如果您不想定义魔术值:
bool TryGetMoveRequest(out Vector2 request);
优点:
您现在已经在两个类中适当地分离了移动逻辑。该项目知道是否要移动,如果是,那么。 Map可以评估移动的合法性,然后根据您的逻辑执行或忽略Item的移动请求。没有引用处理,没有笨拙的回调机制。
此外,Map类中的逻辑将能够增加复杂性。考虑一个场景,其中一个项目的移动可能会阻止或被另一个项目的移动阻止。使用您列出的任何一种方法都很难实现。