Я изо всех сил пытаюсь создать правильный шаблон дизайна для экспортера файлов 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, который имеет ваши основные строки начала/конца. Хотя это и начинает создавать адский ад. Вот пример:
#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);
}
};
Что я могу сделать по этому поводу? Есть ли лучшая структура или структура ООП, которую я могу использовать?
Вы должны более внимательно рассмотреть составной шаблон.
Он полезен для построения древовидных структур и позволяет обрабатывать компоненты ветвей и листьев одинаково, используя общую абстракцию.
Вы можете использовать общую абстракцию, такую как Node (aka Component в контексте шаблона), чтобы равномерно обрабатывать все дочерние элементы в вашем классе GeometryNode.
Как следствие, вы должны использовать полиморфизм путем переопределения методов и, возможно, проверок времени выполнения плюс броски для выполнения определенного поведения.
Существует несколько вариантов, имеющих разные преимущества и недостатки. Поэтому я рекомендую подробно изучить шаблон, прежде чем вы решите, как улучшить вашу реализацию.
Например, для базового понимания Composite pattern Википедия или более подробная информация: композитная презентация