java设计:子对象的重复方法
java design: repetitive methods of sub-objects
当我在做我的一个项目并且不得不使用很多嵌套对象时,当我想设置一个深度的实例变量时,我对我在 Java 中的结构设计变得非常不确定来自上层对象的嵌套对象。感觉好像我错过了 Java 中对结构化设计的基本理解。对此有任何见解表示赞赏。
假设我有一个对象,它的逻辑结构是将嵌套的子对象作为变量。例如:
Country
Capital
Palace
King
如果我现在想从主对象(国家/地区)在 King 中设置一个私有字符串变量 'nameOfKing',我将不得不在 King 的所有上层 class 中定义每个方法。所以像这样:
public class Country {
private Capital capital;
public void setNameOfKing(String n) {
capital.setNameOfKing(n);
}
}
public class Capital{
private Palace palace;
public void setNameOfKing(String n) {
palace.setNameOfKing(n);
}
}
public class Palace{
private King king;
public void setNameOfKing(String n) {
king.setNameOfKing(n);
}
}
public class King{
private String nameOfKing;
public void setNameOfKing(String n) {
this.nameOfKing = n;
}
}
这样我就可以打电话给 country.setNameOfKing(n);
。现在,如果您只有几个变量,这很好,但是如果 classes King、Palace、Capital 各自定义了许多其他变量和方法,并且所有这些都必须从 Country 调用。如果 Palace 还包含其他 class 对象,如(现在只是在编造东西)ThroneRoom、Treasury、Queen 等……这意味着对于子 classes 中的几乎所有方法,一个有存在于国家 class,这可能意味着您必须创建大量方法来将信息传递给子对象,从而导致非常大的国家 class.
现在我想你可以从技术上说 King 也可以在国家本身中定义,取消 Palace 和 Capital 中的额外方法,但这仍然意味着这些方法必须存在于国家中 class 如果这种结构在逻辑上组合在一起是有意义的,那么最好的方法是什么?我不确定是否有更好的方法,但我无法摆脱我在这里遗漏某些东西的感觉。
这是一个责任问题。
问问自己:"Who is responsible for knowing who the king is?"。当你是皇宫的时候,你对国王负责吗?明显不是。国王不受你的宫殿管理,但他依法律依附于你的国家。
查询 palace.setNameOfKing()
类似于要求您的房子给您的新生儿起个名字。你家没有这个责任,也不应该让你做。
正确的做法是检索King
实例,并直接设置其名称。
现在这种方法有一个问题:您可能必须使用许多 getter 才能找到 King
实例。但是您可以使用 类.
的函数式方法解决此问题
palace.getOwner()
可以 return 接口 Owner
与 King implements Owner
.
同样的规则可以应用到你的另一个 类。
当我在做我的一个项目并且不得不使用很多嵌套对象时,当我想设置一个深度的实例变量时,我对我在 Java 中的结构设计变得非常不确定来自上层对象的嵌套对象。感觉好像我错过了 Java 中对结构化设计的基本理解。对此有任何见解表示赞赏。
假设我有一个对象,它的逻辑结构是将嵌套的子对象作为变量。例如:
Country
Capital
Palace
King
如果我现在想从主对象(国家/地区)在 King 中设置一个私有字符串变量 'nameOfKing',我将不得不在 King 的所有上层 class 中定义每个方法。所以像这样:
public class Country {
private Capital capital;
public void setNameOfKing(String n) {
capital.setNameOfKing(n);
}
}
public class Capital{
private Palace palace;
public void setNameOfKing(String n) {
palace.setNameOfKing(n);
}
}
public class Palace{
private King king;
public void setNameOfKing(String n) {
king.setNameOfKing(n);
}
}
public class King{
private String nameOfKing;
public void setNameOfKing(String n) {
this.nameOfKing = n;
}
}
这样我就可以打电话给 country.setNameOfKing(n);
。现在,如果您只有几个变量,这很好,但是如果 classes King、Palace、Capital 各自定义了许多其他变量和方法,并且所有这些都必须从 Country 调用。如果 Palace 还包含其他 class 对象,如(现在只是在编造东西)ThroneRoom、Treasury、Queen 等……这意味着对于子 classes 中的几乎所有方法,一个有存在于国家 class,这可能意味着您必须创建大量方法来将信息传递给子对象,从而导致非常大的国家 class.
现在我想你可以从技术上说 King 也可以在国家本身中定义,取消 Palace 和 Capital 中的额外方法,但这仍然意味着这些方法必须存在于国家中 class 如果这种结构在逻辑上组合在一起是有意义的,那么最好的方法是什么?我不确定是否有更好的方法,但我无法摆脱我在这里遗漏某些东西的感觉。
这是一个责任问题。
问问自己:"Who is responsible for knowing who the king is?"。当你是皇宫的时候,你对国王负责吗?明显不是。国王不受你的宫殿管理,但他依法律依附于你的国家。
查询 palace.setNameOfKing()
类似于要求您的房子给您的新生儿起个名字。你家没有这个责任,也不应该让你做。
正确的做法是检索King
实例,并直接设置其名称。
现在这种方法有一个问题:您可能必须使用许多 getter 才能找到 King
实例。但是您可以使用 类.
palace.getOwner()
可以 return 接口 Owner
与 King implements Owner
.
同样的规则可以应用到你的另一个 类。