0

我正在制定一个游戏项目的布局,并为“抽象游戏世界”的实现提出了一些具体的想法。

在这个游戏世界中,一切都被表示为一个游戏对象(车辆、单位、粒子效果……)。我想保持这些对象隔离,以便在运行时它们之间不存在任何依赖关系。

为此,我让对象请求其他对象的 ID,以便它们可以相互发送消息,然后将消息传递给具有该 ID 的对象。

我必须解决的问题是要有一种从其他对象请求数据的方法。例如,车辆当前是否有司机。我已经考虑了一些方法来做到这一点,但到目前为止,我最接近的是一种特殊类型的消息,其中发送方向另一个对象发送特殊消息,接收对象应将请求的数据放入其中目的。

这是我为说明对象如何工作而编写的“存根”:

public class DataRequestMessage extends Message {
    public final RequestedDataType dataType;
    private boolean requestedDataReceived = false;
    private String stringValue;

    public DataRequestMessage(MessageType type, RequestedDataType dataType) {
        super(type);
        this.dataType = dataType;
    }

    public void setString(String value) {
        if(requestedDataReceived) {
            throw new RuntimeException("The content of the data request object has already been set");
        }
        if(dataType != RequestedDataType.String) {
            throw new RuntimeException("Data type object expects a value of type " + dataType + ", but received one of type String.");
        }
        requestedDataReceived = true;
        this.stringValue = value;
    }

    public String getString() {
        if(dataType != RequestedDataType.String) {
            throw new RuntimeException("This data type object has type " + dataType + ", and can therefore not return a String value.");
        }
        return stringValue;
    }
}

如您所见,当该对象未按预期使用时,它将成为雷区。但是,我仍然担心一个对象期望另一个对象做某事,从而在两者之间产生依赖关系。

这种方法是从其他对象请求任意数据的好方法吗?或者期望另一个函数对提供的对象执行操作总是一个坏主意?

4

1 回答 1

1

一些可能与您相关的注意事项:

  • 您正在实施的已经是一个既定的设计,称为 Actor 模型。在推出自己的系统之前,至少研究一下现有系统可以为您做什么似乎是明智的;

  • 您基本上放弃了 Java 的静态类型安全性并在运行时进行所有检查,就像在动态语言中一样。是的,它实现了解耦,但它必然意味着更多的运行时错误。但是,这些错误很难追踪和修复。这就是为什么人们不会拒绝动态语言的原因;

  • 我建议将数据类型验证作为您的框架的一项功能(或现有的,如果您找到合适的);将该关注点与实际的消息传递分开。

可能是您学习另一种基于 JVM 的语言的机会,这将使这一切更容易处理。Scala 实现了一个 Actor 模型,所需的样板代码比 Java 少得多。另一个绝佳的选择是 Clojure。

于 2013-02-10T13:25:13.483 回答