Puedo pensar en al menos dos argumentos a favor de las funciones largas:
Significa que tiene mucho contexto alrededor de cada línea. Una forma de formalizar esto: dibuje el gráfico de flujo de control de su código. En un vértice (~ = línea) entre la entrada de la función y la salida de la función, conoce todos los bordes entrantes. Cuanto más larga sea la función, más vértices hay.
Muchas funciones pequeñas significan que hay un gráfico de llamadas más grande y complejo. Elija una línea aleatoria en una función aleatoria y responda la pregunta "¿en qué contexto (s) se ejecuta esta línea?" Esto se vuelve más difícil cuanto más grande y complejo es el gráfico de llamadas, porque tienes que mirar más vértices en ese gráfico.
También hay argumentos en contra de las funciones largas: la capacidad de prueba unitaria me viene a la mente. Use t̶h̶e̶ ̶f̶o̶r̶c̶e̶ su experiencia al elegir entre uno y el otro.
Nota: No estoy diciendo que tu jefe tenga razón, solo que su perspectiva puede no estar completamente desprovista de valor.
Creo que mi opinión es que el buen parámetro de optimización no es la longitud de la función. Creo que una idea más útil para pensar en términos es la siguiente: si todo lo demás es igual, es preferible poder leer en el código una descripción de alto nivel tanto de la lógica empresarial como de la implementación. (Los detalles de implementación de bajo nivel siempre se pueden leer si puede encontrar el bit de código relevante).
Comentando la respuesta de David Arno :
Escribir pequeñas funciones es una molestia porque te obliga a pasar a cada una de las pequeñas funciones para ver qué está haciendo el código.
Si la función está bien nombrada, este no es el caso. isApplicationInProduction es evidente y no debería ser necesario examinar el código para ver qué hace. De hecho, lo contrario es cierto: examinar el código revela menos en cuanto a la intención que el nombre de la función (por lo que su jefe tiene que recurrir a los comentarios).
El nombre hace evidente lo que el valor de retorno significa , pero no dice nada acerca de los efectos de la ejecución del código (= lo que el código hace ). Los nombres (solo) transmiten información sobre la intención , el código transmite información sobre el comportamiento (a partir del cual a veces se pueden inferir partes de la intención).
A veces quieres una, a veces la otra, por lo que esta observación no crea una regla de decisión universalmente válida unilateral.
Ponga todo en un bucle principal principal, incluso si el bucle principal tiene más de 300 líneas, es más rápido de leer
Puede ser más rápido escanear, pero para realmente "leer" el código, debe ser capaz de ejecutarlo efectivamente en su cabeza. Eso es fácil con funciones pequeñas y es muy, muy difícil con métodos que tienen cientos de líneas de largo.
Estoy de acuerdo en que tienes que ejecutarlo en tu cabeza. Si tiene 500 líneas de funcionalidad en una función grande frente a muchas funciones pequeñas, no me queda claro por qué esto se hace más fácil.
Suponga el caso extremo de 500 líneas de código de efectos secundarios de línea recta y desea saber si el efecto A ocurre antes o después del efecto B. En el caso de función grande, use Re Pág / Abajo para ubicar dos líneas y luego comparar Línea de números. En el caso de muchas funciones pequeñas, debe recordar en qué lugar del árbol de llamadas ocurren los efectos, y si olvidó, debe pasar una cantidad de tiempo no trivial redescubriendo la estructura de este árbol.
Al atravesar el árbol de llamadas de las funciones de soporte, también se enfrenta al desafío de determinar cuándo ha pasado de la lógica empresarial a los detalles de implementación. Afirmo sin evidencia * que cuanto más simple es el gráfico de llamadas, más fácil es hacer esta distinción.
(*) Al menos soy honesto al respecto ;-)
Una vez más, creo que ambos enfoques tienen fortalezas y debilidades.
Escriba solo funciones pequeñas si tiene que duplicar código
Estoy en desacuerdo. Como muestra su ejemplo de código, las funciones pequeñas y bien nombradas mejoran la legibilidad del código y deben usarse siempre que [por ejemplo] no le interese el "cómo", solo el "qué" de una funcionalidad.
Si está interesado en el "cómo" o el "qué" es una función del propósito para el que está leyendo el código (por ejemplo, obtener una idea general en lugar de rastrear un error). El propósito para el que está leyendo el código no está disponible mientras escribe el programa, y lo más probable es que lea el código para diferentes propósitos; diferentes decisiones se optimizarán para diferentes propósitos.
Dicho esto, esta es la parte del punto de vista del jefe con la que probablemente no estoy de acuerdo.
No escriba una función con el nombre del comentario, coloque su línea de código compleja (3-4 líneas) con un comentario arriba. De esta manera, puede modificar el código que falla directamente
Realmente no puedo entender el razonamiento detrás de este, suponiendo que realmente sea serio. [...] Los comentarios tienen un defecto fundamental: no se compilan / interpretan y, por lo tanto, no se pueden probar de forma unitaria. El código se modifica y el comentario se queda solo y terminas sin saber cuál es el correcto.
Los compiladores solo comparan nombres para la igualdad, nunca te dan un Error de nombre engañoso. Además, debido a que varios sitios de llamadas pueden invocar una función determinada por su nombre, a veces es más arduo y propenso a errores cambiar un nombre. Los comentarios no tienen este problema. Sin embargo, esto es algo especulativo; para resolver esto realmente, uno probablemente necesitaría datos sobre si los programadores tienen más probabilidades de actualizar comentarios engañosos frente a nombres engañosos, y no tengo eso.