Use verbos con funciones, nombres con clases: ¿qué pasa con las interfaces? [cerrado]

23

Ok, entiendo las convenciones normales de usar verbos con funciones y sustantivos con clases. ¿Qué pasa con las interfaces? ¿Existe alguna metodología para crear nombres de interfaz que no sea tan obvia?

Solo para dejarlo claro, no estoy hablando sobre si poner una "I" delante del nombre o si usar camelCase o PascalCase. Me pregunto sobre el método de descifrar un nombre claro y semántico para una interfaz.

EDITAR Estoy obsesionado con cómo nombrar una interfaz de la manera más clara. Supongo que también tiene que ser un sustantivo porque cuando pienso en nombrar clases, pienso en el objeto del mundo "real" más cercano con el que pueda relacionarse. Supongo que las interfaces del mundo real son cosas como un teclado, mouse, control remoto, pantalla de cajero automático. Esos son todos sustantivos. De todos modos, cualquier información adicional sobre una buena manera de formular nombres de interfaz sería apreciada.

programador
fuente
2
Hm .. Basado en el título, pensé que se trataría de equiparar partes del discurso entre programación e inglés. En cuyo caso, madlibs parecen posibles.
Izkata
Recuerde, cuando crea una clase, también está creando una interfaz para objetos instanciados por esa clase ... O para decirlo de otra manera, las clases son interfaces realizadas . Por lo tanto, deberían usar la misma convención de nomenclatura.
Daniel T.
Además, en mi humilde opinión, "usar verbos con funciones" es demasiado general. Debe usar verbos con comandos y sustantivos con consultas .
Daniel T.

Respuestas:

21

Yo diría que depende de lo que defina la interfaz. En algunos casos, cuando la interfaz es bastante específica y detallada, creo que un sustantivo es mejor. Ejemplos de ello son IList, ICollection.

A veces, aunque una interfaz se trata más de agregar ciertas características generales a una clase. En ese caso, creo que un adjetivo es lo mejor. Ejemplos de ello son IDisposable, IEnumerable, ...

Quizás otra forma de pensar sobre esto es cuántas "habilidades" define su interfaz.

Por ejemplo, la IList<T>interfaz define estas habilidades: Agregar, Borrar, Contiene, Insertar, Eliminar, ... Estas son todas las propiedades de una lista, por lo que IListes un buen nombre.

IDisposablepor otro lado solo define una habilidad: Eliminar. Por lo tanto, es adecuado para cualquier cosa que sea desechable. De ahí el nombre IDisposable.

Kristof Claes
fuente
10
Sugeriría usar un adjetivo "_able" si su interfaz se nombraría después de las cosas que se pueden hacer a su objeto (por ejemplo IEnumerable), un sustantivo "_er" si su interfaz se nombraría después de las cosas que su objeto hace a otros objetos ( por ejemplo IEqualityComparer), y un nombre general si su interfaz lleva el nombre de un tipo de cosa cuyo comportamiento imita (por ejemplo IList<T>).
supercat
El comentario de @supercat realmente debería incluirse en esta respuesta. Tiene mucho sentido.
Nikhil Vartak
El prefijo real del nombre de la interfaz Ies redundante.
user1870400
5

Una interfaz describe el comportamiento, por lo que los nombres deberían decirlo. No estoy seguro acerca de una regla para esto, pero sabrá el nombre cuando lo escuche.

Algunos ejemplos:

Flyable      - Can Fly
Workable     - Can work
Negotiatable - Can negotiate.

Creo que no es apropiado nombrar interfaces Iy llamar Setcon ellas ISetporque, como desarrollador, no debería preocuparse si es una interfaz o una clase. Veo que esta práctica no existe en Java ahora.

ManuPK
fuente
+1 para "como desarrollador no debería preocuparse si es una interfaz o una clase".
Kazark
"Como desarrollador, no debe preocuparse si es una interfaz o una clase". No está de acuerdo porque si se trata de una interfaz, debe saber qué miembros debe implementar.
Maximus Minimus
@MaximusMinimus con el prefijo Ies redundante independientemente. Entonces, ¿por qué no prefijar las clases abstractas con Aclases regulares con Cetc.?
user1870400
@ user1870400: cierto, pero esa no es la parte con la que no estoy de acuerdo.
Maximus Minimus
4

Dado que una interfaz es realmente solo una expresión del "qué" pero no del "cómo" de un tipo, los nombraría de la misma manera que usted nombra las clases, al menos desde una perspectiva de discurso. Lo único que podría agregar a esto es que a menudo van a ser más generales que los implementadores específicos (por ejemplo, la interfaz "Cliente" puede tener implementadores "ProspectiveCustomer" y "PayingCustomer").

Erik Dietrich
fuente
0

Una interfaz se usa como una clase. Por lo tanto, también debe nombrarse con un sustantivo cuando nombra las clases con sustantivos. Prefiere sustantivos abstractos, por ejemplo "Vehículo" cuando las clases son "Coche" y "Camión".

thiton
fuente
0

Respuesta rápida: la interfaz es más sobre la adición de un CONJUNTO de habilidades, características, límites comunes o interconexiones entre entidades, clases, modelos, conceptos, etc.

Una cosa sobre agregar un comportamiento común a las clases y entidades, y luego aparecerá un buen nombre significativo para identificar el conjunto de características realizadas.

Nombre de interfaz como: IStateMachineBuilder, IUserContextProviderBuilder, IEntityBuilderBuilder, IActiveAware, etc.probablemente explique el concepto.

EL Yusubov
fuente
1
Sí, las interfaces representan contratos o capacidades; tanto es bien sabido. Pero, ¿cómo responde esto a la pregunta de cómo nombrarlos? Todo lo que realmente dice al respecto es: "Piénselo, y la inspiración lo golpeará". Esto no da ninguna recomendación, por ejemplo, cuál de los siguientes nombres debe elegirse, por qué: IStateMachineBuilder(sustantivo), IBuildStateMachine(nombrado después de una acción), ICanBuildStateMachine(nombrado después de una capacidad), etc.
stakx
0

Depende, si la interfaz contiene solo métodos, será bueno nombrarla usando verbos como "Acciones" donde como si representara una clase genérica que contiene campos estáticos finales, entonces podemos usar un sustantivo genérico como "Vehículo"

Joms Antony
fuente