¿Cuándo es demasiado largo el nombre de un método Java? [cerrado]

173

En las últimas semanas he visto a algunos tipos que usan nombres realmente largos para un Método o Clase (50 caracteres), esto generalmente se basa en la premisa de que mejora la legibilidad, mi opinión es que un nombre largo como este es un indicador de que estamos tratando de hacer mucho o demasiado en una clase de método si necesitamos un nombre tan largo, sin embargo, quería saber qué piensan ustedes al respecto.

Un ejemplo es:

getNumberOfSkinCareEligibleItemsWithinTransaction
MexicanHacker
fuente
19
SÍ, es un "olor a código" ... c2.com/cgi/wiki?LongMethodSmell
Dan Rosenstark
23
Cuando tiene más de 666 caracteres, sabe que tiene un problema.
Thomas Eding
8
@yar en su ejemplo, lo contrario de "Método largo" es "Método corto", que se considera algo bueno. Entonces obviamente no se refiere al nombre del método; se refiere a líneas de código (o algo similar). por ejemplo, f()es una función muy corto, pero sin duda no es una buena práctica ... y algo que debe decirle a algunos matemáticos de programación por ahí :)
sfussenegger
3
@sfussenegger, es verdad. Pero apuesto a una correlación entre la longitud del nombre del método y la longitud del método. f()Puede que no sea una gran función, pero ese $()tipo es como una estrella de rock en el mundo del método Javascript.
Dan Rosenstark
77
@yar, el enlace que proporcionó se refería a la longitud del método en líneas, no a la longitud del nombre del método .
Thorbjørn Ravn Andersen

Respuestas:

398

Un nombre en Java, o en cualquier otro lenguaje, es demasiado largo cuando existe un nombre más corto que transmite igualmente el comportamiento del método.

JaredPar
fuente
65
Matemáticamente elegante.
Ricket
304
Entonces, por ejemplo, boolean doesShorterNameExistThatEquallyConvaysTheBehaviorOfTheMethod(String s)debe ser refactorizado boolean isTooLong(String s).
z5h
66
No estoy del todo de acuerdo, ya que no solo quieres transmitir el comportamiento, sino también mantener la convención del proyecto y el lenguaje. Entonces, en Python, se podría decir, eligible_items_cntpero en Java generalmente se dice getEligibleItemsCount.
flybywire
17
@flybywire: Cualquier convención que te haga escribir nombres demasiado largos es de dudoso beneficio.
MAK
20
@MAK @ S.Lott ¿qué pasa con getLength()vs. length()? Realmente me encanta mirar los autocompletados después de escribir 'get' o 'set', por lo que preferiría la convección sobre la concisión en este caso.
sfussenegger
202

Algunas técnicas para reducir la longitud de los nombres de métodos:

  1. Si todo su programa, clase o módulo trata sobre 'artículos para el cuidado de la piel', puede dejar el cuidado de la piel. Por ejemplo, si se llama a su clase SkinCareUtils, eso lo lleva agetNumberOfEligibleItemsWithinTransaction

  2. Puedes cambiar de adentro a adentro ,getNumberOfEligibleItemsInTransaction

  3. Puede cambiar Transacción a Tx, lo que lo lleva a hacerlo getNumberOfEligibleItemsInTx.

  4. O si el método acepta un parámetro de tipo Transaction, puede soltar el InTx por completo:getNumberOfEligibleItems

  5. Cambia numberOf por cuenta: getEligibleItemsCount

Ahora eso es muy razonable. Y es un 60% más corto.

