Nomenclatura de interfaces en Java [cerrado]
La mayoría de los lenguajes OO anteponen sus nombres de interfaz con una I mayúscula, ¿por qué Java no hace esto? ¿Cuál fue la razón para no seguir esta convención?
Para demostrar lo que quiero decir, si quisiera tener una interfaz de usuario y una implementación de usuario, tendría dos opciones en Java:
- Clase = Usuario, Interfaz = Interfaz de Usuario
- Clase = UserImpl, Interfaz = Usuario
Donde en la mayoría de los idiomas:
Clase = Usuario, Interfaz = IUser
Ahora, se podría argumentar que siempre se puede elegir el nombre más descriptivo para la implementación del usuario y el problema desaparece, pero Java está impulsando un enfoque POJO y la mayoría de los contenedores IOC usan DynamicProxies ampliamente. Estas dos cosas juntas significan que tendrás muchas interfaces con una única implementación de POJO.
Entonces, supongo que mi pregunta se reduce a: "¿Vale la pena seguir la convención de nomenclatura de interfaz más amplia, especialmente a la luz de hacia dónde parecen dirigirse los marcos de Java?"
Prefiero no usar un prefijo en las interfaces:
El prefijo perjudica la legibilidad.
Usar interfaces en clientes es la mejor manera estándar de programar, por lo que los nombres de las interfaces deben ser lo más cortos y agradables posible. Las clases de implementación deberían ser más feas para desalentar su uso.
Al cambiar de una clase abstracta a una interfaz, una convención de codificación con el prefijo I implica cambiar el nombre de todas las apariciones de la clase. ¡No es bueno!
¿Existe realmente una diferencia entre:
class User implements IUser
y
class UserImpl implements User
¿Si de lo único que estamos hablando es de convenciones de nomenclatura?
Personalmente, prefiero NO preceder la interfaz con I
ya que quiero codificar la interfaz y considero que eso es más importante en términos de la convención de nomenclatura. Si llama a la interfaz IUser
, cada consumidor de esa clase debe saber que es un archivo IUser
. Si llama a la clase UserImpl
, solo la clase y su contenedor DI conocen la Impl
pieza y los consumidores simplemente saben que están trabajando con un archivo User
.
Por otra parte, las veces que me he visto obligado a usar Impl
porque no se presenta un nombre mejor han sido pocas y espaciadas porque la implementación recibe un nombre de acuerdo con la implementación porque ahí es donde es importante, por ejemplo
class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
Puede haber varias razones por las que Java generalmente no utiliza la convención IUser.
Parte del enfoque orientado a objetos es que no es necesario saber si el cliente está utilizando una interfaz o una clase de implementación. Entonces, incluso List es una interfaz y String es una clase real, se les puede pasar un método a ambas; no tiene sentido distinguir visualmente las interfaces.
En general, preferiremos el uso de interfaces en el código del cliente (preferiremos List a ArrayList, por ejemplo). Por tanto, no tiene sentido hacer que las interfaces se destaquen como excepciones.
La convención de nomenclatura de Java prefiere nombres más largos con significados reales a prefijos de estilo húngaro. Para que el código sea lo más legible posible: una Lista representa una lista y un Usuario representa un usuario, no un IUser.