我正在创建这个小型Angular应用程序,以创建一个图形,其中包含SVG元素中显示的节点和链接,并且可以将其保存在数据库中并进行加载。
我创建了3个主要的类模型来表示图形的对象: 图,节点,链接
为了构建图形,我可以使用不同类型的Node,并在Node类中使用字符串属性“ type”来识别它们。可以是“圆形”,“正方形”,“矩形” ...等等 由于这一点,我可以根据其type属性在Angular NodeComponent中显示节点。
我的环境中的配置对象中列出了不同类型的节点。 每个节点的图形特征也在配置中列出(颜色,大小,边缘或射线或L等等)
现在这是我的问题。我要对每个节点执行几项检查。这些检查的逻辑取决于节点的类型。例如,如果我计算节点的面积,则取决于类型,公式将不相同。
我现在要做的是在服务中创建函数。在计算之前会检查节点类型。
calculateArea(node: Node) {
switch (node.type) {
case 'circle': {
...
}
case 'square': {
...
}
case 'rectangle': {
...
}
default: {
break;
}
}
}
我有几个功能。其中一些编辑我对象的属性,另一些仅用于显示HTML中的信息,并且不应在我的对象中写入任何数据(这些数据将保存在数据库中)
问题是,当我想添加新型节点时,需要去编辑代码中的许多内容: -列出不同类型节点的配置 -具有我的新节点类型的图形特征的配置 -每个服务中的不同功能,添加带有代码的案例 等等...
这似乎不是最佳选择。
有没有一种组织和构造代码的方法,以便我可以更轻松地创建新型的Node。
我考虑过创建具有静态属性(颜色,射线,边线...)的独特类Circle,Square,Rectangle ...等,并可能使它们实现Interface(使用几种方法:calculateArea)。 ..)。我还考虑过让它们扩展Node类。
但是然后我将在不同的对象和数据库中重复使用图形属性(当前在配置中),并且我将必须实现所有方法,尽管其中一些方法不需要实现(我们可以使用默认方法)
组织代码的最佳解决方案是什么? 想法是...如果我想创建新类型的节点“ Star”,则只需创建一个包含所有信息的新ts文件(带有类),然后在代码中的某个地方引用该文件即可。 (所以我的应用知道这种新型节点的存在)
最终的目标是,在用户决定向图中添加一个时,最终目的是延迟加载那些不同类型的节点(具有图形特性,功能代码段)。
请让我知道是否不清楚。另外,我希望我的问题不要太琐碎。 谢谢
答案 0 :(得分:0)
即使您没有创建单独的不同类,也可以在Node类上定义calculateArea
,这样您的服务就不必负责计算任何给定Node上的那些属性,因此您的服务只要您支持的节点集发生更改,就无需更改。
这不一定意味着Node是抽象基类,Circle,Square和Rectangle分别来自不同的类。即使您只是基于Node中的this.type
进行切换,对于代码组织而言,这也可能更好。然后,您可以选择读取Node或Node工厂内部的配置文件(静态方法或根据需要创建Node实例的单独类)。
但是,考虑到您的问题,对我而言,Circle,Square和Rectangle需要使用不同的代码对我来说很有意义:它们的计算面积并不相同。因此,我认为编写一个代表所有节点变化方式的配置文件将很困难。相反,我认为您应该遵循为每种Node类型创建单独的具体类的想法,因为无论如何您都需要更改代码以支持新的节点类型。对于不需要代码变化的类似问题(例如,您支持基于配置的品牌,模型和汽车颜色的驾驶游戏),您绝对可以在模型对象中放置独立的逻辑,而无需创建多态子类。