我如何处理这么多逻辑/链接字段(有点长)?

How can I handle so much logic / linked fields (a bit long)?

我正在设计一个数据可视化工具 class:给定一个数据对象,它将在用户屏幕上创建一个可视化表示。

我有一些必须遵守的设计限制:

  1. class是有一个无参数的"Visualize"方法。一切 可视化设置为实例字段。
  2. class 的状态应该始终准确。

举例说明:

public class DataVisualizer {

    public DataObject Object { get { return _object; } set { // logic } }

    public void Visualize(){
        // visualize the data...  
    }
}

到目前为止一切顺利,但 class 也有一个 "DataObjectCollection" 实例字段。没有必要设置上述字段来可视化数据对象,但如果是,它将启用其他方法,例如 "VisualizeNext" 和 "VisualizePrevious"(必须修改可视化器的状态并调用可视化)。

举例说明:

public class DataVisualizer {

    public DataObjectCollection { get { return _dataObjectCollection; set { // logic } }
    public DataObject Object { get { return _object; } set { // logic } }

    public void Visualize(){
        // visualize the data...  
    }

    public void VisualizeNext(){
        Object = NextObjectInDataObjectCollection();
        Visualize(); 
    }

    public void VisualizePrevious(){
        Object = PreviousObjectInDataObjectCollection();
        Visualize(); 
    }
}

现在记住上面的设计限制#2。 举个例子,如果用户设置了DataObjectCollection,在设置的时候,我们需要检查DataObject是什么。如果 DataObject 不包含在 DataObjectCollection 中,我们需要将 DataObject 设置为 null 或 DataObjectCollection 中的第一个元素。另一方面,如果我们设置 DataObject,我们需要检查 DataObjectCollection 是否包含 DataObject。如果不是,我们需要将 DataObjectCollection 设置为 null。

为了让事情变得更复杂,我还需要跟踪正在为 VisualizeNext / Previous 方法可视化的数据对象的索引。 -1 表示集合为空。 (我不能使用 IndexOf,因为集合可能包含重复元素或空值。)

更糟糕的是,DataObjectCollection 实际上是另一个集合的一部分!所以本质上,我们的可视化工具看起来像这样:

public class DataVisualizer {

    public DataObjectOuterCollection { get { return _dataObjectOuterCollection; set { // logic } }
    public DataObjectInnerCollection { get { return _dataObjectInnerCollection; set { // logic } }
    public DataObject Object { get { return _object; } set { // logic } }

    public void Visualize(){
        // visualize the data...  
    }

    public void VisualizeNext(){
        Object = NextObjectInDataObjectCollection();
        Visualize(); 
    }

    public void VisualizePrevious(){
        Object = PreviousObjectInDataObjectCollection();
        Visualize(); 
    }
}

记住上面的第 2 点,事情变得复杂,因为每次设置一个字段时,我都需要检查其他字段的值并将它们设置为正确的值。例如,如果 InnerCollection 不包含在 OuterCollection 中,那么我需要将 InnerConnection 设置为 OuterCollection 的第一个元素或 null,然后对 DataObject 执行相同的操作。我还需要跟踪 InnerCollection 的索引!

有什么设计模式或代码结构可以让我更容易处理这么多逻辑吗?当一个字段仅 "linked" 到 1 个其他字段时,这很容易,但是当它是其中的 5 个时,管理起来很快就会变得很多!

听起来您需要一些单独的 类,具体取决于数据的来源。它们都可以实现一个接口,如下所示:

public interface IDataVisualizer
{
    void Visualize();
}

这样,您可以将基于集合的可视化工具和基于单项的可视化工具的规则拆分为单独的 类。

public class CollectionVisualizer : IDataVisualizer
{
    List<DataObject> objects;
    int index;

    void Visualize() { ... }
    void VisualizeNext() { ... }
    void VisualizePrevious() { ... }
}

public class SingleObjectVisualizer : IDataVisualizer
{
    DataObject object;

    void Visualize() { ... }
}

现在约束似乎更容易管理了。