因此,假设我有一个名为ABC的类,它将包含一个Point对象列表。
我需要用它们制作一些绘图逻辑。这些Point对象中的每一个都将具有将由ABC类调用的Draw()方法。
Draw()方法代码需要来自ABC类的信息。
我只能看到两种让他们拥有此信息的方法:
两种情况下的属性都是相同的,我的问题是在这种情况下首选的。也许第二种方法更灵活?也许不吧?我没有在这里看到一个明显的赢家,但这肯定与我的经验相关,而不是任何其他事情。
如果还有其他好方法,请随时分享。
以下是两种情况:
class Abc1 {
public property a;
public property b;
public property c;
...
public property z;
public void method1();
...
public void methodn();
}
这是方法2:
class Abc2 {
//here we make take down all properties
public void method1();
...
public void methodn();
}
class Abc2MethodArgs {
//and we put them here. this class will be passed as argument to
//Point's draw() method!
public property a;
public property b;
public property c;
...
public property z;
}
此外,如果这两种方法有任何“正式”名称,我想知道它们,以便我可以更好地选择标签/线程名称,因此它对于搜索目的更有用。那或者随意编辑它们。
答案 0 :(得分:2)
创建和维护一个单独的类以在ABC
和point
之间传递状态会更有效,但是如果你想要point
与ABC
分离,那么值得做}。
主要的问题是,如果它重要的话,将它们分离对你来说有多重要?如果在你的域中让点实例了解abc实例是有意义的,那么创建参数类可能就不值得了,你应该选择1。
答案 1 :(得分:2)
最佳方法取决于ABC需要提供给Point实例的信息的性质,这些类之间关系的性质以及它们的“预期”未来。换句话说,有很多定性因素。
如果您确实将Point实例传递给了ABC实例,那么不要 - 而是根据Point需要从ABC中获取适当的抽象,并将其封装在接口中。在静态术语中,这类似于简单地创建一个新类来封装信息,但动态地完全不同。
你不应该简单地传递ABC实例的原因是它创建了一个循环依赖。在没有太多细节的情况下,除非绝对必要,否则通常应将其视为非常糟糕的事情并避免使用。
并且,在更抽象的层面上,如果您确定了这种明显的循环依赖性的原因并将因子分解出来,它将更有意义并且稍后启用逻辑更改 - 即,创建一个界面来表示“点数据”的数据源ABC必须履行的职责。此角色与“容器为点”角色不同,应该反映在您的设计中。
你也可以将参数传递给draw()方法 - 这可能是好的还是坏的,这取决于一堆因素。只要您考虑过这些影响,这肯定不是一件非常糟糕的事情。
答案 2 :(得分:1)
使用方法#2,但没有对象。只需将参数直接传递给Draw
。
答案 3 :(得分:1)
由于Point
类和ABC
似乎必须在自己之间进行调整,为什么不在draw()
调用Point
方法,通过实际的ABC
对象作为参数。 ABC
对象可以提供访问器方法(不公开这些属性!),点类(或子类实现)可以决定在ABC
上回调什么。
答案 4 :(得分:1)
您可能需要考虑撤消依赖项。而不是点从ABC访问属性,而是在每个点上调用“draw()”时(或之前)对点设置属性。类似于在Swing的JTable中渲染单元格时使用的Flyweight pattern(见javadoc)。您还可以考虑将Point
(数据模型)与PointDrawer
(可重用的呈现代码)分离。这样你的积分将不依赖于所有这些属性,只有你的PointDrawers会。
是的,即使您在绘图时明确地将所有参数传递给每个Point,它也是OO编程 - 这样,Points在ABC或ABC的“参数传递类”上都没有任何依赖性。