Nomenclatura de interfaces en Java [cerrado]

Resuelto Allain Lalonde asked hace 15 años • 11 respuestas

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:

  1. Clase = Usuario, Interfaz = Interfaz de Usuario
  2. 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?"

Allain Lalonde avatar Feb 12 '09 22:02 Allain Lalonde
Aceptado

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!

starblue avatar Feb 12 '2009 16:02 starblue

¿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 Iya 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 Implpieza 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 Implporque 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
tddmonkey avatar Feb 12 '2009 16:02 tddmonkey

Puede haber varias razones por las que Java generalmente no utiliza la convención IUser.

  1. 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.

  2. 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.

  3. 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.

Avi avatar Feb 12 '2009 16:02 Avi