2016-04-30 73 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 

然后,你可以在你的应用的任何地方使用它。