programación genérica, con qué frecuencia se usa en la industria


11

Realizo programación en un entorno académico en este momento, por lo que puedo usar lo que quiera. Estoy usando la biblioteca de gráficos de impulso para algunas cosas, y me pregunto si vale la pena invertir el esfuerzo en comprender GP más profundamente.

Tengo curiosidad: ¿se usa mucho la programación genérica (GP) en la industria? Supongo que la mayoría de los programadores se sienten mucho más cómodos con OOP o están utilizando lenguajes que no enfatizan o no admiten GP, ​​por lo que fuera de llamar a estructuras / funciones de datos STL en C ++, mi impresión es que GP no se usa con tanta frecuencia en la práctica. Pero, al estar fuera de la industria en este momento, sería bueno saber de los practicantes sobre esto.

(¡mientras escribo esto, veo que la programación genérica ni siquiera es una etiqueta válida!)


La distribución de etiquetas en StackOverflow es probablemente mucho más útil como evidencia estadística que la de aquí. Ver stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Respuestas:


7

Tengo curiosidad: ¿se usa mucho la programación genérica (GP) en la industria?

Depende mucho del contexto del equipo y del proyecto.

Por ejemplo, en los videojuegos, a menudo el código es el "más simple" posible (e incluso a veces demasiado simple) pero en grandes arquitecturas. Esto se debe a que los desarrolladores de juegos tienen muchos problemas que solucionar y no quieren molestarse con la meta programación (que es un lenguaje separado muy abstracto y difícil de entender dentro de C ++).

Al mismo tiempo, el uso básico de plantillas es común incluso en esas tiendas y puede ver algunas optimizaciones basadas en plantillas en algunas funciones muy específicas de algunos motores.

Pero en el desarrollo del juego, la mayoría de las personas simplemente evitarán cualquier metaprogramación.

Ahora, en el otro extremo, algunas aplicaciones de procesamiento realmente complejas o pesadas, que no son comunes, requieren algún tipo de metaprogramación pesada debido a los requisitos de rendimiento y flexibilidad (en tiempo de compilación) que no son comunes. Estoy trabajando en uno ahora mismo.

No es común, pero existe y algunos dominios de nicho (en algunos contextos incrustados de números o científicos) requieren que las personas sepan mucho sobre metaprogramación o deseen aprender.

En el medio, la mayoría de las personas usarán la metaprogramación como "cliente", no como "diseñador". La mayoría de los códigos de metaprogramación están agrupados en bibliotecas porque las bibliotecas son herramientas para el código y ¿qué es mejor que una biblioteca que pueda adaptarse a los tipos personalizados con los que ha estado trabajando hasta ahora?

