我正在设计一个数据可视化器类:给定一个数据对象,它将在用户的屏幕上创建它的可视化表示。
我必须遵守一些设计限制:
举例说明:
public class DataVisualizer {
public DataObject Object { get { return _object; } set { // logic } }
public void Visualize(){
// visualize the data...
}
}
到目前为止这么好但是这个类也有一个" DataObjectCollection"实例字段。为了可视化数据对象,不需要设置上述字段,但如果是,则它将启用其他方法,例如" VisualizeNext"和" VisualizePrevious" (必须修改可视化工具的状态并调用Visualize)。
举例说明:
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是什么。如果DataObjectCollection中没有包含DataObject,我们需要将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中没有包含InnerCollection,那么我需要将InnerConnection设置为OuterCollection的第一个元素或null,然后使用DataObject执行相同的操作。我也需要跟踪InnerCollection的索引!
我可以遵循任何设计模式或代码结构,以便更容易处理如此多的逻辑吗?当一个字段只是"链接"对于其他一个领域来说,这很容易,但是当其中的5个领域,它很快就会变得很难管理!
答案 0 :(得分:0)
听起来您需要一些单独的类,具体取决于数据的来源。它们都可以实现单个界面,如下所示:
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() { ... }
}
现在约束似乎更容易管理。