204 votos

Interfaz nombrando en Java

La mayoría de los lenguajes OO prefijo sus nombres de interfaz con un capital I, ¿por qué Java no hacer esto? ¿Cuál fue la justificación para no cumplir con la convención?

Para demostrar lo que quiero decir, si yo quería tener una interfaz de Usuario y un Usuario de la aplicación tendría dos opciones en Java:

  1. Class = Usuario, Interfaz = UserInterface
  2. Class = UserImpl, La Interfaz De Usuario =

Donde en la mayoría de los idiomas:

Class = Usuario, Interfaz = IUser

Ahora, uno podría argumentar que siempre se puede elegir una mayoría nombre descriptivo para el usuario de la aplicación y el problema desaparece, pero Java está empujando un POJO enfoque de las cosas y la mayoría de los contenedores IOC uso DynamicProxies ampliamente. Estas dos cosas juntas significa que usted tendrá un montón de interfaces con una sola POJO aplicación.

Así que, supongo que mi pregunta se reduce a: "¿vale la pena siguientes a la Interfaz más amplia de la convención de nomenclatura especialmente a la luz de donde Frameworks de Java, parecen ser la partida?"

214voto

starblue Puntos 29696

Prefiero no utilizar un prefijo de interfaces:

  • El prefijo duele la legibilidad.

  • Mediante interfaces de clientes es la mejor manera estándar al programa, para que interfaces nombres deben ser lo más corta y agradable posible. Implementación de clases debe ser feo desalentar su uso.

  • Al cambiar de una clase abstracta a una interfaz de un Convenio de codificación con prefijo implica cambiar todas las ocurrencias de la clase el nombre---no es bueno!

75voto

MrWiggles Puntos 6622

¿Existe realmente una diferencia entre:

class User implements IUser

y

class UserImpl implements User

si todo lo que estamos hablando es de las convenciones de nomenclatura?

Personalmente prefiero NO precedió a la interfaz con el "yo" como quiero ser la codificación de la interfaz y considero que es más importante en términos de la convención de nomenclatura. Si usted llama a la interfaz de IUser, a continuación, todos los consumidores de que las necesidades de la clase para saber su un IUser. Si usted llama a la clase UserImpl, a continuación, sólo la clase y su DI contenedor saber sobre la Impl parte y los consumidores sólo saben que están trabajando con un Usuario.

A continuación, nuevamente, las veces que me he visto obligado a utilizar Impl debido a un mejor nombre no se presenta, han sido pocos y distantes entre sí debido a que la aplicación tendrá el nombre de acuerdo a la aplicación, ya que es donde es importante, por ejemplo.

class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO

57voto

Avi Puntos 14468

Puede haber varias razones por las que Java no suelen utilizar el IUser convención.

  1. Parte del enfoque Orientado a Objetos es que usted no tiene que saber si el cliente está utilizando una interfaz o una clase de implementación. Así, aunque la Lista es una interfaz y un String es una clase, un método puede ser transmitida tanto de ellos - no tiene sentido distinguir visualmente las interfaces.

  2. En general, que en realidad se prefiere el uso de interfaces en el código de cliente (prefieren Lista de ArrayList, por ejemplo). Por tanto, no tiene sentido hacer que las interfaces se destacan como excepciones.

  3. El Java convención de nomenclatura prefiere más nombres con significados reales con el húngaro-estilo de prefijos. De modo que el código va a ser tan legible como sea posible: una Lista representa una lista, y un Usuario representa a un usuario y no de un IUser.

54voto

ng. Puntos 4096

También hay otra convención, utilizado por muchos proyectos de código abierto, incluyendo la Primavera.

interface User {
}

class DefaultUser implements User {
}

class AnotherClassOfUser implements User {
}

Yo personalmente no le gusta el "yo" prefijo por la sencilla razón de que se trata de un facultativo de la convención. Así que si puedo adoptar a este no IIOPConnection significa una interfaz para IOPConnection? ¿Qué pasa si la clase no tiene el "yo" como prefijo, hago saber que no es una interfaz..la respuesta es no, porque los convenios no siempre se cumplen, y la policía se les va a crear más trabajo que la propia convención salva.

30voto

Andreas Petersson Puntos 8096

Bob Lee dijo una vez en una presentación:

¿cuál es el punto de una interfaz si tener sólo una aplicación.

así. puedes empezar con una aplicación, sin necesidad de un interfaz. posteriormente se decide, además, hay una necesidad de una interfaz de aquí, así que usted convertir su clase a una interfaz.

a continuación, se hace evidente: la clase original fue llamado de Usuario. su interfaz es ahora llamado el Usuario. tal vez usted tiene un UserProdImpl y un UserTestImpl. si usted ha diseñado su aplicación, cada una de las clases (a excepción de los que a instancias de Usuario) será invariable y no se dará cuenta de que de repente el se pasan una interfaz.

por lo que queda claro -> Interfaz de Usuario de la aplicación UserImpl.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X