Re[5]: Философское предложение
От: McSeem2 США http://www.antigrain.com
Дата: 04.01.05 06:00
Оценка: 27 (1)
Здравствуйте, adontz, Вы писали:

MS>>Никто не мешает сделать такой препроцессор, который бы обрабатывал "вкрапления" IDL в C++ файлы. Но это тоже не хорошо. Вообще, в глобальном смысле, надо разделять функциональность, хоть это и ох как нелегко бывает. Алгоритическая часть никак не должна зависеть от той, которая занимается сериализацией данных.


A>Вот поэтому сериализация помечается в описании (declaration) класса и никаких проблем

A>Тут ведь и инертность публики важна. Если я скажу, что у меня есть супер-пупер сериалайзер для Си++, но вам нужно ещё один язык (пусть даже на что-то похожий) то меня пошлют на... и будут правы.

Это как посмотреть... Вот пример из моего проекта: аффинные 2D преобразования. Матрицу иногда сериализовать надо? Надо. Но я категорически против того, чтобы помечать этот класс некой крокозяблой и таким образом изначально ставить его в зависимость от какой-то там левой сериализации (хоть своей, хоть чужой — не важно). Сериализация этого класса должна выполняться где-то извне его, например, при помощи другого класса, типа serializable_affine_matrix. Более того, для одного и того же класса trans_affine может быть несколько сериализаторов — один сохраняет данные в double, другой — во float, третий — вообще в int32 в формате 16.16. Для четвертого типа может быть вполне достаточно int16 формата 10.6. Для пятого — может быть надо сериализовать только матрицу 2x2 — поворот и масштабирование, без трансляции. В идеале, я должен уметь пользоваться сериализатором следующим образом:

class serializable_affine_matrix : public serializable<trans_affine>
{
   serializable_affine_matrix(trans_affine& obj)
      : serializable<trans_affine>(obj)
   {
      //        accessor        modifier
      serialize(obj::get_mtx00, obj::set_mtx00);
      serialize(obj::get_mtx01, obj::set_mtx01);
      serialize(obj::get_mtx10, obj::set_mtx10);
      serialize(obj::get_mtx11, obj::set_mtx01);
      serialize(obj::get_mtx20, obj::set_mtx21);
   }
};


Более того, класс (как тот же trans_affine) может вообще не иметь аксессоров и модификаторов в явном виде. У него есть методы load_from(const double* m6) и store_to(double* m6). Эту ситуацию тоже надо уметь разрулить через некий промежуточный буфер.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.