【发布时间】:2014-10-04 00:35:17
【问题描述】:
所以我正在解析一个通过使用jsx 解析一些 json 返回的列表。我通过搜索具有特定名称的元组来提取一些选定的值,如下所示:
defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""
我正在对要提取的几个单独元素执行相同的操作,当我看到大量仅在一个参数上有所不同的代码时,我闻到了不好的代码气味。我的意思是这样的代码:
defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""
defp get_last_updated([{"last updated",_last_updated | _t]), do: _last_updated
defp get_last_updated([_h | _t]), do: get_last_updated(_t)
defp get_last_updated([]), do: ""
defp get_creator([{"creator",_creator} | _t]), do: _creator
defp get_creator([_h | _t]), do: get_creator(_t)
defp get_creator([]), do: ""
我闻到了违反 DRY 原则的味道。
所以我想我可以这样做:
defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""
但是假设这会起作用(它可以编译,但我不确定它会做我想要的),我该如何称呼它?我不能调用get_json_element(["link", _link])(或者至少我不认为我可以)我的意思是通常我会将 jsx.decode 返回的列表传递给各种 get_X 函数,但是我如何传递模式匹配表达式?对不起——我认为我的问题表述得不是很好,但我不知道如何更好地表述它。
这是我应该使用宏来减少重复代码的情况之一吗?如果有,有没有人写过这种宏?
还想知道是否有更好的方法来指示空字符串。使用 "" 对我来说似乎不是最好的方法。或者我可以返回另一个值吗?也许返回 nil?
【问题讨论】: