10

En la programación funcional, a menudo es importante optimizar cualquier código de "bucle" para que sea recursivo de cola. Los algoritmos recursivos de cola usualmente se dividen entre dos funciones, una que establece el caso base y otra que implementa el ciclo real. Un buen ejemplo (aunque académico) sería la función inversa.¿Cuál es su convención de nombres para las funciones de ayuda?

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" no es realmente un buen nombre descriptivo. Sin embargo, "reverse_recursive_part" es incómodo.

¿Qué convención de nomenclatura usarías para funciones auxiliares como esta?

+0

¿Qué idioma es ese? –

+0

Lo siento. Estoy trabajando en un proyecto de Haskell en este momento, lo que inspiró esta pregunta. Podría haber dado un ejemplo de Python/Java, supongo, aunque tales funciones de ayuda no son tan útiles en los lenguajes imperativos. – Cybis

Respuesta

3

tiendo a añadir "_recurse" hasta el final. Entonces "reverse_recurse". No estoy seguro de dónde lo saqué. Me gusta dejar la función de caso base simple como la que tiene en su ejemplo. Tiende a ser la función "pública" y el hecho de que utiliza una función auxiliar para realizar la iteración es irrelevante para la persona que llama. En javascript, a veces llego a ocultar la función iterativa a través de un cierre, para dejar muy claro que no se debe invocar directamente.

+0

"_recurse" - esa es una buena idea. – Cybis

1

configuración y ejecutar

ejemplo:

function whateverSetup() { ... } 
function whateverExecute() { ... } 
+2

whateverSetup es un nombre horrible si la función es pública. – Cybis

+0

@ [Cybis]: se debe dar a entender que reemplaza "lo que sea" con un término descriptivo apropiado, p. WidgetSetup, WidgetExecute, etc. –

+0

Steven: Creo que su punto fue que "Configuración" no es un buen sufijo para las funciones exportadas. – Bladt

5

Siempre uso do_, como "do_compute" con "calcular". Lo encuentro bastante descriptivo, ya que es efectivamente la parte de la función que realiza la acción, mientras que el "cálculo" que se llama necesita tener un nombre descriptivo simple para el mundo exterior.

21

Puede llamar a la función auxiliar todo lo que desee, y no importará siempre y cuando no ponga la función auxiliar en el espacio de nombres "global". Simplemente agregando un "primer" parece una práctica común. :) Por ejemplo, en Haskell,

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

estoy de acuerdo con ShreevatsaR, si no hace la función de ayuda de nivel superior (o peor, lo puso en la lista de exportación), que no importa lo su nombre es. Tiendo a llamar a las funciones auxiliares f y g.

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

sólo tiene que utilizar este esquema de nomenclatura para las funciones pequeñas (de lo contrario no sé lo que el f se refiere a). Por otra parte, ¿por qué escribirías grandes funciones?

Sin embargo, si usted quiere exportar su función de 'ayudante', ya que podría ser de utilidad para otros, yo lo llamaría:

reverseAccumulator 

Como Haskell de zip y zipWith. Pero yo no llamaría a esas funciones de 'ayuda', zipWith es solo una función genérica y zip es la implementación predeterminada (probablemente la que más se usa).

+0

Me gusta el uso de prime (rev -> rev '= como lo sugiere ShreevatsaR, pero creo que esta debería ser la respuesta aceptada por su generalidad y porque se relaciona con las convenciones de las bibliotecas. – Bladt

2

Uso aux o foo_aux (para la función principal foo), y ancle la definición para que no sea visible externamente.

3

También estoy de acuerdo con ShreevatsaR, en este ejemplo, haría que el ayudante fuera una función privada.

Para otros casos en los que necesito que las funciones auxiliares sean visibles en todo el módulo, pero no se exporten, tiendo a prefijar las funciones con '_'. Claro, existe la declaración de exportación explícita, pero durante el desarrollo tiendo a exportar todas las funciones para facilitar la exploración interactiva, p. en ghci. Más tarde agregué la lista de funciones exportadas y la barra inferior hace que sea fácil recordar si pretendía que una función fuera local o no.

Cuestiones relacionadas