Генераторы кода отличные, плохой код плохой.
Большинство других ответов на этой странице имеют вид "Нет, потому что часто сгенерированный код не очень хорош."
Это плохой ответ, потому что:
1) Генераторы - это инструмент, как и все остальное - если вы его неправильно используете, не вините инструмент.
2) Разработчики, как правило, гордятся своей способностью писать отличный код один раз, но вы не используете генераторы кода для разовых проектов.
Мы используем систему генерации кода для постоянства во всех наших Java-проектах и имеем тысячи сгенерированных классов в производстве.
Как менеджер я люблю их, потому что:
1) Надежность: в этом коде не осталось значительных ошибок. За прошедшие годы он был настолько исчерпывающе протестирован и усовершенствован, что при отладке я никогда не беспокоюсь о постоянном уровне.
2) Стандартизация: код каждого разработчика идентичен в этом отношении, поэтому парню гораздо меньше нужно учиться при подборе нового проекта у коллеги.
3) Эволюция: если мы найдем лучший способ сделать что-то, мы сможем обновлять шаблоны и быстро и последовательно обновлять 1000 классов.
4) Революция: если в будущем мы переключимся на другую систему персистентности, то тот факт, что каждый постоянный класс имеет абсолютно идентичный API, значительно облегчит мою работу.
5) Производительность. Чтобы создать постоянную объектную систему из метаданных, достаточно нескольких кликов - это экономит тысячи скучных часов для разработчиков.
Генерация кода похожа на использование компилятора - в отдельных случаях вы могли бы написать лучше оптимизированный язык ассемблера, но при большом количестве проектов вы бы предпочли, чтобы компилятор сделал это за вас, верно?
Мы используем простой трюк, чтобы гарантировать, что классы всегда могут быть восстановлены без потери настроек: каждый сгенерированный класс является абстрактным. Затем разработчик расширяет его конкретным классом, добавляет пользовательскую бизнес-логику и переопределяет любые методы базового класса, которые он хочет отличать от стандартных. Если в метаданных произойдет изменение, он может в любой момент восстановить абстрактный класс, и если новая модель нарушит его конкретный класс, компилятор сообщит ему об этом.