组合以及与所有者实例的交互

本文关键字:实例 交互 所有者 组合 | 更新日期: 2023-09-27 18:27:57

我想知道在使用组合(而不是聚合(时访问所有者实例的最佳实践是什么

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 类中声明一个事件。管理器实例订阅它,筛选器在需要时抛出它。

我觉得更像是使用第二种可能性。对我来说似乎更OOP,并且类之间的依赖关系更少(以后的任何重构都会更容易(,

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

任何见解将不胜感激

组合以及与所有者实例的交互

没有类实例的"所有者"的概念,Filter实例和碰巧具有它实例的对象之间不应该有任何强耦合。

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

总体而言,查看您的代码,您可能希望传入LoadState操作方法的相关数据,这样它就不必"伸出援手"。

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

我的简短回答:都不是。

出于多种原因,保留对所有者的引用的第一个选项是有问题的。 Filter类不再有单一的责任。 FilterManager紧密耦合。等。

第二种选择只是好一点,是的,我在类似的场景中使用了事件,它很少有好的结局。

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

1(你确定你的课程是应该的吗?也许应该有一个类来组成单个ElementToManage和单个Filter

2( 谁负责创建Filter?例如,如果它是Manager,也许Manager可以将列表作为构造参数给出?也许您可以创建一个执行任何所需初始化的 FilterFactory 类。

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

4(我经常使用"初始化设计模式"(我的术语(例如,我将有一个父项和子项相互指向的BinaryTreeFactory以纯状态构造节点,然后使用其他所需对象调用初始化方法。该类变得复杂,因为我可能需要确保未初始化的对象在所有其他用法中都会引发错误,并且需要确保对象仅初始化一次,仅通过Factory等进行初始化。但在我看来,如果它有效,它通常是最好的解决方案。

5(我还在努力学习"依赖注入",但一无所获,我想这可能与你的问题有关。我想知道是否有人会给出涉及依赖注入的答案。