La programación genérica es una forma muy simple de metacodificación, aunque no suele ser el tiempo de ejecución. Es más como el preprocesador en C y se relaciona más con la programación de plantillas en la mayoría de los casos de uso y las implementaciones básicas.
Encontrará a menudo en los idiomas escritos que creará algunas implementaciones de algo donde solo el tipo es diferente. En lenguajes como Java esto puede ser especialmente doloroso ya que cada clase e interfaz define un nuevo tipo.
Puede generar esas clases convirtiéndolas en una cadena literal y luego reemplazando el nombre de la clase con una variable para interpolar.
Donde genéricos se usan en tiempo de ejecución es un poco diferente, en ese caso es simplemente programación variable, programación usando variables.
La forma de pensar que es simple, llevar a los archivos, compararlos y convertir cualquier cosa diferente en una variable. Ahora solo tiene un archivo reutilizable. Solo tiene que especificar qué es diferente, de ahí la variable de nombre.
Cómo se dieron los medicamentos genéricos que no todo se puede hacer variable como el tipo de variable que esperas o un tipo de yeso. A menudo habría una gran cantidad de duplicación de archivos donde lo único que era variable eran los tipos de variables. Esta fue una fuente muy común de duplicación. Aunque hay formas de evitarlo o mitigarlo, no son particularmente convenientes. Los genéricos han llegado como un tipo de variable variable para permitir que el tipo de variable sea variable. Debido a que el tipo de variable es algo que normalmente se expresa en el lenguaje de programación que ahora se puede especificar en tiempo de ejecución, también se considera metacodificación, aunque es un caso muy simple.
El efecto de no tener la variabilidad donde lo necesita es desenrollar sus variables, es decir que se ve forzado en lugar de tener una variable para hacer una implementación para cada posible valor variable.
Como se puede imaginar, es bastante caro. Esto sería muy común cuando se usa cualquier clase de biblioteca de almacenamiento de objetos de reutilización. Estos aceptarán cualquier objeto, pero en la mayoría de los casos las personas solo quieren lastimar un tipo de objdct. Si coloca un objeto de Tienda que amplía Objeto y luego desea recuperarlo, la firma del método en el objeto de almacenamiento devolverá simplemente Objeto, pero su código esperará un Objeto de Tienda. Esto romperá la compilación con la degradación del objeto a menos que lo vuelva a hacer para comprar. Esto plantea otro enigma ya que sin los genéricos no hay forma de verificar la compatibilidad y asegurarse de que el objeto que está almacenando sea una clase de Tienda.
Java evita la metaprogramación y trata de mantener el lenguaje simple usando los principios de polimorfismo OOP en lugar de hacer código flexible. Sin embargo, hay algunos problemas apremiantes y recurrentes que a través de la experiencia se han presentado y se abordan con la adición de instalaciones de metaprogramación mínima. Java no quiere ser un lenguaje de metaprogramación, pero importa moderadamente los conceptos de allí para resolver los problemas más molestos.
Los lenguajes de programación que ofrecen servicios de metacodificación pueden ser significativamente más productivos que los idiomas que evitarlo salvo en casos especiales, reflejos, polimorfismos OOP, etc. Sin embargo, a menudo también requiere mucha más habilidad y experiencia para generar inmanejables, mantenibles y código libre de errores. También suele haber una penalización de rendimiento para dichos lenguajes, ya que C++ es un poco raro porque está compilado en nativo.
Pregunta lingüística sin respuesta: v.s. o vs. - "v.s." versus "vs." :) –
@Armen: eso también trae la pregunta: "v.s. vs. vs." vs. "v.s. v.s. vs."? – Claudiu
@Claudiu: ¡Y que la sagrada recursión sea recurrente! : D –