326 Часть II. Типовые решения
Принцип действия
Прежде чем приступать к реализации отображения метаданных, необходимо решить,
как метаданные будут использоваться кодом программы. Существует два основных вари-
анта: генерация кода и метод отражения.
При использовании метода генерации кода (code generation) разработчик пишет про-
грамму, которая принимает на вход метаданные и возвращает исходный код классов, вы-
полняющих отображение. Эти классы ничем не отличаются от написанных вручную,
однако на деле являются полностью искусственным "продуктом", автоматически сгене-
рированным в процессе сборки (как правило, перед самым началом компиляции). Полу-
ченные классы преобразователей развертываются серверным кодом.
Если вы используете генерацию кода, убедитесь, что она полностью интегрирована в
процесс сборки, какие бы сценарии в нем ни применялись. Сгенерированные классы
никогда не должны дорабатываться вручную, а следовательно, не нуждаются в проверке
программой контроля исходного кода.
При использовании метода отражения (reflection) рефлективная программа просмат-
ривает метаданные объекта, находит метод setName и выполняет его с соответствующим
аргументом. Поскольку методы (и поля) воспринимаются программой как обычные дан-
ные, она может считывать имена полей и методов из файла с метаданными и затем ис-
пользовать их для отображения. Обычно я не рекомендую использовать отражение —
частично из-за его медлительности, однако в основном потому, что оно значительно
затрудняет отладку кода. Несмотря на это, метод отражения прекрасно подходит для ото-
бражения на базу данных. Считывание имен полей и методов из файла позволяет в пол-
ной степени ощутить гибкость метода отражения.
Генерация кода представляет собой гораздо менее динамичный подход, поскольку
любые изменения в отображении требуют перекомпиляции и нового развертывания, как
минимум, этой части программного обеспечения. А применение метода отражения по-
зволяет просто изменить файл с описанием отображения, и существующие классы будут
использовать новые метаданные. Впрочем, как показывает практика, необходимость в
изменении отображения возникает крайне редко, поскольку предполагает изменение ко-
да или самой базы данных. Кроме того, современные среды разработки позволяют значи-
тельно упростить развертывание части приложения.
Слабым местом метода отражения является скорость. Значимость этой проблемы за-
висит от того, какую среду разработки вы используете — в некоторых средах медлитель-
ность рефлективных программ переходит всякие границы. Не следует, однако, забывать,
что отражение осуществляется в контексте SQL-запроса, поэтому медленное выполнение
отражения может быть совсем незаметным на фоне медленного выполнения удаленного
вызова. Рекомендую попробовать отражение в своей среде разработки, чтобы узнать, на-
сколько оно замедляет производительность.
Оба подхода довольно сложны в отладке. Выбор оптимального способа во многом за-
висит от того, насколько разработчик привык к сгенерированному или рефлективному
коду. Сгенерированный код более явный, что облегчает отслеживание действий отладчи-
ка. Поэтому я предпочитаю именно генерацию кода и думаю, что она окажется более
простой для недостаточно искушенных программистов (наверное, это заявление делает
меня совсем неискушенным программистом).
В большинстве случаев метаданные хранятся в отдельном файле. В наши дни для
описания метаданных используется XML, поскольку он предоставляет возможность