update-if-exists
是一个值得了解的点,但是在这里可能并不会完全解决问题..
原始程序的主要和根本问题是,它将每个键的逻辑和地图更新逻辑纠缠在一起,从而模糊了转换的本质(例如,键和值都发生变化)以及翻译之间的关系(是否后续的翻译依赖于早期的翻译)。
将两个关注点分开,每一个都更容易进行改进。
要转换1个属性,你可以有一个函数(可能是多方法),或者一个查找表。例如,假设你有一个函数 svg->cljfx
,它接受一个 [k v]
(例如,映射条目)并生成一个新的 [k v]
;那么整个 svg-attributes
的转换可以通过以下方式完成
(->> svg-attributes
(map svg->cljfx)
(into {}))
易于阅读,但是对于未改变属性比改变属性多的情形,CPU效率并不是非常高。
另一方面,假设你有一个svg键到函数(可能是匿名函数)的查找表,该函数返回一个新的 [key value]
对。循环可以遍历已知的转换。它将跳过缺失的键,但至少这种情况可以一劳永逸地解决,而不是每个键都解决一次。逻辑会更加复杂,但它可能会更快地运行。