Лучшая практика для установки одного / нескольких членов класса (property-)

У меня есть класс, который содержит некоторые члены, которые могут быть изменены из внешних источников:

class CNode
{
protected:
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
};

Образец упрощен, в моем коде больше членов.

Теперь, что было бы лучше изменить

  1. не замужем
  2. несколько (сразу)
  3. все участники (сразу)

этого класса?

Мой код должен обрабатывать все случаи, хотя внутренне случай 1. будет обычным случаем.
Большую часть времени он применяется к одному CNode, но может также применяться к массиву узлов.

Я знаю два возможных решения, которые меня не удовлетворяют:

  1. задавать&получить для каждой переменной:
    профессионал:
    Каждая переменная может изменяться независимо от других членов.
    Легко установить одинаковое значение для нескольких CN-кодов.
    против:
    Много настроено&gets;
    Если добавлена ​​новая переменная, новый набор&get нужно добавить также.

Это будет работать лучше, если одна переменная изменяется во многих CNodes

  1. Создайте класс CProperties, который содержит все изменяемые переменные:
    профессионал:
    Один набор&получить в родительском классе — свойства могут быть добавлены / удалены без необходимости изменять набор&получить.
    Это также уменьшает количество методов в моем API, которые обрабатывают пользовательский ввод.
    против:
    установка отдельных переменных требует получения текущих CProperties, поэтому другие значения не будут изменены.

Это будет работать лучше всего, если несколько / все переменные обновляются одновременно в одном 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, хотя я уверен, что это также должно быть решено с помощью компилятора с помощью шаблонов.

Мой вопрос:
Есть ли другие возможные решения для моего варианта использования?
Какой подход является наиболее разумным?

1

Решение

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

Посмотрите, как вы строите объект свойств и переносите логику в функцию обновления, которая будет находиться в CNode.

Если для выполнения обновления CNode требуются внешние источники информации, перенесите их в функцию обновления.

Предпочтительно количество аргументов, передаваемых в функцию обновления, будет меньше, чем количество полей в CNode (в идеале ноль или один).

CNode будет обновлять только те поля, которые действительно были изменены.

Нет необходимости в множестве функций, единый способ обновления класса, нет потери информации между трещинами.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]