2015-02-11 12 views
3

說我有一堆類似的代碼如下:如何將私有函數抽象爲實用程序庫?

def dirs(path, regex_dir \\ ".+") do 
    path 
    |> normalize_path 
    |> do_dirs([], regex_dir) 
end 

# list of bitstrings 
defp normalize_path([path | rest]) when is_bitstring(path) do 
    [path | normalize_path(rest)] 
end 

# list of character lists 
defp normalize_path([path | rest]) when is_list(path) do 
    [to_string(path) | normalize_path(rest)] 
end 

defp normalize_path([]) do 
    [] 
end 

# bitstring 
defp normalize_path(path) when is_bitstring(path) do 
    [path] 
end 

# character list 
defp normalize_path(path) when is_list(path) do 
    [to_string(path)] 
end 

我想用normalize_path代碼的另一部分,什麼是抽象掉了normalize_path功能的最佳方式進入實用模塊或庫?我仍然希望保持該功能只能在內部使用,不能作爲公共功能使用。

+0

讓東西在實用程序模塊/庫中,但隱藏它似乎是兩個相反的目標。 – 2015-02-12 13:22:20

回答

6

也許你最好的辦法是在一個單獨的模塊中抽象這些函數,並將其隱藏在@moduledoc false的文檔中。這些函數不會是專用的,您的庫的用戶仍然可以訪問這些函數,但通過不記錄它們,您將它們標記爲不屬於圖書館API的一部分。

defmodule Helpers do 
    @moduledoc false 

    @doc """ 
    You can still provide per-function docs for documenting how the code works; 
    these docs won't be public anyways since `@moduledoc false` hides them. 
    """ 
    def helper(...), do: ... 
end 
+2

+1。這正是我在將複雜的私有函數提取到其他模塊以幫助測試時所使用的模式。 – 2015-02-12 09:39:05

+1

@JoséValim我一定是從某個地方拿走了它,對吧? :) – whatyouhide 2015-02-12 09:41:35