我写了一个宏,我想在其中使用Logger.info,所以我必须要求Logger。这样做的最佳做法是什么?允许客户端自己要求Logger,或使用宏添加并在那里需要Logger。
最好的做法是不要突然从宏中记录。作为宏的用户,我可能不希望我的日志被无关的信息污染。另一方面,选择这种能力可能具有重要意义。那就是说,我会选择参数化的__using__
:
defmodule My do
defmacro __using__(opts \\ [log: false]) do
quote do
if unquote(opts)[:log], do: require Logger
defmacro my_log(what) do
if unquote(opts)[:log] do
Logger.info(what)
end
end
...
end
end
end
现在你可以在需要时安全地调用my_log
,如果用户没有明确要求通过传递给use
的params登录的能力:
use My, log: true
没有单一的Logger
痕迹会污染最终的代码。
记录器调用是否需要在宏内?也许宏可以扩展为对模块的函数调用,然后模块执行日志记录。
如果确实需要从宏扩展执行日志记录,那么我将添加一个__using__
宏来要求依赖项和模块。