В кодовой базе моей компании у нас есть серия из примерно 10 крупных операторов SQL, которые имеют высокую степень общности. Все утверждения имеют общее ядро или, по крайней мере, ядро, которое отличается только одним или двумя словами. Затем вы можете сгруппировать 10 операторов в 3 или 4 группы, которые добавляют общие приложения к ядру, опять же, возможно, с одним или двумя словами, отличающимися в каждом приложении. Во всяком случае, представьте, что 10 операторов SQL являются наборами на диаграмме Венна со значительным перекрытием.
Мы решили закодировать эти операторы таким образом, чтобы избежать дублирования. Итак, есть функция (технически, метод Java) для построения оператора. Требуются некоторые параметры, которые учитывают слово или два различия в общем ядре. Затем для построения придатков требуется функтор, который, конечно, также параметризован с большим количеством параметров для незначительных различий и большим количеством функторов для дополнительных придатков и т. Д.
Код разумен тем, что ни один из SQL никогда не повторяется. Если вам когда-либо понадобится изменить предложение в SQL, вы измените его только в одном месте, и все 10 операторов SQL будут изменены соответствующим образом.
Но человек - это код, который трудно прочитать. Единственный способ выяснить, что SQL будет выполняться для данного случая, - это пройти через отладчик и распечатать SQL после того, как он будет полностью собран. И выяснение того, как конкретная функция, которая генерирует предложение, вписывается в общую картину, является мерзким.
С тех пор, как я написал это, я часто задавался вопросом, было бы лучше, если бы мы просто вырезали и вставили SQL-запрос 10 раз. Конечно, если бы мы сделали это, любое изменение в SQL могло бы произойти в 10 местах, но комментарии могли бы помочь нам указать 10 мест для обновления.
Преимущество того, что SQL понятен и все в одном месте, вероятно, перевесит недостатки вырезания и вставки SQL.