了解 `update-if-exists` 是好的,但它在这里并不会完全击中要害...
原始程序的主要和根本问题是它将每个键的逻辑和地图更新逻辑混淆在一起,从而掩盖了翻译的本质(例如,键和值都改变了)以及翻译之间的相互关系(后续的翻译是否依赖于早期的翻译)。
将两个关注点分开,每个都更容易改进。
要翻译1个属性,你可以有一个函数(可能是多方法),或一个查找表。例如,假设你有一个函数 svg->cljfx
,它接受一个 [k v]
(例如,一个映射条目)并生成一个新 [k v]
;然后整个 svg-attributes
的翻译可以通过以下方式完成
(->> svg-attributes
(map svg->cljfx)
(into {}))
易读,但如果未更改的属性多于更改的属性,则不太CPU高效。
或者,假设你有一个svg键到函数(可能是匿名函数)的查找表,该函数生成了新的 [键 值]
对。循环可以遍历已知的转换。它将跳过缺失的键,但至少该情况可以一次性解决而不是每个键一次。逻辑会更复杂,但它可能运行得更快。