我的第一个模块中有一堆Shape
- 类(经典),如Rectangle
和Circle
。
在我的第二个模块中,我有一个用WPF制作的GUI。我想显示所有ListBox
个类的Shape
个。 ListBox
应包含形状的可本地化名称(保存为资源字符串)和图标(保存为资源图像)。
我希望我的整个代码尽可能模块化,例如如果我添加一个新的Shape
- 类,我想尽可能少地改变类。
我的第一个方法是在我的GUI模块中创建一个帮助器类,每个形状包含Shape
的{{1}},其名称为Type
,其图标作为string
(或类似)。然后我会在一个地方初始化列表,例如
Bitmap
并将此列表绑定到var shapeList = new List<ShapeHelperClass>
{
new ShapeHelperClass(typeof(Rectangle), Resources.StringRectangle, Resources.IconRectangle),
new ShapeHelperClass(typeof(Circle), Resources.StringCircle, Resources.IconCircle),
};
。现在,如果我重命名我的类或我的资源,没有什么会破坏,本地化应该正常工作。但是,当然,如果在第一个模块中添加新的ListBox
- 类,我还需要更新此列表。
另一种方法是使用反射来查找我的所有Shape
类,并从中构建列表。但是,我仍然需要一些字典或类似的东西来将类映射到资源。如果他们遵循模式,我可以找到资源,如“Icon”+“Classname”。但是,如果未找到图标,则仅在运行时注意到这一点。
所以,我的问题是:
Shape
的程序员还添加新资源并扩展映射列表?也许通过单元测试?答案 0 :(得分:1)
1.我的第一个方法是好的,我们可以改进吗?
您可以在第一个模块中创建一个返回所有形状的方法,并在客户端应用程序中调用此方法,例如:
var imageObj = new Image();
var card = new Konva.Image({
x: 200,
y: 50,
width: 100,
height: 100,
image: imageObj
});
imageObj.onload = function() {
card.getLayer().draw();
};
imageObj.src = '/path/to/image.jpg';
// later
imageObj2.src = '/path/to/image.jpg'; // it should trigger onload
然后,您不应该在第一个模块中添加或删除形状时修改客户端应用程序。
2.如何确保添加新Shape的程序员还添加新资源并扩展映射列表?也许通过单元测试?
也许你可以编写一个单元测试,它使用反射来查找所有形状类型,并断言它们包含在从第一个模块返回的形状列表中。同样对于资源。我无法想到任何更好的自动确保方法。