【发布时间】:2021-12-04 21:01:12
【问题描述】:
假设以下基线设计:我有一个类CarElement,它包含与汽车的视觉表示和数据模型/逻辑表示相关的属性和方法:
class carElement
{
// UI related properties and methods:
public Size DrawSize { get; set; }
public Point Location { get; set; }
public void Draw()
{
// do something...
}
// data model / logic related properties and methods:
public double weight { get; set; }
public string manufacturer { get; set; }
public double CalculatePrice()
{
// do something...
return 0;
}
}
这个类的用法如下:carElement的多个实例被绘制到某个画布上。单击每辆绘制的汽车,使用propertygrid.SelectedObject = InstanceOfcarElement 在属性网格中显示该汽车的属性。
在我看来,这种设计是有缺陷的,因为数据模型和视觉表示在类设计中没有分开。我想改进 MVC 的设计,我正在寻求有关良好设计决策的建议。
我目前对此的看法是将上面的类 carElement 分成类似以下两个类。
class carUIElement // organizes visual representation of a car
{
public Size DrawSize { get; set; }
public Point Location { get; set; }
private carDataElement linkedCarDataElement;
public void Draw()
{
// do something...
}
}
class carDataElement // organizes data model organization of a car
{
public double weight { get; set; }
public string manufacturer { get; set; }
private carUIElement linkedCarUIElement;
public double CalculatePrice()
{
// do something...
return 0;
}
}
使用这种方法,我不清楚以下几点:
-
carUIElement应该知道它所链接的carDataElement,反之亦然。有没有比上面代码中的简单链接更好的设计方法? - 当点击绘制的 UIElement 时,如何最好地在属性 Grid 上显示 UI 和数据模型属性?
整体方法可行吗?以上开放点呢?我错过了判断这一点的经验,所以我会感谢你的 cmets。谢谢。
【问题讨论】:
-
MVC 与此示例中的关注点分离无关。我不认为 WinForms
PropertyGrid是模型、视图或控制器中的任何一个的示例。 -
"
CarUIElement应该知道它所链接的CarDataElement,反之亦然。" - 这是不正确的:虽然CarUIElement一定需要了解CarDataElement,但反之则不然:CarDataElement不应该关心它是如何呈现的,因此CarDataElement不需要引用任何@987654336 @。此外,您应该确保您的类型永远不会处于无效状态:您的构造函数应该始终将对象初始化为有效状态(因此在适当的情况下使用 ctor 参数和readonly字段/属性)。 -
“当单击绘制的 UIElement 时,我如何最好地在属性 Grid 上显示 UI 和数据模型属性” - 不幸的是,由于
PropertyGrid的限制(以及 C# 缺乏真正的 mixins)你需要一个 third 类,它结合了 both 类型(CarUIElement和CarDataElement)的所有可变属性,only 被PropertyGrid。或者......为什么不拥有两个属性网格? -
感谢 cmets。我同意你的第二条评论。关于第一个:如果我的问题在严格的软件设计方面不是真正的 MVC,那么请接受我的道歉并忍受我,因为计算机科学不是我的主要教育。
标签: c# oop model-view-controller class-design propertygrid