Formateo de código: ¿Presentar funciones basadas en la jerarquía de llamadas dentro de un archivo de clase?

10

Una sugerencia del "Código limpio" de Bob Martin me hace rascarme la cabeza ... "Si una función llama a otra, deben estar verticalmente cerca y la persona que llama debe estar por encima de la persona que llama"

Hasta ahora, me he mantenido más o menos cerca de las pautas .Net, que agrupan a los miembros de la clase por tipo (propiedades, factores, funciones) y visibilidad (público / prot. / Privado). La sugerencia parece un problema al principio ... pero "podría funcionar". Personalmente, he encontrado casos en los que me gustó este diseño, más fácil de profundizar cuando estás en la cadena de llamadas correcta.

La idea detrás de la sugerencia parece sólida, pero otros escenarios como "déjame mirar la interfaz pública de esta clase" podrían empeorar. Tal vez el tío Bob está confiando en las clases pequeñas y el soporte IDE para ver los tipos ...

¿Alguien ha probado esto durante un período prolongado?

Actualización: Parece que un fragmento de código está en orden

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}
Gishu
fuente
2
El espantoso "Tío Bob" no es exactamente el lápiz más afilado de la caja.
Neil Butterworth
1
La idea es simplemente "darme una idea general antes de los detalles esenciales". Adaptarse según sea necesario.
Ryan Culpepper
2
Los Eagles deben estar cerca de volver a estar juntos nuevamente, porque me encuentro de acuerdo con el comentario de Neil. Crecí con PASCAL y "puse las cosas pequeñas primero" porque los compiladores de PASCAL requerían que todo se definiera antes de ser referenciados, y las declaraciones FORWARD generalmente estaban mal vistas.
John R. Strohm
@Neil - Estoy tratando de juzgar el mérito del consejo ... independientemente de la fuente. @ John - y la punta es lo opuesto a las declaraciones directas ... pones a la persona que llama primero ... las 'personas que llaman se declaran justo debajo de las personas que llaman.
Gishu
@ryanc: el preludio de ese párrafo enfatiza que los conceptos "estrechamente relacionados / cohesivos" deben estar verticalmente juntos [evita el desplazamiento cuando intentas resolver algo]. Las funciones llamadas se presentan debajo de la persona que llama en orden de llamadas. Ver fragmento de código agregado
Gishu

Respuestas:

2

Puede que me esté arriesgando aquí, pero me pregunto si la herramienta que usa tiene un impacto en esto. Me refiero al editor de texto versus la decisión IDE que los desarrolladores deben tomar.

En un IDE, tiene mucha más funcionalidad para ver los archivos de origen. Por lo general, puede obtener una lista de los métodos ordenados alfabéticamente, por visibilidad o incluso tipo de retorno en una barra lateral. También puede saltar a un método si tiene un uso para él. También puede generar árboles de llamadas para métodos y profundizar. Por lo general, también tiene un poderoso comando de búsqueda que puede admitir expresiones regulares. En esta situación, el orden de los métodos que cree realmente no importa, ya que tiene vistas distintas al código fuente disponible.

En un editor de texto, generalmente no tiene estas características: lo más cercano que tendrá es probablemente una búsqueda / reemplazo fuerte. Aquí, querrá prestar más atención a la estructura de su archivo, ya que puede ser más difícil de navegar. Desea minimizar el tiempo dedicado a desplazarse por el archivo para encontrar lo que está buscando, y un orden coherente y lógico de métodos puede ayudar.

Thomas Owens
fuente
+1 para el IDE; cuanto mejor sea el IDE, menos se
tendrá
1

El punto es que las cosas llamadas son menos interesantes que las cosas llamadas. Cuanto más un método llama a otros métodos, más probable es que ese método sea parte de la API externa del objeto (en lugar de ser un detalle de implementación). Eso significa que la API externa de la clase (métodos públicos, si su idioma admite ese concepto) naturalmente "querrá" estar en la parte superior del archivo, lo que facilitará la búsqueda de esos métodos. Por el contrario, las funciones de ayuda y tal "querrán" estar al final del archivo.

(Estoy explicando el concepto, no evaluando su efectividad).

Frank Shearar
fuente
Sí, pero eso implicaría que todas las funciones públicas deberían flotar en la parte superior del archivo como un grupo a saber. enfoque convencional. El enfoque propuesto es diferente (o al menos cómo lo leí) ... ver actualización en cuestión
Gishu
Sí, de hecho, sus funciones públicas deberían flotar a la cima. Por supuesto, algunos idiomas no tienen modificadores de visibilidad en absoluto ...
Frank Shearar
1

¿Si por período extendido te refieres a más de un par de días? Entonces No.
Hace un par de años comencé a hacer esto con un código nuevo, y lentamente me volví loco, hasta que paré.

Mi preferencia personal para diseñar clases es

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

Pero eso no es religioso, las propiedades y los métodos pueden mezclarse. La visibilidad no entra en él (no lo agrupo por público / protegido / privado)

Tenemos un tipo aquí en la oficina que mantiene una estructura estricta sobre todo en un archivo de clase, con todo agrupado en grupos principales y subgrupos, todos muy bien anidados en regiones. . . Tengo que admitir que creo que las regiones son obra de Satanás, me llevan a dar la vuelta.

Cada vez que abro una de sus clases me muero un poco por dentro :(

Binario Worrier
fuente
No estoy abogando por clases grandes con regiones agregadas para enmascarar el olor. No tratar de ser religioso ... pero tener un diseño consistente dentro de un proyecto acelera las cosas, saber dónde buscar. La agrupación de visibilidad bu como el beneficio adicional de tener la API pública muy juntos para que pueda encontrar su punto de entrada específico y perforar hacia abajo desde allí ...
Gishu
¿Y los constructores? Esos van bajo "métodos"?
Cody Gray
@Cody Gray: ¡Disculpas, olvidé a los ctors!
Binario Worrier
@Gishu: Creo que las herramientas modernas de visualización y navegación han eliminado la necesidad de diseños de archivos estrictos. ¿Importa dónde se implementa un método cuando puedo hacer clic derecho en el uso y "Ir a definición"?
Binario Worrier