Convenciones de nomenclatura para métodos java que devuelven booleanos (sin signo de interrogación)

94

Me gusta usar un signo de interrogación al final de los nombres de métodos / funciones en otros idiomas. Java no me deja hacer esto. Como solución alternativa, ¿de qué otra manera puedo nombrar métodos de retorno booleanos en Java? El uso de un is, has, should, canen la parte delantera de un sonido método bien para algunos casos. ¿Existe una mejor manera de nombrar tales métodos?

Por ejemplo, createFreshSnapshot?

letronje
fuente
2
¿Qué idioma permite un ?nombre de método?
SLaks
11
@SLaks, Scheme, Ruby ...
Skilldrick
en el esquema, siempre ponemos pal final del nombre del método
Erick Robertson
@Erick: no siempre, pero "p" es una forma estándar de designar predicados
Jason S
nosotros = mi clase de esquema de pregrado siempre lo hizo. Nunca usaría esta convención en Java.
Erick Robertson

Respuestas:

123

La convención es hacer una pregunta en el nombre.

Aquí hay algunos ejemplos que se pueden encontrar en el JDK:

isEmpty()

hasChildren()

De esa manera, los nombres se leen como si tuvieran un signo de interrogación al final.

¿La colección está vacía?
¿Este Nodo tiene hijos?

Y, entonces, truesignifica sí y falsesignifica no.

O puede leerlo como una afirmación:

La colección está vacía.
El nodo tiene hijos

Nota:
A veces es posible que desee nombrar un método como createFreshSnapshot?. Sin el signo de interrogación, el nombre implica que el método debería crear una instantánea, en lugar de verificar si se requiere una.

En este caso, debe repensar lo que realmente está preguntando. Algo como isSnapshotExpiredes un nombre mucho mejor y transmite lo que el método le dirá cuando se lo llame. Seguir un patrón como este también puede ayudar a mantener más funciones puras y sin efectos secundarios.

Si usted hace una búsqueda de Google para isEmpty()la API de Java, se obtiene una gran cantidad de resultados.

jjnguy
fuente
¿Qué pasa con createFreshSnapshot?
letronje
4
@letr, bueno, probablemente cambiaría el nombre de iluminado isSnapshotExpiredo algo así. (según sus criterios)
jjnguy
8
Soluciono el problema de 'createFrshSnapshot' usando la palabra 'should', es decir, "shouldCreateFreshSnapshot ()" (aunque en este caso isSnapshotExpired () es mejor)
DJClayworth
1
Verifico si los mensajes de latidos deben enviarse con un shouldHeartbeat()método.
Erick Robertson
¿Por qué pensar eso isEmpty()y hasChildren()son preguntas y no afirmaciones ? En realidad, se lee un poco mejor en inglés si piensa en esos nombres como afirmaciones o predicados.
rick
29

Si desea que su clase sea compatible con la especificación de Java Beans , de modo que la utilización de herramientas de reflexión (por ejemplo JavaBuilders , JGoodies Binding ) pueden reconocer captadores de Boole, ya sea para uso getXXXX()o isXXXX()como un nombre de método. De la especificación de Java Beans:

8.3.2 Propiedades booleanas

Además, para las propiedades booleanas, permitimos que un método getter coincida con el patrón:

public boolean is< PropertyName > ();

Este método "es < PropertyName >" puede proporcionarse en lugar de un método "get < PropertyName >", o puede proporcionarse además de un método "get < PropertyName >". En cualquier caso, si el método "is < PropertyName >" está presente para una propiedad booleana, usaremos el método "is < PropertyName >" para leer el valor de la propiedad. Una propiedad booleana de ejemplo podría ser:

public boolean isMarsupial();
public void setMarsupial(boolean m);
Jason S
fuente
Es confuso cuando dices que public boolean is<PropertyName>(); parece un genérico.
Erick Robertson
Oye, solo estoy citando la especificación. Lo pondré en cursiva según las especificaciones.
Jason S
4
No me importa ABT Java compatibilidad habas, sólo quiero mis nombres de los métodos que suenan bien :)
letronje
4
Incluso si no le importa la compatibilidad de Javabeans, vale la pena seguir la convención de nomenclatura, porque ha crecido mucho más allá del alcance original de los 'beans' configurados en los IDE. Por ejemplo, si usa isEmpty como nombre de método, puede llamar a este método desde JSP usando object.empty, sin embargo, no puede llamar a métodos con otros prefijos, por lo que no puede usar object.children para llamar a object.hasChildren (). Entonces JSP y EL (Expression Language) le permiten acceder a las propiedades de Javabeans. Una gran victoria si me preguntas.
Stijn de Witt
JavaBeans es muy específico, gracias por recordarlo. A menudo me pregunto y tiendo a pensar que estoy atrapado con el prefijo 'es', pero no del todo.
Snicolas
26

Quiero publicar este enlace, ya que puede ayudar más a los píos que verifican esta respuesta y buscan más convenciones de estilo Java

Pautas de estilo de programación de Java

El elemento "2.13 es un prefijo que se debe utilizar para las variables y métodos booleanos". es específicamente relevante y sugiere el prefijo is .

La guía de estilo continúa sugiriendo:

Hay algunas alternativas al prefijo is que encajan mejor en algunas situaciones. Estos son los prefijos has , can y should :

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Si sigue las Pautas, creo que el método apropiado se llamaría:

shouldCreateFreshSnapshot()
kommradHomer
fuente
2
Para su información, las pautas son servicios de software geotécnico con derechos de autor. Dicho esto, han hecho referencia a la fuente en la parte inferior para sugerir que son legítimos.
Donal Lafferty
11

Para los métodos que pueden fallar, es decir, si especifica boolean como tipo de retorno, usaría el prefijo try:

if (tryCreateFreshSnapshot())
{
  // ...
}

Para todos los demás casos, use prefijos como is.. has.. was.. can.. allows....

codymanix
fuente
15
Pero intentar no transmite que es una pregunta (tiene un valor de retorno).
Steve Kuo
Nunca devuelva un booleano para indicar si un método falló o no. Si el método falló, lanza una excepción. Imagine que el método falla y obtiene un falso, ¿cómo determinaría exactamente qué salió mal?
Wouter van Koppen
5

El estándar es el uso de 'es' o 'tiene' como prefijo. Por ejemplo isValid, hasChildren.

BillThor
fuente
2

ises el que me he encontrado más que ningún otro. Sin embargo, cualquier cosa que tenga sentido en la situación actual es la mejor opción.

Skilldrick
fuente
0

Quiero señalar una vista diferente sobre esta convención de nomenclatura general , por ejemplo:

ver java.util.Set :boolean add​(E e)

donde la justificación es:

Realice algún procesamiento y luego informe si tuvo éxito o no .

Si bien returnes cierto que booleanel nombre del método debe indicar que el procesamiento debe completarse en lugar del tipo de resultado (booleano para este ejemplo).

Su createFreshSnapshotejemplo me parece más relacionado con este punto de vista porque parece significar esto: cree una instantánea nueva y luego informe si la operación de creación tuvo éxito. Teniendo en cuenta este razonamiento, el nombre createFreshSnapshotparece ser el mejor para su situación.

adrhc
fuente
1
No estoy seguro de por qué está siendo rechazado, estoy de acuerdo. Aunque evito usarlo, porque no es semántico en absoluto, es una convención utilizada por muchas API internas de Java.
Kamil Bęben
1
Supongo que porque inicialmente solo escribí "Set: boolean add (E e)" para que la gente no se diera cuenta de que se trata del conocido java.util.Set; o tal vez porque mi inglés es tan malo: D. Gracias por el upvote :)
adrhc