Предотвращение ада зависимостей в экспортере файлов для типа файлов на основе узлов?

0

Я изо всех сил пытаюсь создать правильный шаблон дизайна для экспортера файлов 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);
    }

};

Что я могу сделать по этому поводу? Есть ли лучшая структура или структура ООП, которую я могу использовать?

Теги:
oop
design-patterns

1 ответ

1
Лучший ответ

Вы должны более внимательно рассмотреть составной шаблон.

Он полезен для построения древовидных структур и позволяет обрабатывать компоненты ветвей и листьев одинаково, используя общую абстракцию.

Вы можете использовать общую абстракцию, такую как Node (aka Component в контексте шаблона), чтобы равномерно обрабатывать все дочерние элементы в вашем классе GeometryNode.

Как следствие, вы должны использовать полиморфизм путем переопределения методов и, возможно, проверок времени выполнения плюс броски для выполнения определенного поведения.

Существует несколько вариантов, имеющих разные преимущества и недостатки. Поэтому я рекомендую подробно изучить шаблон, прежде чем вы решите, как улучшить вашу реализацию.

Например, для базового понимания Composite pattern Википедия или более подробная информация: композитная презентация

Ещё вопросы

Сообщество Overcoder
Наверх
Меню