Sollte ich Funktionen in Sprachen verschachteln, die mir dies ermöglichen, oder sollte ich es lieber vermeiden?

12

In JavaScript, PL / SQL und einigen anderen Sprachen können Funktionen verschachtelt, dh in einer anderen Funktion deklariert werden. Dies könnte verwendet werden, um eine große Funktion in kleinere Teile zu zerlegen, diese Teile jedoch im Kontext der größeren Funktion zu halten.

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

    // doTooMuch body

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

In einigen Fällen, wenn diese kleineren Funktionen keine lokalen Variablen der größeren Funktion verwenden, kann dies leicht zu einer Version geändert werden, in der alle Funktionen nicht verschachtelt sind.

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

Unter der Annahme, dass diese verschachtelten Funktionen nirgendwo anders verwendet werden sollen, ist es besser, sie im Kontext der großen Funktion zu halten, oder ist es schlecht, weil genau dies die große Funktion groß macht?

user281377
quelle

Antworten:

8

Es ist Ansichtssache, aber ich würde Verschachtelungsfunktionen vermeiden, es sei denn, dies wäre tatsächlich ein notwendiger und bewusster Teil Ihres Entwurfs.

Wenn Sie Funktionen verschachteln, erhalten Sie in den meisten Sprachen einen mechanischen Effekt. Am häufigsten und interessantesten ist es, den lexikalischen Bereich einer Variablen zu schließen, die im Körper verwendet werden kann, aber auch andere (z. B. Sichtbarkeit der Funktion) werden manchmal angezeigt.

Dies sind normalerweise großartige Tools, wenn sie richtig verwendet werden - aber sie sind komplexe Tools, da sie beim ersten Blick auf den Code zu nicht lokalen oder nicht offensichtlichen Effekten führen können.

Wenn Sie sie nicht verwenden, lesen viele Leute den Code und sehen nichts, was das tut. Gehen Sie also davon aus, dass sie ihn verpasst haben, und schauen Sie noch einmal, um herauszufinden, warum Sie es so gemacht haben, und nicht in einem separaten Bereich.

Sie riskieren auch, dass zukünftige Programmierer absichtlich oder sogar versehentlich etwas schließen, was sie nicht beabsichtigt haben, indem Sie das Risiko nicht genau dort bemerken.

Wenn Ihre Funktionsdeklaration eine benannte Funktion außerhalb des Bereichs der einschließenden Funktion deklariert, vermeiden Sie sie einfach. Das ist für alle super verwirrend.

Zum letzten Hinweis: Da einzelne Funktionen zur Abgrenzung von Code beitragen, sind Verschachtelungsfunktionen weniger problematisch als eine einzelne Riesenfunktion. Letztendlich bedeutet dies jedoch, dass Sie viel mehr Code lesen müssen, um ihn zu verstehen doTooMuch()- insbesondere, wenn Sie Code zwischen den verschachtelten Funktionsdeklarationen oder verbergen können muss überprüfen, dass niemand getan hat.

Daniel Pittman
quelle
-1: Javascript ist nicht "die meisten Sprachen". Verschachtelungsfunktionen in Javascript sind übliche Praxis.
Kevin Cline
2
@ kevincline Verschachtelungsfunktionen in JavaScript ist eine häufige schlechte Praxis
Raynos
@ Raynos: Wenn du sie nicht verschachtelst, wo wirst du sie hinstellen? Du bist keine Klasse, die sie enthält. Hier ist ein typischer Code:jquery(function($){ $('#id').click(function(){...}); }
Kevin Cline
@kevincline ... Typischer Code für Noobs, Sie benötigen Funktionen, die tief verschachtelt sind. Und das liegt daran, dass Javascript keinen Modulbereich hat, sodass Sie diesen anonymen Abschluss benötigen.
Raynos
Und wenn dieser Klick einen Ajax-Aufruf mit einem Abschlussrückruf ausführt? Jetzt haben Sie Funktionen in zwei Ebenen verschachtelt. Sicher, Sie können die Verschachtelung einschränken, indem Sie die anonymen Abschlüsse Variablen zuweisen. Ist das wirklich besser
Kevin Cline
2

Dies ist eine dieser Fragen, die keine richtige Antwort haben, und Wörter wie "persönliche Präferenz", "Teampraxis" kommen in den Sinn. Meiner Meinung nach gehören kleine Funktionen (hier ist eine andere subjektive Sache), die nirgendwo verwendet werden, zu ihren übergeordneten Funktionen, insbesondere wenn sie unbenannt werden können.

devmiles.com
quelle
0

Diese Frage hat keine richtige Antwort, da keine der beiden Optionen die Kapselung maximiert. Wenn Sie sie verschachteln, haben sie weiterhin Zugriff auf Variablen, die sie nicht sollten. Wenn Sie dies nicht tun, haben andere Funktionen Zugriff auf Funktionen, die sie nicht sollten. In jedem Fall verlierst du.

DeadMG
quelle