Boost (http://boost.org) es un conjunto de bibliotecas, algunas de magia negra de metaprogramación pesada, y se utilizan en muchas tiendas de C ++ como "STL ++", una extensión de STL (y lo es). No todas las tiendas lo usan por varias razones, como la compatibilidad del compilador (algunas bibliotecas de impulso pueden hacer que su compilador pida perdón por cada vez que hirió sus sentimientos ...) y más a menudo porque a algunos desarrolladores no les gusta no poder entender cómo funciona una herramienta en su interior (intente comprender Boost.Spirit ...)

Independientemente de las empresas para las que trabaje, algunas utilizarán este paradigma, otras lo harán menos o nada o incluso las prohibirán.

No hay consenso porque nadie tiene las mismas necesidades, contexto o equipo.

Pero aún así, obviamente, se usa. Tal vez pregunte quién usa boost en su lista de correo para tener más ejemplos del mundo real.


1
+1 para cliente vs. diseñador. En mi experiencia, pocos desarrolladores suficientes entienden su implementación que no tiene sentido crear un nuevo código genérico en una aplicación a menos que haga una gran mejora en la capacidad de mantenimiento. Las bibliotecas diseñadas para una reutilización amplia se encuentran bajo esa condición con mucha más frecuencia que las aplicaciones individuales.
Karl Bielefeldt

Gracias por la respuesta detallada. Soy fanático de Boost y considerar si profundizar en BGL, que requiere mucho más conocimiento de GP que otras bibliotecas de Boost, es lo que me llevó a preguntar esto. Tu comentario sobre el mundo del desarrollo del juego es bastante intrigante. Estoy sorprendido por las hazañas de desarrollo de los juegos modernos y es interesante escuchar que probablemente estén aislados de las nuevas metodologías de programación en lugar de estar a la vanguardia de ellos.
bd1

Bueno, los desarrolladores de juegos están manejando un alto orden de complejidad simplemente teniendo que diseñar conceptos de juegos. Agregar metainstrucciones simplemente complica todo, por lo que debe estar realmente bien justificado. La otra cosa es que muchos desarrolladores de juegos funcionan en consolas que son hardware muy específico con compiladores muy específicos que no permiten todo lo que intenta hacer (por ejemplo, ninguna excepción o ninguna herencia múltiple o no funciona correctamente desde el documento de El compilador (historia real)). Entonces, hay buenas razones.
Klaim

5

Tengo curiosidad: ¿se usa mucho la programación genérica (GP) en la industria?

La programación genérica, académicamente llamada polimorfismo paramétrico , se usa muy a menudo en los campos. En mi empresa, lo usamos principalmente para construir editores independientes de tipo para datos, independientemente de su tipo. Simplemente no lo necesita con tanta frecuencia como otras funciones, pero definitivamente es una función que no me gustaría perder. Lo usa cuando un comportamiento se ajusta a una gran cantidad de tipos. Es una señal clara de que necesita genéricos cuando se encuentra escribiendo el mismo código varias veces para diferentes tipos.

Supongo que la mayoría de los programadores se sienten mucho más cómodos con OOP o están utilizando lenguajes que no enfatizan o no admiten GP, ​​por lo que fuera de llamar a estructuras / funciones de datos STL en C ++, mi impresión es que GP no se usa con tanta frecuencia en la práctica.

Al menos desde mi experiencia, su punto de vista es incorrecto. OOP y la programación genérica no son mutuamente excluyentes. De hecho, debes usar los efectos de sinergia de combinarlos. Como dije antes, la razón por la que no lo ves aparecer con tanta frecuencia como otras técnicas es porque no lo necesitas con tanta frecuencia. Pero es una característica fuerte y te ayuda mucho a mantener tu código SECO . ¿Qué lenguajes realmente no enfatizan el soporte de GP en la programación de alto nivel? 3 de los 5 idiomas de Tiobe Top 5 admiten genéricos / plantillas. Y PHP se escribe dinámicamente, por lo que realmente no los necesita. ¿Y qué?


En este punto, no quise decir que OOP y GP son una opción o una opción. Sin embargo, muchos de los proyectos que he visto parecen ser estrictamente OOP en Java. Creo que las versiones más recientes de Java son compatibles con GP, ​​pero ¿qué fracción de los programadores de Java realmente usan esa funcionalidad? Como dije, no estoy trabajando en la industria y mi perspectiva puede estar sesgada, por eso hice la pregunta.
bd1

@ bd1: las aplicaciones más antiguas que se escribieron antes de Java admitían genéricos, o antes de que un conjunto de herramientas en particular admitiera que la versión de Java no tendrá genéricos, y los desarrolladores pueden continuar evitando los genéricos en ese proyecto en particular, para mantener el código consistente. Lo he visto y varía según el proyecto y los desarrolladores. Todos los proyectos que he visto que se iniciaron después de que se generalizó la compatibilidad con los genéricos de Java tienden a usarlos con frecuencia, cuando corresponde.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner: los genéricos en Java son completamente diferentes de las plantillas de C ++. Los genéricos de Java son azúcar sintáctica 100% pura y no admiten metaprogramación.
kevin cline

"La programación genérica y OOP no son mutuamente excluyentes": de hecho, ambas son formas de polimorfismo, respectivamente polimorfismo ad-hoc y paramétrico. Por lo tanto, son dos herramientas diferentes para diferentes tipos de polimorfismo.
Giorgio

4

Las plantillas de C ++ se usan ampliamente para cosas diferentes a los contenedores, al menos en mi dominio del problema (finanzas cuantitativas). Incluso me aventuraría a decir que a veces se usa con demasiada frecuencia, para fines en los que las funciones virtuales antiguas serían suficientes (y no aumentarían tanto el tiempo de compilación).

La gente lo usa para evitar la duplicación de código y lograr el polimorfismo en tiempo de compilación (sin envío virtual).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.