масштабируемый способ создания нового экземпляра определенного класса / подкласса из входных данных JSON в C

#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), которые призваны помочь вам в реализации более сложных и требующих гибкости сценариев. Основным моментом является использование четко определенных отдельных интерфейсов для различных аспектов ваших иерархий классов (какие классы имеют что-то общее, чтобы делиться ими с помощью виртуальных функций).