Общее программирование - очень простая форма метакодирования, хотя обычно она не выполняется. Это больше похоже на препроцессор в C и больше относится к шаблонному программированию в большинстве случаев использования и базовых реализациях.
В типизированных языках вы часто найдете несколько реализаций чего-то, где только тип отличается. В таких языках, как Java, это может быть особенно болезненным, поскольку каждый класс и интерфейс определяют новый тип.
Вы можете сгенерировать эти классы, преобразовав их в строковый литерал, а затем заменив имя класса переменной для интерполяции.
Там, где дженерики используются во время выполнения, они немного другие, в этом случае это просто программирование переменных, программирование с использованием переменных.
Способ предвидеть, что это просто, брать файлы, сравнивать их и превращать все что угодно в переменную. Теперь у вас есть только один файл, который можно использовать повторно. Вам нужно только указать, что отличается, отсюда и имя переменной.
Как возникли обобщения, что не все можно сделать переменными, такими как ожидаемый тип переменной или тип приведения. Часто было много дублирования файлов, когда единственное, что было переменной, - это типы переменных. Это был очень распространенный источник дублирования. Хотя есть способы обойти это или смягчить его, они не особенно удобны. Дженерики стали своего рода переменными, чтобы сделать переменную типа переменной. Поскольку тип переменной обычно выражается на языке программирования, который теперь можно указывать во время выполнения, он также считается метакодированием, хотя и очень простым случаем.
Эффект отсутствия изменчивости там, где это необходимо, заключается в том, что вы развертываете свои переменные, то есть вы вынуждены вместо наличия переменной создавать реализацию для каждого возможного, было бы значением переменной.
Как вы можете себе представить, это довольно дорого. Это было бы очень распространено при использовании любого вида библиотеки хранения объектов повторного использования. Они будут принимать любой объект, но в большинстве случаев люди хотят использовать только один тип объекта. Если вы поместите объект Shop, который расширяет Object, а затем захотите получить его, сигнатура метода в объекте хранилища вернет просто Object, но ваш код будет ожидать объект Shop. Это нарушит компиляцию с понижением класса объекта, если вы не вернете его обратно в магазин. Это поднимает еще одну загадку, так как без обобщений невозможно проверить совместимость и убедиться, что сохраняемый вами объект является классом Shop.
Java избегает метапрограммирования и старается сделать язык простым, используя принципы ООП полиморфизма вместо того, чтобы создавать гибкий код. Однако есть некоторые насущные и вновь возникающие проблемы, которые благодаря опыту представили себя и решаются с добавлением минимальных возможностей метапрограммирования. Java не хочет быть языком метапрограммирования, но экономно импортирует оттуда концепции для решения самых неприятных проблем.
Языки программирования, которые предлагают средства метакодирования лаважа, могут быть значительно более продуктивными, чем языки, чем избегать их, исключая особые случаи, рефлексию, полиморфизм ООП и т. Д. Однако для создания непонятных, понятных и поддерживаемых часто требуется гораздо больше навыков и опыта код без ошибок. Для таких языков также часто наблюдается снижение производительности, поскольку C ++ является чем-то странным, потому что он компилируется в native.