flybywire
fuente
11
adicionalmente, 5) pondrá getEligibleItems()y getEligibleItemsCount()uno junto al otro en las listas ordenadas alfabéticamente (por ejemplo, la terminación automática o javadoc)
sfussenegger
44
Y como suele ser cierto, el nombre más corto se ajusta a la regla del haiku.
sal
2
@mercator El uso de una convención estándar como getEligibleItems sobre countEligibleItems reduce la posibilidad de ambigüedad en la declaración. Cuanto menos ambiguo sea lo que se supone que hace el método, aumenta la legibilidad. Sin profundizar en el método, un método que "cuenta" es menos claro que lo que un método que "consigue" logra a largo plazo.
Bill
53
No me gusta abreviado como Tx, Cnt, grph, y así sucesivamente ... (por cierto, Txes la abreviatura de "transmisión" o "transmisor")
Meinersbur
14
Sí, estuve de acuerdo contigo hasta que decidiste usar "Tx".
Ponkadoodle
183

Solo por un cambio, una respuesta no subjetiva: 65536 caracteres.

A.java:1: la representación UTF8 para la cadena "xxxxxxxxxxxxxxxxxxxx ..." es demasiado larga para el grupo constante

;-)

Mark Byers
fuente
44
sí, es demasiado tiempo cuando la JVM no puede manejarlo de ningún modo :)
Anurag
35
1 para la respuesta literal.
sal
37
Técnicamente, la especificación del lenguaje Java no tiene un límite superior para la longitud del identificador. Esta es una limitación de su implementación de JVM. ¡Salud!
uckelman
13
El compilador de Sun aparentemente no se ajusta a las especificaciones. java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8 dice: "Un identificador es una secuencia de longitud ilimitada ..."
Michael Myers
66
La especificación JVM no tiene un límite superior, como el mensaje de error señala. La representación de agrupación constante de utf8 está limitada a 2 ^ 16 bytes especificados aquí . Los nombres de clase y de método deben almacenarse como utf8 en el grupo constante.
thejoshwolfe
42

Estoy de acuerdo con todos: los nombres de los métodos no deberían ser demasiado largos. Sin embargo, quiero agregar una excepción:

Sin embargo, los nombres de los métodos de prueba JUnit pueden ser largos y deben parecerse a oraciones.

¿Por qué?

  • Porque no se llaman en otro código.
  • Porque se usan como nombres de prueba.
  • Porque luego se pueden escribir como oraciones que describen los requisitos. (Por ejemplo, usando AgileDox )

Ejemplo:

    @Test
    public void testDialogClosesDownWhenTheRedButtonIsPressedTwice() {
        ...
    }

Consulte " Diseño impulsado por el comportamiento " para obtener más información sobre esta idea.

Epaga
fuente
55
+1 Estoy de acuerdo con eso y también es lo que estoy haciendo, aunque ya no se requieren métodos JUnit 4 test, esto abre también la posibilidad de usar should: como dialogShouldCloseWhenTheRedButtonIsPressedTwice(). O puede llamar a la clase de prueba DialogShouldy luego el método closeWhenTheRedButtonIsPressedTwice(), por lo que leerlos juntos: DialogShould.closeWhenTheRedButtonIsPressedTwice().
stivlo
Si bien estoy de acuerdo, también sugeriría que una oración demasiado larga puede sugerir una prueba que está haciendo demasiado.
Brian Agnew
17

El contexto "... dentro de la transacción" debería ser obvio. De eso se trata la orientación a objetos.

El método es parte de una clase. Si la clase no significa "Transacción", y si no le evita tener que decir "WithinTransaction" todo el tiempo, entonces tiene problemas.

S.Lott
fuente
2
Podría tomar algún tipo de parámetro de transacción también
willcodejavaforfood
3
Como puede ver en la respuesta de mejor puntuación anterior, busque la simplicidad interior en lugar de los consejos de OO. +1
Dan Rosenstark
@yar La gente nunca se equivoca.
CurtainDog
12

Tiendo a usar la regla de haiku para los nombres:

 Seven syllable class names 
 five for variables
 seven for method and other names

