#c #json #nlohmann-json
#c #json #nlohmann-json
Вопрос:
Я ищу способ загрузить определенный тип класса / подкласса на основе ввода JSON. Например, у меня есть следующий файл JSON
"type" : "RenderVertices"
"RenderComponent": {
"vertex": {
"xcoords" : [0, 1, 1, 0]
"ycoords" : [0, 0, 1, 1]
}
"texture": {
"name" : "testtex"
"texcoordsx" : [0, 1, 1, 0]
"texcoordsy" : [0, 0, 1, 1]
}
"color" : {
"color_r": [0, 0, 0, 0]
"color_g": [0, 0, 0, 0]
"color_b": [0, 0, 0, 0]
"color_a": [0, 0, 0, 0]
}
"type": "quads"
}
В моей программе у меня есть два класса: базовый класс и подкласс
class RenderComponent;
и
class RenderVertices : public RenderComponent
В конечном итоге у меня будет большое количество классов, которые наследуются от renderComponent, и я хотел бы иметь возможность создавать определенный подкласс объектов (в данном случае, RenderVertices) на основе спецификатора «type» в файле JSON. Я понимаю, как это сделать, используя какую-то фабричную функцию с оператором switch, но для этого требуется добавление новой записи для каждого типа подкласса, который я создаю, чего я хотел бы избежать, если это возможно. Каков наиболее масштабируемый способ достижения этой цели (и под масштабируемостью я подразумеваю наименее требуемые модификации кода для каждого созданного нового подкласса)?
Я использую nlohmann::json для анализа моего файла JSON (https://github.com/nlohmann/json )
Комментарии:
1. Я думаю, что это довольно четкий вариант использования заводской функции, как вы предложили. Если вы измените формат данных, имеет смысл, что вам также придется изменить фабрику синтаксического анализа. Изменение существующего кода — это неплохо; изменение нерелевантного кода — это плохо, и в вашем случае код, который нужно было бы изменить в заводской функции, очень важен для анализа JSON.
2.Масштабируемый «Какой наиболее масштабируемый способ достижения этой цели», вероятно, является здесь неправильным термином. Звучит больше как беспокойство по поводу ремонтопригодности и расширяемости. Помимо простого, существуют более сложные фабричные шаблоны (например, Abstract Factory), которые призваны помочь вам в реализации более сложных и требующих гибкости сценариев. Основным моментом является использование четко определенных отдельных интерфейсов для различных аспектов ваших иерархий классов (какие классы имеют что-то общее, чтобы делиться ими с помощью виртуальных функций).