Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

Java 课堂设计中的责任委托

Java 课堂设计中的责任委托,java,oop,Java,Oop,我在这里遇到了一个情况,我希望验证什么是更好的(设计)方法 假设我有一个类“XController”,它包含/实例化一组“XObject”实例。我有一个客户机负责实例化XController 现在,如果我想对实例化的XObject执行一些操作,建议执行以下哪项操作: 方法1: 方法2: 注: 控制器在doStuff()之前/之后实际上不执行任何操作 doStuff()的实现通常只会更新该对象的状态 任何关于为什么一个比另一个更好的引用都是非常值得赞赏的。首先,这是相当抽象的,因此只能猜测代码

我在这里遇到了一个情况,我希望验证什么是更好的(设计)方法

假设我有一个类“XController”,它包含/实例化一组“XObject”实例。我有一个客户机负责实例化XController

现在,如果我想对实例化的XObject执行一些操作,建议执行以下哪项操作:

方法1: 方法2: 注:
  • 控制器在doStuff()之前/之后实际上不执行任何操作
  • doStuff()的实现通常只会更新该对象的状态

任何关于为什么一个比另一个更好的引用都是非常值得赞赏的。

首先,这是相当抽象的,因此只能猜测代码的意图

这两种方法几乎是一回事。在这两种情况下,消费代码都在告诉x1做一些事情您应该使用方法#2,因为使用代码的实体似乎知道它有一个x1,并且它希望x1做些什么。有一个原则叫做;只有知道如何做某件事的代码才应该是做这件事的代码

如果使用方法#1,您所做的似乎就是让另一个类负责调用一个对象,而消费代码已经知道应该调用它。事实上,如果消费者知道调用x1.DoStuff(),为什么要将其交给其他对象并要求其执行该操作

说到这里,这里缺少了很多变量:控制器在对每个对象调用DoStuff()之前总是做些什么吗?调用DoStuff()后,控制器是否执行某些操作?调用DoStuff()是否会更改控制器中任何内容的状态?等等


在没有更多细节之前,我只能给你提供最好的信息。

如果不知道更多细节,很难说清楚

但是,如果调用代码现在不需要任何关于XObject的信息,那么第一种解决方案可能会更好,因为XController包装了XObject。这样,如果需要,可以在不影响调用方的情况下更改XObject


如果你能对你要编写的代码给出更详细的描述,你可以给出更好的建议。

尽管没有提供足够的信息,但仅仅根据所呈现的内容,第二种方法比第一种方法更好。因为,如果您想在XObject上执行操作,那么通过中介(XController)执行该操作违反了OOP(封装等)的原则,而且不必要地使代码变得复杂(它将一个工作单元分散在多个位置)

而且,这里你称之为控制器的东西似乎是一种Repositofy,你向它提供某种ID,它向你提供对象。这也是为什么在XController中对XObject执行“填充”可能不是一个好主意的另一个原因

XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

x.doStuff(x1); // which does some stuff with the XObject with id 'x1'
XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

XObject xObj1 = x.getXObject(x1); 
xObj1.doStuff(); // which does some stuff with(in) itself