不可循环初始化的代码可读性
Code-readability of non-loopable initilazations
想象一下,您必须初始化一些您无法真正在循环中处理的对象。除了调用构造函数之外,您还必须使用提供的数据以某种方式初始化对象。最后,您还想以不同的方法使用该对象。为了可读性甚至计算,是否推荐方法A或B?
方法A
DummyObject a = new DummyObject("fs", "y", 4);
a.init("aseas", true);
otherObjectA.addDummy(a);
DummyObject b = new DummyObject("qwe", "sd", 8);
b.init("a4rhs", true);
otherObjectA.addDummy(b);
DummyObject c = new DummyObject("j", "xe", 39);
c.init("as", false);
otherObjectB.addDummy(c);
DummyObject d = new DummyObject("qw", "k", 12);
d.init("sdfs", true);
otherObjectC.addDummy(d);
// and so on...
方法B
DummyObject a = new DummyObject("fs", "y", 4);
DummyObject b = new DummyObject("qwe", "sd", 8);
DummyObject c = new DummyObject("j", "xe", 39);
DummyObject d = new DummyObject("qw", "k", 12);
a.init("aseas", true);
b.init("a4rhs", true);
c.init("as", false);
d.init("sdfs", true);
otherObjectA.addDummy(b);
otherObjectB.addDummy(c);
otherObjectA.addDummy(a);
otherObjectC.addDummy(d);
// and so on...
1) 为什么不在 DummyObject 的构造函数中包含 init() 方法的内容?构造函数的目的也是对象的初始化。
2) 如果你有充分的理由保持这种方式并且你有很多 DummyObjects 以这种方式配置,一个更具可读性的解决方案是提取一个方法来执行初始化并为每个 DummyObject 添加步骤:
我会使用方法 A :
DummyObject d = new DummyObject("qw", "k", 12);
d.init("sdfs", true);
otherObjectC.addDummy(d);
我会提取一个新的方法:
DummyContainer container = ...;
DummyObject a = new DummyObject("qw", "k", 12);
initAndAddDummyObject(a, container,"sdfs",true);
...
DummyObject b = new DummyObject("qwe", "sd", 8);
initAndAddDummyObject(b, container,"a4rhs", true);
...
public void initAndAddDummyObject(DummyObject source, DummyContainer container, String initString, boolean initBoolean){
source.init(initString, initBoolean);
container.addDummy(source);
}
我无法告诉您这些对象之间的关系,以及您是否可以使用 Facade 模式将功能组合在一起或只是一个接口。我在这里看到的是您可以使用工厂模式来创建和初始化您的对象。
关于代码的可读性由你决定,我更喜欢方法A。
想象一下,您必须初始化一些您无法真正在循环中处理的对象。除了调用构造函数之外,您还必须使用提供的数据以某种方式初始化对象。最后,您还想以不同的方法使用该对象。为了可读性甚至计算,是否推荐方法A或B?
方法A
DummyObject a = new DummyObject("fs", "y", 4);
a.init("aseas", true);
otherObjectA.addDummy(a);
DummyObject b = new DummyObject("qwe", "sd", 8);
b.init("a4rhs", true);
otherObjectA.addDummy(b);
DummyObject c = new DummyObject("j", "xe", 39);
c.init("as", false);
otherObjectB.addDummy(c);
DummyObject d = new DummyObject("qw", "k", 12);
d.init("sdfs", true);
otherObjectC.addDummy(d);
// and so on...
方法B
DummyObject a = new DummyObject("fs", "y", 4);
DummyObject b = new DummyObject("qwe", "sd", 8);
DummyObject c = new DummyObject("j", "xe", 39);
DummyObject d = new DummyObject("qw", "k", 12);
a.init("aseas", true);
b.init("a4rhs", true);
c.init("as", false);
d.init("sdfs", true);
otherObjectA.addDummy(b);
otherObjectB.addDummy(c);
otherObjectA.addDummy(a);
otherObjectC.addDummy(d);
// and so on...
1) 为什么不在 DummyObject 的构造函数中包含 init() 方法的内容?构造函数的目的也是对象的初始化。
2) 如果你有充分的理由保持这种方式并且你有很多 DummyObjects 以这种方式配置,一个更具可读性的解决方案是提取一个方法来执行初始化并为每个 DummyObject 添加步骤:
我会使用方法 A :
DummyObject d = new DummyObject("qw", "k", 12);
d.init("sdfs", true);
otherObjectC.addDummy(d);
我会提取一个新的方法:
DummyContainer container = ...;
DummyObject a = new DummyObject("qw", "k", 12);
initAndAddDummyObject(a, container,"sdfs",true);
...
DummyObject b = new DummyObject("qwe", "sd", 8);
initAndAddDummyObject(b, container,"a4rhs", true);
...
public void initAndAddDummyObject(DummyObject source, DummyContainer container, String initString, boolean initBoolean){
source.init(initString, initBoolean);
container.addDummy(source);
}
我无法告诉您这些对象之间的关系,以及您是否可以使用 Facade 模式将功能组合在一起或只是一个接口。我在这里看到的是您可以使用工厂模式来创建和初始化您的对象。
关于代码的可读性由你决定,我更喜欢方法A。