在类之间传递参数 - 使用公共属性或传递属性类作为参数?

时间:2010-04-07 14:38:01

标签: c# java design-patterns oop properties

因此,假设我有一个名为ABC的类,它将包含一个Point对象列表。

我需要用它们制作一些绘图逻辑。这些Point对象中的每一个都将具有将由ABC类调用的Draw()方法。

Draw()方法代码需要来自ABC类的信息。

我只能看到两种让他们拥有此信息的方法:

  1. 让Abc类公开一些允许draw()做出决定的属性。
  2. 让Abc类传递给draw()一个充满属性的类。
  3. 两种情况下的属性都是相同的,我的问题是在这种情况下首选的。也许第二种方法更灵活?也许不吧?我没有在这里看到一个明显的赢家,但这肯定与我的经验相关,而不是任何其他事情。

    如果还有其他好方法,请随时分享。

    以下是两种情况:

    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;
    }
    

    此外,如果这两种方法有任何“正式”名称,我想知道它们,以便我可以更好地选择标签/线程名称,因此它对于搜索目的更有用。那或者随意编辑它们。

5 个答案:

答案 0 :(得分:2)

创建和维护一个单独的类以在ABCpoint之间传递状态会更有效,但是如果你想要pointABC分离,那么值得做}。

主要的问题是,如果它重要的话,将它们分离对你来说有多重要?如果在你的域中让点实例了解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的“参数传递类”上都没有任何依赖性。