У меня есть класс, который содержит некоторые члены, которые могут быть изменены из внешних источников:
class CNode
{
protected:
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
};
Образец упрощен, в моем коде больше членов.
Теперь, что было бы лучше изменить
этого класса?
Мой код должен обрабатывать все случаи, хотя внутренне случай 1. будет обычным случаем.
Большую часть времени он применяется к одному CNode, но может также применяться к массиву узлов.
Я знаю два возможных решения, которые меня не удовлетворяют:
Это будет работать лучше, если одна переменная изменяется во многих CNodes
Это будет работать лучше всего, если несколько / все переменные обновляются одновременно в одном CNode.
Вот так:
class CProperties
{
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
}
class CNode
{
public:
const CProperties* GetProperties();
void SetProperties(CProperties*);
protected:
CProperties m_Properties;
}
Это была бы самая ленивая версия (благодаря усилиям по созданию кода), но также и самая неприятная для меня версия, так как для установки отдельных переменных сначала требуется получить текущие свойства, изменить одну переменную, а затем вернуть полный класс свойств обратно в узел.
Особенно в случае модификации одной переменной в нескольких CNodes это кажется ужасным решением.
Время выполнения и (размер) накладных расходов в большинстве случаев не имеет значения. (Который действительно был бы моим единственным хорошим аргументом против ленивой версии)
Вместо этого я ищу чистый, понятный, полезный код.
Я мог бы придумать третье возможное решение с динамическим подходом:
Один метод set имеет объект в качестве параметра, который может содержать одно или несколько значений, которые необходимо изменить. В этом случае API имеет только один метод set, который не нуждается в каких-либо изменениях при изменении свойств CProperties. Вместо этого в классе CNode потребуется метод синтаксического анализа.
Этот метод синтаксического анализа все еще нужно будет обновлять для каждого изменения в CProperties, хотя я уверен, что это также должно быть решено с помощью компилятора с помощью шаблонов.
Мой вопрос:
Есть ли другие возможные решения для моего варианта использования?
Какой подход является наиболее разумным?
Вы можете добавить логику того, как обновлять и что обновлять, в класс и предоставлять ему только источник информации.
Посмотрите, как вы строите объект свойств и переносите логику в функцию обновления, которая будет находиться в CNode.
Если для выполнения обновления CNode требуются внешние источники информации, перенесите их в функцию обновления.
Предпочтительно количество аргументов, передаваемых в функцию обновления, будет меньше, чем количество полей в CNode (в идеале ноль или один).
CNode будет обновлять только те поля, которые действительно были изменены.
Нет необходимости в множестве функций, единый способ обновления класса, нет потери информации между трещинами.
Других решений пока нет …