Estas son reglas generales para los nombres máximos. Violo esto solo cuando mejora la legibilidad. Algo como recalculateMortgageInterest (currentRate, quoteSet ...) es mejor que recalculateMortgageInterestRate o recalculateMortgageInterestRateFromSet ya que el hecho de que involucra tasas y un conjunto de cotizaciones debe quedar bastante claro en los documentos integrados como javadoc o el equivalente .NET.

NOTA: No es un haiku real, ya que es 7-5-7 en lugar de 5-7-5. Pero todavía prefiero llamarlo haiku.

sal
fuente
13
Las clases obtienen siete, las variables menos de cinco, siete para el resto
James
8
"variables como máximo cinco" (menos de cinco no es preciso)
Jason S
Los nombres más pequeños podrían conducir a una menor legibilidad del código.
Deniss M.
10

Java tiene una cultura de alentar nombres largos, tal vez porque los IDE vienen con un buen autocompletado.

Este sitio dice que el nombre de clase más largo en el JRE es el InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedStateque tiene 92 caracteres de largo.

En cuanto al nombre del método más largo, he encontrado este supportsDataDefinitionAndDataManipulationTransactions, que tiene 52 caracteres.

flybywire
fuente
20
Parece que esa clase fue nombrada por las personas nombradas contratadas por el Departamento del Departamento de Redundancia para nombrar cosas en el Departamento del Departamento de Redundancia.
Michael Madsen
1
@MichaelMadsen: ¿Es realmente redundante o describe un marco anidado dentro de otro marco?
Endolith
PEP-8 quisiera una palabra con ese nombre de clase.
Mateen Ulhaq
9

Nunca use una palabra larga cuando una diminuta servirá.

No creo que su tesis de "la longitud del nombre del método es proporcional a la longitud del método" realmente aguanta.

Tome el ejemplo que da: "getNumberOfSkinCareEligibleItemsWithinTransaction". Eso me parece que solo hace una cosa: cuenta el número de artículos en una transacción que caen en una determinada categoría. Por supuesto, no puedo juzgar sin ver el código real del método, pero eso me parece un buen método.

Por otro lado, he visto muchos métodos con nombres muy cortos y concisos que hacen mucho trabajo, como "processSale" o el siempre popular "doStuff".

Creo que sería difícil dar una regla estricta sobre la longitud del nombre del método, pero el objetivo debería ser: lo suficientemente largo como para transmitir lo que hace la función, lo suficientemente corto como para ser legible. En este ejemplo, creo que "getSkinCareCount" probablemente habría sido suficiente. La pregunta es qué necesitas distinguir. Si tiene una función que cuenta los artículos elegibles para el cuidado de la piel en las transacciones y otra que cuenta los artículos elegibles para el cuidado de la piel en otra cosa, entonces "insideTransactions" agrega valor. Pero si no significa nada hablar de tales artículos fuera de una transacción, entonces no tiene sentido saturar el nombre con información tan superflua.

Dos, creo que es muy poco realista suponer que un nombre de cualquier longitud manejable le dirá exactamente lo que hace la función en todos los casos, excepto en los más triviales. Un objetivo realista es crear un nombre que le dé al lector una pista, y que pueda recordarse más tarde. Por ejemplo, si intento encontrar el código que calcula la cantidad de antimateria que debemos consumir para alcanzar la velocidad de deformación, si miro los nombres de las funciones y veo "calibrateTransporter", "firePhasers" y "calcAntimatterBurn", es bastante claro que los dos primeros no lo son pero el tercero podría serlo. Si compruebo y descubro que ese es el que estoy buscando, será fácil recordarlo cuando regrese mañana para trabajar en este problema un poco más. Eso es lo suficientemente bueno.

Tres nombres largos que son similares son más confusos que los nombres cortos. Si tengo dos funciones llamadas "calcSalesmanPay" y "calcGeekPay", puedo adivinar cuál es cuál a simple vista. Pero si se llaman "CalculateMonthlyCheckAmountForSalesmanForExportToAccountingSystemAndReconciliation" y "CalculateMonthlyCheckAmountForProgrammersForExportToAccountingSystemAndReconciliation", tengo que estudiar los nombres para ver cuál es cuál. La información adicional en el nombre es probablemente contraproducente en tales casos. Convierte un pensamiento de medio segundo en un pensamiento de 30 segundos.

