Показать сообщение отдельно
Старый 04.05.2010, 14:05   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Не пользуйтесь этой идеей - это то, что mazzy называет "программистским подходом". Из моего скромного опыта, в долгосрочной перспективе эта идея несет куда больше проблем, чем удобств. Дело в том, что:
  • в приведенном коде как минимум нужно еще проверять длину строковых полей и ArraySize;
  • совпадение названия и базового типа полей в двух произвольных таблицах не означает автоматом, что эти поля содержат одну и ту же информацию;
  • вы не получите перекрестных ссылок, которые помогут выявить, откуда в поля результирующей таблицы попадают значения; при использовании Map'а по крайней мере будут перекрестные ссылки на поля Map'а;
  • вы будете ограничены в именовании полей, могут возникнуть сложности, если в одной таблице поле с каким-то префиксом/суффиксом (кастомизация), а в другой - нет (таблица создана вами, и там достаточно префикса в названии таблицы);
  • копирование не будет сопровождаться вызовом каких-либо обработчиков изменения полей, которые в той или иной таблице могут подтянуть значения связанных полей;
  • самое главное: вы не сможете контролировать, какие именно поля надо копировать, а какие нет.
Зачастую нужно копировать "все поля, кроме таких-то", из-за чего к одной строке вызова buf2buf() или подобного метода добавляется фигова туча строк кода, вычищающего значения полей, которые копировать не надо было, либо которые надо брать из других источников. При этом из-за отсутствия перекрестных ссылок (см. выше) нужно либо самому помнить, что при добавлении нового поля в обе таблицы надо подумать о том, копировать ли его и если копировать, то при каких условиях, либо надо будет решать такие вопросы по факту, исправляя некорректные данные ("ой, а вот тот флажок не должен был копироваться в новые записи"). В общем, я лично для себя решил, что наиболее оптимальный вариант - это использование методов типа initFromXXTable(): такой код и в перекрестные ссылки попадает, и поля явно заданы - не возникнет неожиданных эффектов при создании новых полей, и код можно разбить на несколько методов, скажем, вместо копирования кода клиента или договора сделать отдельные initFromCustTable(), initFromRContractTable() и вызывать их в initFromXXTable(). Первоначальные затраты на написание такого кода выше, но он намного более предсказуем, его куда легче сопровождать и развивать.
За это сообщение автора поблагодарили: Zabr (1).