En Java, ¿deberían los ayudantes privados ir por encima o por debajo de los métodos públicos? [cerrado]

24

Me di cuenta de que un compañero de trabajo y yo tenemos prácticas opuestas con respecto al orden de los métodos en nuestras clases de Java. Uno de nosotros comienza una clase con sus principales métodos públicos, y luego pone a todos los ayudantes privados después. El otro de nosotros se asegura de que los métodos públicos estén al final.

Claramente, esto es solo una cuestión de estilo y no hay una respuesta correcta. Sin embargo, antes de decidir que este asunto es solo otra pelea entre Yooks y Zooks y simplemente elegir una u otra arbitrariamente, me preguntaba si quizás había una recomendación estándar de guía de estilo Java o alguna razón práctica por la cual un enfoque es mejor que el otro.

Brandon Yarbrough
fuente
13
No importa. Lanza una moneda. Elegir uno. Quedarse con eso.
posible duplicado de colocación de métodos
Kilian Foth
@KilianFoth: esta pregunta se hizo 3 meses antes y tiene más respuestas. ¿No haría eso la pregunta en cuestión un duplicado de esta pregunta?
Brandon Yarbrough

Respuestas:

25

Si bien se reduce a la preferencia normalmente, sin duda debe tratar de cumplir con un estándar común dentro de su organización. Entonces, sea lo que sea que decida, elija un estándar y adopte universalmente.

En cuanto a qué elegir, si siguiera las sugerencias que se ofrecen en Clean Code , podría leer el archivo de arriba a abajo como un artículo de periódico, lo que naturalmente sugeriría que los métodos auxiliares aparezcan después de los métodos que son ración. Esto llevaría a la máxima legibilidad de la estructura del código. Entonces si tuvieras que tener

public void doSomething()
{
     helpMe();
     helpMeAgain();
}

Su archivo estaría estructurado como

public void doSomething() { }
private void helpMe() { }
private void helpMeAgain() { }

Otro efecto secundario de esto es que descubres que tus ayudantes tienen sus propios ayudantes, y te ayuda a descubrir lo que realmente tienes es otra clase que vive dentro de tu archivo, y puedes refactorizar limpiamente para extraerlo a su propia clase ya que esos métodos son ya agrupados en orden. Pero eso es un beneficio secundario.

Anthony Pegram
fuente
Me alegra que hayas dicho esto o si no lo hubiera hecho Le pregunté al propio Bob Martin cómo ordena las cosas si 2 métodos utilizan cada uno un tercer método. En ese caso, coloca el tercero debajo de los otros dos.
Daniel Kaplan
1
Su ejemplo no lo muestra, pero esto lleva a métodos públicos mezclados entre los métodos privados. Utilizo esta técnica, pero a menudo me siento desgarrado y quiero impulsar todos los métodos públicos a la cima, porque también hay mucho que decir para leer la interfaz pública fácilmente.
Sean
@Sean, bueno, normalmente trataría de limitar la API pública de mi clase, o dejarla como una fachada si es apropiado, pero luego empujar los ayudantes de implementación a los colaboradores. Probar, refactorizar, extraer, repetir. Pero, por supuesto, depende de qué tan lejos quieras llegar. Prefiero mis clases pequeñas.
Anthony Pegram
11

Los métodos públicos son la interfaz de la clase. Alguien interesado en usar su clase solo se preocupará por la interfaz. Desde la perspectiva de un usuario de clase, sería útil tener primero los métodos públicos para reducir el desplazamiento.

mike30
fuente
5

En C y C ++, los métodos auxiliares a menudo se colocan primero porque luego no necesita una declaración. Mucha gente llevó ese hábito a otros idiomas donde no importa.

Prefiero los métodos públicos en la parte superior porque generalmente cuando abro un archivo estoy buscando su interfaz pública. No quiero tener que pasar por todos los detalles de implementación. También es el estilo más popular que he visto, así que hay que decirlo para la convención.

Karl Bielefeldt
fuente
2

Me gusta que el orden de los métodos en una clase se base en la legibilidad y el contexto, no en la visibilidad.

es decir, un método 'abierto' probablemente pertenece antes que un 'cierre'. Si dos métodos públicos 'a' y 'b' llaman a una 'c' privada, y son los únicos que la llaman, entonces me gusta que 'c' esté junto a ellos.

No creo que una convención de ordenar métodos basada en la visibilidad sea algo bueno.

ptyx
fuente
1

Tiendo a preferir ver mis clases donde los miembros se enumeran en orden de importancia / visibilidad (aquí por importancia quiero decir que tienen un impacto directo en la interfaz pública).

Por lo tanto, las funciones privadas tienden a ser empujadas hacia abajo.

Hay excepciones a esto en las que también tenderé a agrupar funcionalidades similares, por lo que aún es posible encontrar pequeñas funciones privadas entremezcladas con lo público.

Esto es, como dijiste, una cuestión de gustos.

Sin embargo, cuando trabaje en código que no sea mío, intentaré seguir las convenciones que se utilicen en el proyecto.

Una buena manera que encontré para hacer un seguimiento de esto es (suponiendo que trabaje aquí con Eclipse) crear una configuración de formato de código y exportarla con la fuente del proyecto y comprometerla al control de la fuente. De esa manera, la última y mejor convención de código para el proyecto está a solo unos pocos clics de distancia para configurar y hacer un habito de CTRL-SHIFT-F antes de comprometer evitará muchos argumentos.

La ventaja adicional de usar formateadores automáticos es que puedes hacer cosas en cualquier convención que te haga feliz y simplemente formatear el código antes de confirmar. YMMV según dicha convención y herramienta de formateo.

Newtopian
fuente