¿Debo anidar funciones en idiomas que me permitan hacer eso o debería evitarlo?

12

En JavaScript, PL / SQL y algunos otros lenguajes, las funciones pueden anidarse, es decir, declararse dentro de otra función. Esto podría usarse para dividir una función grande en piezas más pequeñas, pero mantener esas piezas dentro del contexto de la función más grande.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

En algunos casos, cuando esas funciones más pequeñas no usan variables locales de la función más grande, esto podría cambiar fácilmente a una versión en la que todas las funciones no estén asignadas.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Suponiendo que esas funciones anidadas no se usen en ningún otro lugar, ¿es mejor mantenerlas dentro del contexto de la función grande o es malo porque esto es exactamente lo que hace que la función grande sea, bueno, grande?

usuario281377
fuente

Respuestas:

8

Es una cuestión de opinión, pero evitaría las funciones de anidación a menos que fuera realmente una parte necesaria y deliberada de su diseño.

Cuando anida funciones, en la mayoría de los idiomas, termina con algún tipo de efecto mecánico. Lo más común e interesante es cerrar el alcance léxico de una variable que se puede usar dentro del cuerpo, pero otras (por ejemplo, la visibilidad de la función) también aparecen algunas veces.

Esas son herramientas típicamente impresionantes, cuando se usan correctamente, pero son herramientas complejas, porque pueden producir efectos no locales o no obvios cuando se mira el código por primera vez.

Si no los usa, muchas personas leerán el código y no verán nada que lo haga, por lo que asumirán que se lo perdieron y volverán a mirar, tratando de averiguar por qué lo hicieron de esa manera, y no en un ámbito separado.

También se arriesga a que los futuros programadores se cierren deliberada o accidentalmente sobre algo que no pretendían, al no notar el riesgo allí mismo.

Finalmente, si su declaración de función declara una función con nombre fuera del alcance de la función de cierre, simplemente evítela. Eso es súper confuso para todos.

En cuanto a la nota final: porque el código de funciones individuales ayudan a delimitar, funciones de anidación es menos problemático que una sola función gigante, pero en última instancia hace media lectura de un código mucho más de entender doTooMuch()- especialmente si usted puede ocultar el código entre las declaraciones de funciones anidadas, o Necesito comprobar que nadie lo hizo.

Daniel Pittman
fuente
-1: Javascript no es "la mayoría de los idiomas". Anidar funciones en Javascript es una práctica normal.
Kevin Cline
2
Las funciones de anidación de @kevincline en JavaScript son una mala práctica común
Raynos
@Raynos: Si no los anidas, ¿dónde los vas a poner? No hay clases para contenerlos. Aquí hay un código típico:jquery(function($){ $('#id').click(function(){...}); }
Kevin Cline
@kevincline ... Código típico para novatos, necesita funciones anidadas en una profundidad. Y eso se debe a que JavaScript no tiene un alcance de módulo, por lo que necesita ese cierre anónimo.
Raynos
¿Y si ese clic ejecuta una llamada Ajax, con una devolución de llamada de finalización? Ahora tiene funciones anidadas en dos niveles. Claro, podría limitar el anidamiento asignando los cierres anónimos a las variables. ¿Es eso realmente mejor?
Kevin Cline
2

Esta es una de esas preguntas que no tienen una respuesta correcta y me vienen a la mente palabras como "preferencia personal", "práctica de equipo". En mi opinión, las pequeñas funciones (ahora aquí hay otra cosa subjetiva) que no se usan en ningún lugar pertenecen a sus funciones principales, especialmente cuando no se pueden nombrar.

devmiles.com
fuente
0

Esta pregunta no tiene una respuesta correcta, porque ninguna opción maximiza la encapsulación. Si los anida, todavía tienen acceso a variables que no deberían. Si no lo hace, entonces otras funciones tienen acceso a funciones que no deberían. De cualquier manera, pierdes.

DeadMG
fuente