Todavía hay personas en el mundo que no usan genéricos jave en la "codificación ordinaria". Puedo creerlo con plantillas C ++, pero ¿genéricos? Ni siquiera son difíciles de aprender / usar. En serio, las mejores características de Java y C ++ son genéricos y plantillas respectivamente.
La mejor manera de convencer a la gente de las cosas es hacer un argumento convincente, no ser amenazante y tener razón.
Mientras no esté haciendo algo como usar plantillas como su lenguaje de programación, el polimorfismo paramétrico (genéricos / plantillas) es casi seguro bueno.
1. Evita la duplicación de código.
Esto es obvio, pero el código polimórfico es un código general. Por eso se llama genéricos.
2. Soporta una mejor comprobación estática.
Sin polimorfismo paramétrico que terminan escribiendo cosas como public Object clone()
o public boolean equals(object b)
que no son sólo abominaciones, tienen tipos que proporcionan ninguna información sobre lo que hacen, e invariablemente terminan lanzar excepciones por todo el lugar. La alternativa al polimorfismo paramétrico son los moldes por todo el lugar.
3. El código OOP de polimorfismo no paramétrico es básicamente incapaz de manejar los "métodos binarios" de manera correcta.
Usas estos a menudo.
4. Es la mejor práctica.
En Java, el uso de genéricos se considera la mejor práctica (ver Java efectivo por Josh Bloch). Los principales pensadores de C ++ como Sutter y Alexandrescu también fomentan el uso de plantillas para resolver una variedad de problemas.
5. Se ajusta al paradigma OO.
La gente a menudo no se da cuenta de esto, pero la combinación de subtipado y genéricos produce un sistema MUCHO más potente, expresivo y orientado a objetos que cualquier sistema con solo uno de ellos.
Considere los mixins de Scala. Esta es una buena característica que le permite juntar sus objetos de las partes componentes. Los genéricos y las plantillas pueden simular algunos de estos beneficios. Por ejemplo, supongamos que uno de sus objetos usa una base de datos. Un buen diseño le permitirá resumir el acceso a la base de datos en una clase separada. Si se hace correctamente, esto no solo le permite burlarse de su almacén de datos (clave para la capacidad de prueba) sino que también puede agregar implementaciones alternativas como esa nueva base de datos no-sql. Sin embargo, aquí podría tener un problema, independientemente de la implementación que use obtendrá diferentes capacidades de su objeto comercial.
Genéricos al rescate!
public class Business<S extends Datastore>{
private S store; ...
}
Ahora puede comenzar a diferenciar estáticamente sus Business
objetos en función de la capacidad de usar características específicas de la base de datos. Todavía necesita algunas comprobaciones de tiempo de ejecución y conversión, pero puede comenzar a construir MUCHO mejor código.
y
6. El código normal no existe.
Solo hay tres cosas en el universo de programación:
- bibliotecas
- configuraciones, y
- código malo
Si no piensa en su código como si fuera una biblioteca, se encuentra en serios problemas cuando cambian los requisitos para su proyecto. La arquitectura es (posiblemente) el arte de diseñar buenas API.
Esta actitud me parece deslumbrante. Después de acostumbrarse a la programación con tipos parametrizados, no usarlos simplemente hace que todo sea un dolor. Y, Java y C ++ tienen un montón de puntos difíciles que ayudan a remediar.