Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从遥远的对象访问方法的最佳方式_Java_Project Organization - Fatal编程技术网

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

Java:从遥远的对象访问方法的最佳方式,java,project-organization,Java,Project Organization,我目前正在进行我的第一个更大的java项目(一个游戏),我已经有了一些组织问题,因为只有少数(~40)个类。 我正在组织我的游戏,就像这样: int x = gui.engine.model.objHandler.player.playerSettings.getX(); 这对我来说似乎很有条理,因为每一个小班都被归入一个大班。显然,像ObjectHandler或Model这样的类将包含更多的类,否则它们将毫无用处 现在我的问题是:当我试图从GUI中的DynamicObjects访问当前的P

我目前正在进行我的第一个更大的java项目(一个游戏),我已经有了一些组织问题,因为只有少数(~40)个类。
我正在组织我的游戏,就像这样:

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

这对我来说似乎很有条理,因为每一个小班都被归入一个大班。显然,像
ObjectHandler
Model
这样的类将包含更多的类,否则它们将毫无用处

现在我的问题是:当我试图从
GUI
中的
DynamicObjects
访问当前的
PlayerSettings
时(例如,当我试图获取播放器的位置以便在画布上绘制它时),我必须创建一条长路径,如下所示:

int x = gui.engine.model.objHandler.player.playerSettings.getX();
(为此,我设置了大多数参数
public
。我还可以使用
get()
-方法来访问它们,但这对我来说似乎更无组织)


我的问题是——这看起来正常吗?或者有没有更好的方法来解决这个组织问题

清理这种依赖性混乱的快速方法是使用Google Guava的EventBus。您可以使用它来发布事件,然后订阅这些事件的任何内容都将对它们起作用,而所有组件都不知道彼此或事件的来源。这是一种有效解耦和有效管理依赖关系的快速方法


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

简单的回答是-不,您不希望出现必须取消引用六个对象才能获取所需数据的情况

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

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

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

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

您的GUI不应该知道播放器设置对象来自何处,也不应该有理由让GUI自己获取信息——相反,应该将对象注入GUI。有许多框架为您提供了支持,例如,但您也可以自己实现一个简单的版本,只需将对象作为参数提供给GUI、构造函数或特定的初始化方法

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

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

不,这不是您应该将依赖项耦合在一起的方式。根据经验,“每个单位只应与朋友交谈,不要与陌生人交谈”。另请参见:。这样公开访问所有内容通常是违反编程规则的。…/但我在过去做过这件事,那时我刚刚学会让事情变得简单。它起作用了。。。。但是我要说的是,对于任何您想要编写代码的应用程序,使用良好的实践和设计模式始终是您能够做到的最好的方法。对于游戏,为什么不试试这个链接呢?当我在不久前创建了RPG时,它对我很有用:@ McKMNEMONIC在C++好友中有权访问你的私人成员…这打破了许多国家的许多法律。1)静态的事物创造奇迹(虽然可能不是最好的实践,它可以缩短打字的数量);2)考虑编写你的函数将玩家对象作为参数。问题是大多数对象都与三种完全不同的树路径有关。播放器由控制器(用户输入)更改,由GUI读取,也可由时钟操作。将所有对象随机地扔在一起,并在许多类之间创建混乱的路径,这对我来说似乎更为混乱。但这意味着,当我的游戏增长时,我必须将数十个对象从
模型
类别传递到
图形用户界面
类别。即使这样,我也必须通过
引擎处理它,该引擎首先必须通过路径找到类,如
PlayerSettings
,然后将其发送到
GUI
。在您的示例中,将PlayerSettings对象传递给MyGUI很容易,但是如果我需要从不同的包中获得更多的对象,那么传递和初始化将非常困难。这可能意味着您的
GUI
类有太多的职责——将其拆分为具有明确职责的模块/类。我只是在这里指出一些一般原则——您可能想问另一个问题,关于如何最好地安排
Model
GUI
Engine
之间的交互。您可能已经熟悉了或相关的GUI设计概念?是的,我熟悉MVC概念。这就是为什么我的代码是l