Arrendajo
fuente
+1 por esta pobre respuesta que ha sufrido.
Dan Rosenstark
7

Diseñe su interfaz de la manera que desee y haga que la implementación coincida.

Por ejemplo, tal vez lo escribiría como

getTransaction().getItems(SKIN_CARE).getEligible().size()

o con secuencias Java 8:

getTransaction().getItems().stream()
    .filter(item -> item.getType() == SKIN_CARE)
    .filter(item -> item.isEligible())
    .count();
Christoffer Hammarström
fuente
6

Mi regla es la siguiente: si un nombre es tan largo que tiene que aparecer en una línea propia, entonces es demasiado largo. (En la práctica, esto significa que rara vez supero los 20 caracteres).

Esto se basa en investigaciones que muestran que el número de líneas verticales visibles de código se correlaciona positivamente con la velocidad / efectividad de la codificación. Si los nombres de clase / método comienzan a dañar eso significativamente, son demasiado largos.

Agregue un comentario donde se declare el método / clase y deje que el IDE lo lleve allí si desea una descripción larga de para qué sirve.

Rex Kerr
fuente
Me gustan las reglas como esta. Siempre y cuando tenga en cuenta que usted / su equipo los inventó al azar, todo está bien. Por otro lado, no puedo votar esto porque la "investigación que muestra" realmente necesitaría un enlace a esa investigación, o algo al respecto ...
Dan Rosenstark
5

La longitud del método en sí mismo es probablemente un mejor indicador de si está haciendo demasiado, e incluso eso solo te da una idea aproximada. Debes esforzarte por la concisión, pero la descripción es más importante. Si no puede transmitir el mismo significado en un nombre más corto, entonces el nombre en sí mismo probablemente esté bien.

Bill el lagarto
fuente
3

Cuando va a escribir el nombre de un método la próxima vez, piense en la siguiente cita

"The man who is going to maintain your code is a phyco who knows where you stay"
Sreejesh
fuente
13
Es bueno que sea solo algas y no un 'psicópata'
StingyJack
2

El nombre del método definitivamente es demasiado largo. Mi mente tiende a divagar cuando leo nombres de métodos tan grandes. Es como leer una oración sin espacios.

Personalmente, prefiero la menor cantidad de palabras posible en los métodos. Se le ayuda si el paquete y el nombre de la clase pueden transmitir significado. Si la responsabilidad de la clase es muy concisa , no hay necesidad de un nombre de método gigante. Tengo curiosidad por qué "WithinTransaction" allí.

"getNumberOfSkinCareEligibleItemsWithinTransaction" podría convertirse en:

com.mycompany.app.product.SkinCareQuery.getNumEligibleItems ();

Luego, cuando esté en uso, el método podría verse como "query.getNumEligibleItems ()"

Jesse
fuente
2

Un nombre de variable es demasiado largo cuando un nombre más corto permitirá una mejor legibilidad del código en todo el programa o en las partes importantes del programa.

Si un nombre más largo le permite transmitir más información sobre un valor. Sin embargo, si un nombre es demasiado largo, desordenará el código y reducirá la capacidad de comprender el resto del código. Esto suele suceder causando ajustes de línea y eliminando otras líneas de código de la página.

El truco es determinar cuál ofrecerá una mejor legibilidad. Si la variable se usa con frecuencia o varias veces en una pequeña cantidad de espacio, puede ser mejor darle un nombre corto y usar un comentario para aclarar. El lector puede consultar el comentario fácilmente. Si la variable se usa con frecuencia en todo el programa, a menudo como un parámetro o en otras operaciones complicadas, puede ser mejor recortar el nombre o usar siglas como recordatorio para el lector. Siempre pueden hacer referencia a un comentario por la declaración de variable si olvidan el significado.

