避免文件导出器中基于节点的文件类型的依赖地狱?
Avoiding dependency hell in file exporter for node based file type?
我正在努力为我正在编写的 VRML 文件导出器想出一个合适的设计模式。您的典型 VRML 文件具有如下层次结构:
Transform {
translation 0 0 100
children [
Shape {
appearance Appearance {
texture ImageTexture {
repeatS TRUE
repeatT TRUE
url [
"texture.png"
]
} # end texture
} # end appearance
geometry IndexedFaceSet {
normalPerVertex TRUE
solid TRUE
coord Coordinate {
point [
-5.400000 0.030000 -0.000000,
...
] # end point
} # end coord
texCoord TextureCoordinate {
point [
0.062500 0.086207,
...
] # end point
} # end texCoord
normal Normal {
vector [
0 1 0,
]
} # end normals
coordIndex [
0, 1, 2, -1,
...
] # end coordIndex
texCoordIndex [
0, 1, 2, -1,
...
] # end texCoordIndex
normalIndex [
0, 0, 0, -1,
...
] # end normalIndex
} # end geometry
} # end shape
] # end children
} # end Transform
现在我继承自一个名为 Node 的基础 class,它具有您的基本 start/end 字符串。不过,这开始造成依赖地狱。这是一个例子:
#include "IndexedFaceSetNode.h"
#include "TextureCoodinateNode.h"
#include "NormalNode.h"
struct GeometryNode : Node
{
IndexedFaceSetNode* indexedFaceSet;
TextureCoordinateNode textureCoordinate;
NormalNode normal;
GeometryNode(string isNormalNodePerVertex, string isSolid, vector<float> coordinates, vector<int> ind) :
Node("\tGeometryNode IndexedFaceSet { \n",
"\t}\n")
{
indexedFaceSet = new IndexedFaceSetNode(isNormalNodePerVertex, isSolid, coordinates, ind);
}
};
我该怎么办?我可以使用更好的模式或 OOP 结构吗?
你应该仔细看看复合模式。
它对于构建树结构很有用,并允许通过使用公共抽象以相同的方式处理分支和叶组件。
您可以使用像 Node(模式上下文中的组件)这样的通用抽象来统一处理 GeometryNode class 中的所有子元素。
因此,您必须通过重写方法来使用多态性,也许运行时检查加上强制转换才能执行特定行为。
有多种变体,各有优缺点。
因此,我建议您在决定如何改进您的实现之前详细研究该模式。
例如基本了解 Composite pattern Wikipedia
或更详细:Composite pattern presentation
我正在努力为我正在编写的 VRML 文件导出器想出一个合适的设计模式。您的典型 VRML 文件具有如下层次结构:
Transform {
translation 0 0 100
children [
Shape {
appearance Appearance {
texture ImageTexture {
repeatS TRUE
repeatT TRUE
url [
"texture.png"
]
} # end texture
} # end appearance
geometry IndexedFaceSet {
normalPerVertex TRUE
solid TRUE
coord Coordinate {
point [
-5.400000 0.030000 -0.000000,
...
] # end point
} # end coord
texCoord TextureCoordinate {
point [
0.062500 0.086207,
...
] # end point
} # end texCoord
normal Normal {
vector [
0 1 0,
]
} # end normals
coordIndex [
0, 1, 2, -1,
...
] # end coordIndex
texCoordIndex [
0, 1, 2, -1,
...
] # end texCoordIndex
normalIndex [
0, 0, 0, -1,
...
] # end normalIndex
} # end geometry
} # end shape
] # end children
} # end Transform
现在我继承自一个名为 Node 的基础 class,它具有您的基本 start/end 字符串。不过,这开始造成依赖地狱。这是一个例子:
#include "IndexedFaceSetNode.h"
#include "TextureCoodinateNode.h"
#include "NormalNode.h"
struct GeometryNode : Node
{
IndexedFaceSetNode* indexedFaceSet;
TextureCoordinateNode textureCoordinate;
NormalNode normal;
GeometryNode(string isNormalNodePerVertex, string isSolid, vector<float> coordinates, vector<int> ind) :
Node("\tGeometryNode IndexedFaceSet { \n",
"\t}\n")
{
indexedFaceSet = new IndexedFaceSetNode(isNormalNodePerVertex, isSolid, coordinates, ind);
}
};
我该怎么办?我可以使用更好的模式或 OOP 结构吗?
你应该仔细看看复合模式。
它对于构建树结构很有用,并允许通过使用公共抽象以相同的方式处理分支和叶组件。
您可以使用像 Node(模式上下文中的组件)这样的通用抽象来统一处理 GeometryNode class 中的所有子元素。
因此,您必须通过重写方法来使用多态性,也许运行时检查加上强制转换才能执行特定行为。
有多种变体,各有优缺点。 因此,我建议您在决定如何改进您的实现之前详细研究该模式。
例如基本了解 Composite pattern Wikipedia 或更详细:Composite pattern presentation