Frage

In der funktionalen Programmierung, ist es oft wichtig, jeden „Looping“ Code zu optimieren Schwanz rekursiv zu sein. Tail rekursive Algorithmen sind in der Regel zwischen zwei Funktionen aufgeteilt, jedoch - eine, die den Basisfall einrichtet, und eine andere, implementiert die tatsächliche Schleife. Eine gute (wenn auch akademische) Beispiel wäre die Umkehrfunktion sein.

reverse :: [a] -> [a]
reverse = reverse_helper []

reverse_helper :: [a] -> [a] -> [a]
reverse_helper result [] = result
reverse_helper result (x:xs) = reverse_helper (x:result) xs

„reverse_helper“ ist nicht wirklich eine gute, aussagekräftigen Namen. Doch "reverse_recursive_part" ist nur peinlich.

Welche Namenskonvention würden Sie für Hilfsfunktionen wie das?

War es hilfreich?

Lösung

Ich neige dazu, „_recurse“ bis zum Ende hinzuzufügen. So "reverse_recurse". Nicht sicher, wo ich, dass aus. Ich mag verlassen die Base-Case-Funktion einfach, wie Sie in Ihrem Beispiel haben. Es neigt dazu, die „öffentliche“ Funktion und die Tatsache zu sein, dass es eine Hilfsfunktion verwendet die Iteration ist irrelevant für den Anrufer durchzuführen. In Javascript manchmal so, wie ich gehe weit über die iterative Funktion über eine Schließung zu verstecken, um es wirklich klar ist, nicht direkt aufgerufen werden.

Andere Tipps

Sie können die Helferfunktion etwas rufen Sie wollen, und es wird nicht so lange egal, wie Sie die Hilfsfunktion im „global“ Namespace setzen Sie. Einfach das Hinzufügen eines „Prime“ eine gängige Praxis zu sein scheint. :) Z. B. in Haskell,

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs

ich immer verwenden do_, wie "do_compute" mit "berechnen". Ich finde es sehr beschreibend, wie es effektiv der Teil der Funktion ist, die die Aktion ausführt, während der „Compute“, die Bedürfnisse haben einen einfachen Namen für die Außenwelt aufgerufen wird.

Ich bin mit ShreevatsaR, wenn Sie die Hilfsfunktion machen nicht auf oberster Ebene (oder noch schlimmer, es in der Exportliste setzen), als es spielt keine Rolle, was sein Name ist. Ich neige dazu, Hilfsfunktionen f und g zu nennen.

reverse :: [a] -> [a]
reverse = f []
  where
    f ys []     = xs
    f ys (x:xs) = f (x:ys) xs

Ich verwende nur dieses Namensschema für kleine Funktionen (sonst weiß ich nicht, was die f bezeichnet). Dann wieder, warum sollten Sie immer große Funktionen schreiben?

Wenn Sie jedoch Ihre ‚Helfer‘ Funktion nicht mögen, exportieren, weil es für andere nützlich sein könnte, würde ich es nennen:

reverseAccumulator

Wie Haskells zip und zipWith. Aber ich würde diese ‚Helfer‘ Funktionen nicht nennen, zipWith ist nur eine generische Funktion und zip ist die Standardimplementierung (wahrscheinlich das eine, das ist das verwendete die meisten).

ich auch mit ShreevatsaR, in diesem Beispiel zustimmen würde ich die Helfer eine private Funktion machen.

Für andere Fälle, in denen ich Helferfunktionen müssen im gesamten Modul sichtbar sein, aber nicht exportiert, neige ich dazu, Präfix-Funktionen mit ‚_‘. Sicher, es ist die explizite Aussage Exporte aber während der Entwicklung neige ich dazu, alle Funktionen zu exportieren, interaktive Exploration zu erleichtern, z.B. in GHCI. Später ich hinzufügen, die Liste der exportierten Funktionen und die underbar macht es leicht, sich daran zu erinnern, ob ich eine Funktion lokal oder nicht sein sollte.

Ich verwende aux oder foo_aux (für Hauptfunktion foo) und nisten die Definition, so dass es von außen nicht sichtbar ist.

Setup und führen

Beispiel:

function whateverSetup() { ... }
function whateverExecute() { ... }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top