update-if-exists
是个应该了解的特性,但在这里并不完全解决问题..
原始方法的主要和根本问题在于它将每个键的逻辑和更新逻辑交织在一起,从而模糊了翻译的本质(例如,键和值都发生变化)以及翻译之间相互关系(是否后续翻译依赖于先前的翻译)。
将这两个问题分开,每个问题都会更容易改善。
要翻译一个属性,你可能有一个函数(也许是多项式函数),或者一个查找表。例如,假设你有一个函数 svg->cljfx
,它接收一个 [k v]
(例如,一个映射条目)并生成新的 [k v]
;那么可以按以下方式完成对整个 svg-attributes
的翻译:
(->> svg-attributes
(map svg->cljfx)
(into {}))
易于阅读,但如果未更改的属性多于已更改的属性,则不太CPU高效。
或者,假设你有一个svg键到函数(可能是匿名)的查找表(映射),该函数生成新的 [key value]
对。一个循环可以迭代已知转换。它将跳过缺少的键,但至少可以一次性解决该问题。逻辑会更复杂,但可能运行得更快。