使用推导式实现函数模板化:重构Elixir多分支bar函数
用Elixir推导式模板化重复分支函数
嘿,我来帮你搞定这个重复代码的重构!你这里的bar/2函数有好几个结构完全一致的子句,都是匹配不同的温度单位后调用mult/2传入对应系数。用Elixir的推导式(for comprehension)可以完美把这些重复逻辑模板化,让代码更简洁、易维护,以后加新单位也不用重复写函数啦。
重构后的完整代码如下:
defmodule SomeModule do # 把单位和对应系数整合为一个关键字列表,集中管理 @unit_coefficients [ celcius: 800, rheinan: 900, fahrenheit: 1000 ] # 从关键字列表中提取可用单位,避免重复定义 @available_units Keyword.keys(@unit_coefficients) def foo(some_struct) do some_var = get_var(some_struct, :var_name) if some_var == :kelvin do initialize(some_struct) else bar(some_struct, some_var) end end # 用推导式动态生成所有bar/2的子句 for {unit, coefficient} <- @unit_coefficients do defp bar(struct, unquote(unit)) do mult(struct, unquote(coefficient)) end end # 假设你原来的mult/2和其他辅助函数在这里 defp mult(struct, coefficient) do # 这里是mult的实现逻辑 struct end defp get_var(struct, _var_name), do: struct.unit defp initialize(struct), do: struct end
关键重构点说明:
- 集中管理单位与系数:把原来分散的
@celcius_coefficient等变量整合成@unit_coefficients关键字列表,单位和对应系数一一绑定,不用再单独维护@available_units(直接用Keyword.keys/1提取即可)。 - 推导式生成重复函数:通过
for循环遍历@unit_coefficients,用unquote/1把单位原子和系数值注入到函数定义中,自动生成每个单位对应的bar/2子句——效果和你手动写每个子句完全一样,但彻底消除了重复代码。 - 兼容性不变:原来的
foo/1函数逻辑完全不需要修改,推导式生成的函数和手动定义的行为完全一致,不会影响原有功能。
以后要是再加新的温度单位,只需要在@unit_coefficients里加一行(比如rankine: 1100),推导式会自动帮你生成对应的bar/2子句,超省心!
内容的提问来源于stack exchange,提问作者Buğra Ekuklu
相关产品推荐
相关产品推荐

