2016-04-30 80 views
1

我在三個不同的視圖(user_view.ex,group_view.exconnection_view.ex)中具有相同的功能full_name。我如何重構它,它是乾的?我希望full_name函數只在項目中的一個地方。DRY查看功能

defmodule MyApp.GroupView do 
    use MyApp.Web, :view 
    alias MyApp.User 

    def full_name(%User{first_name: first_name, 
         last_name: last_name, 
         honorific_prefix: honorific_prefix, 
         honorific_suffix: honorific_suffix}) do 
    [honorific_prefix, first_name, last_name, honorific_suffix] 
    |> Enum.reject(&(&1 == "")) 
    |> Enum.join(" ") 
    end 
end 

回答

1

由於模板只是函數,所以您可以在一些輔助模塊中定義常用函數,並將其導入到您需要的每個View

defmodule MyApp.UserHelpers do 
    def full_name(...) 
    # ... 
    end 
end 

defmodule MyApp.UserView do 
    use MyApp.Web, :view 
    import MyApp.UserHelpers 

    # ... 
end 
+0

'import MyApp.UserHelpers'可以放到'web/web.ex'中,所以你不必重複導入。 – tkowal

1

有幾種解決方法。最簡單的方法是將該函數放在一個單獨的模塊中,並將其導入到任何需要它的地方,但我認爲這將會是一團糟,所以您應該先設計您的應用程序並想出適當的方法來解決它。您不應該害怕在您的應用中創建自己的文件夾和結構元素。

正如我在其他答覆中提到,你可以只創建一個單獨的結構元素,如裝飾(不知道名字是合適的),所以那麼這將是類似的東西:

defmodule MyApp.UserDecorator do 

    def full_name(%MyApp.User{first_name: first_name, last_name: last_name} = user) do 
    first_name <> " " <> last_name 
    end 

end 

然後,你可以在你的應用的任何地方使用它。