¿Hay algún método Java que ordene convenciones? [cerrado]

159

Tengo una clase de gran tamaño (más o menos 40 métodos) que forma parte de un paquete que presentaré como trabajo del curso. Actualmente, los métodos están bastante mezclados en términos de utilidad pública / privada, etc. y quiero ordenarlos de manera sensata. ¿Hay una forma estándar de hacer esto? Por ejemplo, normalmente los campos se enumeran antes que los métodos, los constructores se enumeran antes que otros métodos y los captadores / establecedores duran; ¿Qué pasa con los métodos restantes?

Fredley
fuente
También tenga en cuenta que cuando trabaja con un código como este, la mayoría de los IDE le permiten ver la definición de lo que esté debajo del cursor automáticamente. Esto significa que no tiene que hacer nada más que mirar.
Thorbjørn Ravn Andersen
Si tiene 40 métodos en una sola clase - lo está haciendo mal
Ben

Respuestas:

132

Algunas convenciones enumeran primero todos los métodos públicos, y luego todos los privados, lo que significa que es fácil separar la API de la implementación, incluso cuando no hay una interfaz involucrada, si entiendes lo que quiero decir.

Otra idea es agrupar los métodos relacionados: esto hace que sea más fácil detectar costuras donde podría dividir su clase grande existente en varias más pequeñas y más específicas.

Jon Skeet
fuente
1
+1. Prefiero ordenar por visibilidad. Shame Eclipse no puede hacer esto automáticamente (siempre
agrupará
16
@finnw, presente un informe de error. Se sabe que cosas más extrañas se implementan desde allí.
Thorbjørn Ravn Andersen
3
@Ben: Mi experiencia es que cualquier "nunca" tendrá excepciones.
Jon Skeet
1
@JonSkeet en algunos casos, donde las convenciones de pedido ya no son relevantes, por ejemplo, clases de prueba. No escribir un código incorrecto es mejor consejo que cómo organizar un código incorrecto.
Ben
1
@Ben: Creo que tendremos que aceptar no estar de acuerdo. He escrito un código donde naturalmente hay muchos miembros, sin violar ninguna separación de preocupaciones, etc.
Jon Skeet
121
  1. Variables de clase (estáticas): Primero las variables de clase públicas, luego las protegidas y luego las privadas.

  2. Variables de instancia: primero públicas, luego protegidas y luego privadas.

  3. Constructores

  4. Métodos: estos métodos deben agruparse por funcionalidad en lugar de por alcance o accesibilidad. Por ejemplo, un método de clase privada puede estar entre dos métodos de instancia pública. El objetivo es facilitar la lectura y comprensión del código.

Fuente: http://www.oracle.com/technetwork/java/codeconventions-141855.html

Miguel
fuente
44
Esto tiene 15 años y probablemente esté un poco anticuado con la aparición de IDEs modernos ...
asilias
16
@assylias: OMI, la legibilidad es independiente del IDE. Mantenerse público antes que privado suele ser mejor.
saurabheights
40

El enlace más preciso a «Convenciones de código»: «Declaraciones de clase e interfaz»

Timofey Gorshkov
fuente
8
+1, afaik: esta es la ÚNICA publicación que realmente responde la pregunta. SÍ, hay un orden estándar según lo dictado por Oracle y Sun: 1. comentario público, 2. clase, 3. comentario interno, 4. datos estáticos, 5. datos de instancia, 6. ctors, 7. métodos y dentro de cada grupo de sección lógicamente, no por accesibilidad.
John Henckel
@VadimKirilchuk «Internet Archive» estaba caído ...
Timofey Gorshkov
15

No estoy seguro de si existe un estándar universalmente aceptado, pero mis propias preferencias lo son;

  • constructores primero
  • métodos estáticos a continuación, si hay un método principal, siempre antes que otros métodos estáticos
  • a continuación, los métodos no estáticos, generalmente en orden de importancia del método seguido por cualquier método que llame. Esto significa que los métodos públicos que llaman a otros métodos de clase aparecen hacia arriba y los métodos privados que no llaman a otros métodos generalmente terminan hacia abajo
  • métodos estándar como toString, equalsyhashcode próximo
  • getters y setters tienen un lugar especial reservado justo al final de la clase
Qwerky
fuente
Realmente prefiero los constructores al final porque un constructor escrito correctamente debería hacer muy poco más que asignar sus argumentos a las propiedades.
GordonM
@GordonM ¿Por qué piensas eso? Yo iría tan lejos como para argumentar que lo contrario es cierto. Siempre debe pensar en la API más limpia para sus clases. Y a menudo esa no es la forma en que se almacenan, así que a menudo hago un poco de procesamiento para aliviar a la persona que llama de esta carga
Neuron
@GordonM No estoy hablando de efectos secundarios. Por lo tanto, no hay cambios en las listas que se aprobaron ni nada por el estilo. Solo pasar y establecer valores requiere que la Clase le diga mucho sobre su implementación, lo que no debería ser el caso
Neuron
@LonelyNeuron No estoy muy seguro de lo que estás diciendo aquí, pero parece que estás diciendo que el constructor debería hacer mucho trabajo de configuración además de asignar sus argumentos al estado interno. Esto definitivamente está mal, porque significa que las cosas están sucediendo por "magia". Una llamada a new Thing()solo debería dar como resultado una nueva Cosa instanciada. No debería resultar en conexiones de base de datos abiertas, archivos escritos, etc. etc.
GordonM
@LonelyNeuron Tener dependencias en un constructor no le dice nada sobre la implementación de la clase, aparte de cuáles son sus dependencias. Esto es algo bueno, no malo.
GordonM
12

40 métodos en una sola clase es un poco demasiado.

¿Tendría sentido mover parte de la funcionalidad a otras clases adecuadamente nombradas? Entonces es mucho más fácil entenderlo.

Cuando tiene menos, es mucho más fácil enumerarlos en un orden de lectura natural. Un paradigma frecuente es enumerar cosas antes o después que las necesite, en el orden en que las necesita.

Esto generalmente significa que main()va arriba o abajo.

Thorbjørn Ravn Andersen
fuente
1
estás tan a la derecha - esto no es un problema de pedido
kostja
44
No siempre tiene una opción, por ejemplo, si está implementando una interfaz con muchos métodos.
finnw
55
Esta es una actividad de Android, por lo que hay muchos que simplemente no pueden ir a ningún otro lado onPause(), onResume()etc., así como todos mis OnClickListenercampos, que, aunque son campos, no se ven ni se comportan como ellos, por lo que es razonable enumerarlos por separado.
fredley
@finnw, las clases abstractas son agradables y utilizables para este propósito.
Thorbjørn Ravn Andersen
11

Mi "convención": estática antes de la instancia, pública antes que privada, constructor antes de los métodos, pero método principal en la parte inferior (si está presente).

eljenso
fuente
2

Además, eclipse ofrece la posibilidad de ordenar los miembros de la clase por usted, si por alguna razón los confundió:

Abra su archivo de clase, vaya a "Fuente" en el menú principal y seleccione "Ordenar miembros".

tomado de aquí: Métodos de clasificación en Eclipse

Stephan Richter
fuente
1

¿Estás usando Eclipse? Si es así, me quedaría con el orden de clasificación de miembros predeterminado, porque es probable que sea más familiar para quien lea su código (aunque no es mi orden de clasificación favorito).

finnw
fuente