Java:从远处的对象访问方法的最佳方式

时间:2015-05-04 21:47:14

标签: java project-organization

我目前正在开发我的第一个更大的java项目(一个游戏),而且我只有一些组织问题,只有几个(~40个)类。 我正在组织这样的游戏:

Project Organisation Model

这对我来说似乎非常有条理,因为每个小班级都被归类为更大的班级。显然,ObjectHandlerModel等类会包含更多类,否则它们将无用。

现在我的问题是:当我尝试访问PlayerSettingsDynamicObjects的当前GUI时(例如,当我试图获取时)玩家的位置,以便在画布上绘制),我必须创建一个这样的长路径:

int x = gui.engine.model.objHandler.player.playerSettings.getX();

(为此我设置了大多数参数public。我也可以使用get() - 方法访问它们,但这对我来说似乎更无组织了)

我的问题是 - 这看起来是正常的还是有更好的方法来解决这个组织问题?

3 个答案:

答案 0 :(得分:2)

简短的回答是 - 不,你不会想要一个你必须取消引用六个对象才能获得所需数据的情况。

这可能意味着您将数据和功能分解为类的问题。您通常希望将必须相互通信的对象组合在一起。

一个实用的建议是,您的对象不必形成树。 DynamicObjects保持对PlayerSettings的引用可能是有意义的。这只是一个例子:我不知道你的应用程序中有什么意义,我只想指出你不必将对象关系视为一棵树。

关于get方法与公共成员:将私有变量与getter和setter一起使用是一种Java约定。它与可维护性和更改功能中的实现有关。即使这不能说服你,我认为获得Java编码中常见的样式标准是件好事。

答案 1 :(得分:2)

正如Law of Demeter建议的那样,让依赖项松散耦合并尽可能地忽略其他类,有助于使您的应用程序更易于维护。减少组件之间的耦合使您能够快速重构或更改单个模块/类。

您的GUI不应该知道播放器设置对象的来源,也不应该知道GUI本身获取信息的原因 - 相反,对象应该注入到GUI 。有许多框架可以为您Dependency injection启用Google Guice,但您也可以通过简单地将对象作为参数提供给GUI,构造函数或特定的初始化来实现简化版本。方法

public class MyGUI {
    private PlayerSettings settings;
    //...    
    public void initialize(PlayerSettings settings) {
        this.settings = settings;
    }
    //...
}

此外,尝试将代码组织到有意义的包中,并降低包中类的可见性,以便无法从“远程”访问它们。仅在包外部公开API以供其他人使用和查看。这同样适用于类中的方法和字段;你不应该使用public字段(除了常量)。在尽可能少的外部公开信息,您将能够重构您的类(或包)中的代码,而不会破坏“远离”的代码。

答案 2 :(得分:0)

清理像这样的依赖关系的快速方法是使用Google Guava的EventBus。您可以使用它来发布事件,然后订阅这些事件的任何事情都会对它们起作用,所有事件都没有任何组件相互了解或事件来自何处。它是一种快速有效地解耦并有效管理依赖关系的方法。

如果你想要更优雅的东西,看看反应式编程并探索RxJava。