组合和与所有者实例的交互

时间:2012-03-16 14:01:50

标签: c# .net-4.0

我想知道在使用合成(不是聚合)

时访问所有者实例的最佳做法是什么
public class Manager
{
    public List<ElementToManage> Listelmt;
    public List<Filter> ListeFilters;

    public void LoadState(){}
}

public class Filter
{
    public ElementToManage instance1;
    public ElementToManage instance2;

    public object value1;
    public object value2;

    public LoadState()
    {
    //need to access the property Listelmt in the owner instance (manager instance)
    //instance1 = Listelmt.SingleOrDefault(...
    }
}

到目前为止,我正在考虑两种可能性:

  1. 在过滤器实例中保留对所有者的引用。
  2. 在Filter类中声明一个事件。管理器实例订阅它,过滤器在需要时抛出它。
  3. 我觉得更像是使用第二种可能性。对我来说似乎更多OOP,并且类之间的依赖性更少(以后任何重构都会更容易),

    但从长远来看,调试和跟踪可能会有点困难。 关于业务层类,我不记得为此目的看到事件。

    非常感谢任何见解

3 个答案:

答案 0 :(得分:1)

没有类实例的“所有者”的概念,Filter实例与恰好具有该实例的对象之间不应存在任何强耦合。

在这种情况下,事件似乎是合适的:它允许松散耦合,同时启用您想要的功能。另一方面,如果你使用选项#1,你将限制Filter类的整体有用性 - 现在它只能包含在Manager类中,我不认为这就是你想要的想。

总体上看一下您的代码,您可能希望传递方法LoadState操作的相关数据,因此不必“伸出”。

答案 1 :(得分:1)

我建议过滤器实例的所有者的引用。事件可以由更多处理程序处理,并且可以更改先前处理程序的结果。并且您不希望在过滤器的生命周期内更改所有者而不通知过滤器实例。

答案 2 :(得分:0)

我的简短回答:两者都没有。

由于多种原因,保留对所有者的引用的第一个选项存在问题。 Filter课程不再承担任何责任。 FilterManager紧密相连。等

第二个选项只是稍微好一些,是的,我在类似的场景中使用了事件,但很少结果很好。

如果没有更具体的细节,很难给出明确的建议。一些想法:

1)你确定你的课程应该是这样吗?也许应该有一个班级来组成一个ElementToManage和一个Filter

2)谁负责创建Filter?例如,如果它是Manager,那么Manager可能会将列表作为构造参数给出?也许你可以创建一个FilterFactory类来完成任何需要的初始化。

3)谁打电话给filter.LoadState()?也许所需的列表可以作为参数传递给LoadState()方法。

4)我经常使用“初始化设计模式”(我的术语)例如,我将有一个BinaryTree,其中父母和孩子将互相指向。 Factory以普通状态构造节点,而不是使用其他所需对象调用initialize方法。该类变得复杂,因为我可能需要确保未初始化的对象为每个其他用法引发错误,并且需要确保对象仅初始化一次,仅通过Factory初始化,等等。但是如果它在我看来,它通常是最好的解决方案。

5)我仍在尝试学习“依赖注入”而无处可去,我想这可能与你的问题有关。我想知道是否有人会得到一个涉及依赖注入的答案。