Esta no es una compensación fácil de realizar, ya que debe considerar lo que el lector de código probablemente intente comprender y también tener en cuenta cómo cambiará y crecerá el código con el tiempo. Es por eso que nombrar cosas es difícil.

La legibilidad es la razón por la cual es aceptable usar i como contador de bucle en lugar de DescriptiveLoopCounterName. Debido a que este es el uso más común para una variable, puede gastar la menor cantidad de espacio en la pantalla explicando por qué existe. El nombre más largo solo va a perder tiempo al hacer que sea más difícil comprender cómo está probando la condición del bucle o indexando en una matriz.

En el otro extremo del espectro, si una función o variable se usa raramente como en una operación compleja, como pasar a una llamada de función de parámetros múltiples, puede darse el lujo de darle un nombre excesivamente descriptivo.

Ben Gartner
fuente
1

Como con cualquier otro lenguaje: cuando ya no describe la acción única que realiza la función.

Kaz Dragon
fuente
1

Yo diría que use una combinación de las buenas respuestas y sea razonable.

Describa completa, clara y legiblemente lo que hace el método.

Si el nombre del método parece demasiado largo, refactorice el método para hacer menos.

Bill K
fuente
1

Es demasiado largo cuando el nombre del método se ajusta a otra línea y la llamada al método es lo único en la línea y comienza bastante cerca del margen. Debe tener en cuenta el tamaño promedio de la pantalla de las personas que lo usarán.

¡Pero! Si el nombre parece demasiado largo, entonces probablemente sea demasiado largo. La forma de evitarlo es escribir su código de tal manera que esté dentro de un contexto y el nombre sea corto pero duplicado en otros contextos. Esto es como cuando puedes decir "ella" o "él" en inglés en lugar del nombre completo de alguien.

Brian T Hannan
fuente
1

Es demasiado largo cuando explica de manera verbosa de qué se trata.

Por ejemplo, estos nombres son funcionalmente equivalentes.

en Java: java.sql.SQLIntegrityConstraintViolationException

en Python / Django: django.db.IntegrityError

Pregúntese, en un paquete SQL / db, ¿cuántos tipos más de errores de integridad puede encontrar? ;) Por db.IntegrityErrorlo tanto, es suficiente.

vdboor
fuente
Siempre se podría discutir al revés. Cuando se explica detalladamente de qué se trata, obviamente está claro qué hace el método; de lo contrario, podría causar confusión y provocar un uso incorrecto del método.
Jonas Geiregat
0

Un nombre de identificador es demasiado largo cuando excede la longitud que su compilador Java puede manejar.

uckelman
fuente
3
¡¿Qué?! No veo por qué me votaron negativamente por esto. La pregunta no pedía una condición necesaria, ¡solo suficiente!
uckelman
0

Aquí hay dos formas o puntos de vista: uno es que realmente no importa cuánto sea el nombre del método, siempre que sea lo más descriptivo posible para describir lo que está haciendo el método (regla básica de las mejores prácticas de Java). Por otro lado, estoy de acuerdo con la publicación flybywire. Deberíamos usar nuestra inteligencia para tratar de reducir tanto como sea posible el nombre del método, pero sin reducir su descripción. La descripción es más importante :)

HackerGil
fuente
0

Un nombre es demasiado largo si:

  • Toma más de 1 segundo leer
  • Ocupa más RAM de la que asigna para su JVM
  • Es algo absurdamente llamado
  • Si un nombre corto tiene mucho sentido
  • Si se envuelve en tu IDE

Honestamente, el nombre solo necesita transmitir su propósito a los Desarrolladores que lo utilizarán como un método API público o que tendrán que mantener el código cuando se vaya. Solo recuerda KISS (mantenlo simple y estúpido)

Paul Gregoire
fuente