java - 我在对象之间发送数据的方法有哪些缺陷?

标签 java oop

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

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

为了实现这一点,我让对象请求其他对象的 ID,以便它们可以相互发送消息,消息将传递给具有该 ID 的对象。

我必须解决的问题是有一种从其他对象请求数据的方法。例如车辆当前是否有驾驶员。我已经考虑了几种执行此操作的方法,但到目前为止,我最接近的是一种特殊类型的消息,其中发送者向另一个对象发送特殊消息,接收对象预计将请求的数据放入其中对象。

这是我编写的一个“ stub ”,用于说明该对象如何工作:

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;
    }
}

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

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

最佳答案

一些可能与您相关的注释:

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

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

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

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

关于java - 我在对象之间发送数据的方法有哪些缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797946/

相关文章:

java - SOAP 请求修改

applet - 安全异常 : Bad applet class name after upgrade to JRE 1. 7.0_13

ios - 协议(protocol)扩展后定义的函数?

java - 处理数据库子类的最佳设计?

python - 理解 Python super() 和 __init__() 方法

c# - OOP 说明

java - 如何从android中的字符串数组中获取随机值?

java - 为什么在尝试对 ResultSet 中检索到的列的值求和时出现错误?

java - Java 中的 Project Euler #22(关闭 7 364 934)

python - 复杂的 Python 对象到 JSON 的转换