Lanffulce 的个人资料Lanffulce G照片日志列表更多 工具 帮助
    1月19日

    一个关于主动对象的讨论

    一个关于主动对象的讨论
    今天突然想起来一个“主动对象”的问题。面向对象的程序设计正是现今主流趋势之一。但是,对象的主动问题如何解决或者说能不能解决呢?
    我们根据战争的实际情况进行下列假设:
    假设一:现有class Soldier,其数据成员有且只有“平面坐标”(float fPointX 和 float fPointY),成员函数有“移动”(void move(float fX, float fY));
    假设二:所有的Soldier实例在平面坐标轴上沿直线移动,速度为定值,并且每个Soldier的视野均相等也为定值;
    假设三:(也就是主动的问题)当Soldier周围有其他的Soldier进入他的视野的时候,就会发生战斗,然后随机将一个Soldier消除,也就是战死;

    现在进行简化设定:
    平面上有两个点,每个点是一个Soldier的实例(sa和sb),sa坐标为(0,0),sb坐标为(200,0),即两Soldier相距200单位(简化了y轴),每个Soldier的视野为150,当sb从相距151处移入sa视野时应如何处理?

    如果添加成员函数scan,不断地扫描所有的其它对象,那当对象多了的时候资源的使用就成了问题,这还姑且不论是否为友军和障碍物的问题。

    评论 (5)

    请稍候...
    很抱歉,您输入的评论太长。请缩短您的评论。
    您没有输入任何内容,请重试。
    很抱歉,我们当前无法添加您的评论。请稍后重试。
    若要添加评论,需要您的家长授予您相应权限。请求权限
    您的家长禁用了评论功能。
    很抱歉,我们当前无法删除您的评论。请稍后重试。
    您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
    因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
    完成下面的安全检查,您提供评论的过程才能完成。
    您在安全检查中键入的字符必须与图片或音频中的字符一致。

    若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


    还没有 Windows Live ID 吗?请注册

    李晶发表:
    抗原!看不懂!
    日志应该服务于大众!!
    6 月 16 日
    匿名 的图片
    Nicholas 发表:
    主动对象(Active Object Pattern)......这个名词是设计模式中出现的,基于Command Pattern的一种实现多现程控制的古老技术。

    这个对象的主动问题我觉得不是这么考虑的。
    首先涉及的OO的原则是SRP(单一职责原则),一个类都有自己明确的职责,不应该将很多不相关的方法集中在一个类里面。Solider类含有自己所在的地图的位置p,包含有scan range,具有一个方法move。

    //a sample implementation of Solider
    public class Solider {
    private Point p;
    private int status; //0 - dead, 0 - alive
    private float scan_range = 200f;
    public void move(float x, float y) { p.x += x; p.y += y; }
    public void getPoint() { return p; }
    public int getStatus() { return status; }
    public void setDeath() { status = 0; }
    public void kill(Solder target) { target.setDeath(); }
    }

    提到对象的主动,其实这是不对的。对象的主动不是说对象去很只能的应付各种情况,在OO里面,你需要一个全局的控制器去控制你的整个场景。不是Solider去主动识别在其范围内是不是含有其他Solider并且去杀死对方,你应该定义你如何杀死对方的逻辑操作,譬如如何根据对方的速度和轨迹确定在未来的几秒内对方会处于哪个坐标,然后根据你的子弹的速度和角度发射正好能杀死对方。建议参考IBM前几年出的RobCode这个小程序,估计你会有很大启发。

    谈到这个程序逻辑的控制问题,如果你需要Solider想你估计的那样运行起来,你需要一个Container,或者说是Manager类,负责随机或者按照你的规则去产生Solider各个实例的运动路线,同时负责计算每个Solider实例对应的坐标的范围内的敌人情况,并且调用Solider实例的处理逻辑去消灭敌人。

    可能我说的不是很明确,实际情况可能更复杂一点。建议参考RobCode的例子,他是以Tank做的例子。
    还有一个最主要的,也可以成为一个Best Practise,那就是不要一开始就考虑优化,避免过分优化,如果你没有确切的数据表明到后期会因为scan产生性能瓶颈的话那就不要过早的优化,这回带来不必要的麻烦。
    4 月 29 日
    匿名 的图片
    redfox741 发表:
    林林~我路過的~路過~
    3 月 11 日
    匿名 的图片
    魔法小雨 发表:
    class Soldier
    {
    private Point position;
    private Collection sight;
    public Move()
    {
    .....
    遍历sight,找到视野内的士兵
    .....
    }
    }

    class Point
    {
    private int x,y;
    private Soldier soldier;
    public void setSoldier(Soldier soldier);
    public Soldier getSoldier();
    }
    1 月 20 日
    匿名 的图片
    魔法小雨 发表:
    具体的我也说不好,可以用listener机制,或者用回调函数(不知行不行),这跟主动东数据库实际上不一样
    或者干脆写在move里,移动完之后看看视野内有没有其他的对象就可以了。
    1 月 19 日

    引用通告

    此日志的引用通告 URL 是:
    http://lanffulce.spaces.live.com/blog/cns!1A5890B2A01DF83!124.trak
    引用此项的网络日志