ПрограммированиеФорумОбщее

Чтение и валидация параметров data driven объектов

#0
11:32, 10 апр 2010

Предположим, у нас есть класс CLight.

class CLight {
public:
  void CLight ( const DataBlock &block);
protected:
  vec4 color;
  float radius;
}

Блоком данных может быть XML, Lua таблица либо иное другое представление.
Пример:

SuperLight = {
     color = vmath.vec4(1.0, 0.5, 0.5, 0.0); 
     radius = 10.0;
  }

Конструктор принимает блок данных, откуда объект должен считать параметры color и radius.
Выглядеть это может так:

CLight::CLight ( const DataBlock &block ) {
  block.Read( color, "color" );
  block.Read( radius, "radius" );
  if (radius<0) {
    // ...
  }
}

Вопрос: что делать в случае отсутсвующих или неправильных параметров?
Варианты:
1. Кидать исключение, тем самым прекращая создание объекта.
2. Выводить warning в лог и исправлять значение на значение по умолчанию или на граничное правильное.
3. Ни чего не делать: просто тихо исправлять значение.

Discuss!

#1
11:45, 10 апр 2010

>1. Кидать исключение, тем самым прекращая создание объекта.
Я бы поступил именно так - что не предполагается разработчиком - ошибка, ошибок быть не должно ни в коем случае. Ежели полагается, что могут передаваться некорректные данные(хотя само словосочетание "некорректные данные" предполагает ошибку, а их как я говорил быть не должно), то выриант
>2. Выводить warning в лог и исправлять значение на значение по умолчанию или на граничное правильное.
еще кое как можно использовать. Хотя warning предполагает, что его исправят - так лучше к исправлению сразу принуждать - использовать вариант 1(ИМХО).
А это
>3. Ни чего не делать: просто тихо исправлять значение.
по моему даже обсуждать не надо - абсурдный вариант...

#2
12:02, 10 апр 2010

Paltr
> Я бы поступил именно так - что не предполагается разработчиком - ошибка, ошибок
> быть не должно ни в коем случае. Ежели полагается, что могут передаваться
> некорректные данные(хотя само словосочетание "некорректные данные" предполагает
> ошибку, а их как я говорил быть не должно), то выриант
Ок. У нас есть скрипт с описанием 1000 объектов.
Потом программисты почесали репу и вспомнили, что нужно добавить еще один параметр: в случае CLight -  bool shadow.
При загрузке вывалится 1000 исключений. Как следствие - сидеть и исправлять 1000 объектов?

#3
12:09, 10 апр 2010

Demiurg-HG
В таком случае аргумент bool shadow должен позиционироваться как необязательный с default значением. Только так. По другому ИМХО нелогично...

#4
12:38, 10 апр 2010

По моему скромному, но авторитетному мнению, дефолтное значение должно быть предусмотрено абсолютно для всех параметров, за исключением определяющих идентичность объекта (идентификатор и, возможно, класс). Варнинги об отсутствии/присутствии излишеств/несоответствии типа/структуры - в лог, но регулировать дебажным свитчом.
Иначе при любых флуктуациях формата будет трудно. Да и обратную совместимость с таким раскладом обеспечить проще.

#5
18:07, 10 апр 2010

Я бы добавил в DataBlock::Read параметрами дефолтное значение и флаг "обязательно должно быть" (как вариант - получать флаг из NULL/nil/etc. в дефолтном значении). Нету, но должно быть - ассерт.
imho,  конечно.

#6
18:26, 10 апр 2010

Не раз встречал системы со всеми тремя вариантами. Лично мне больше всего симпатизирует второй + замечание keltar, потому что:
1) становится адом, когда полей данных становится слишком много, при этом бОльшая часть из них носит опциональный характер + проблемы с обратной совместимостью
3) ну слишком много делать втихоря - тоже не вариант, хотя такие системы есть и работают вполне счастливо.

ПрограммированиеФорумОбщее

Тема в архиве.