update-if-exists
是值得关注的知识点,但在这里并不能完全解决问题。
与原始程序相关的首要和根本的问题是,它将每个键的逻辑和地图更新逻辑纠缠在一起,从而模糊了翻译的性质(例如,键和值都发生改变)以及翻译之间的相互关系(后来翻译是否依赖于早期翻译)。
将两个问题分开,每个问题都更容易改进。
要翻译一个属性,你可以有一个函数(可能是多态的),或者一个查找表。例如,假设你有一个函数 svg->cljfx
,它接收一个 [k v]
(例如,一个映射条目)并生成一个新的 [k v]
;然后可以通过以下方式翻译整个 svg-attributes
(->> svg-attributes
(map svg->cljfx)
(into {}))
易于阅读,但是如果未改变的属性数量多于已改变的属性,则CPU效率可能不是特别高。
或者,假设你已经有一个svg键到函数(可能是匿名的)的查找表,该函数生成一个新的 [key value]
对。循环可以迭代已知的转换。它必须跳过缺失的键,但是至少可以将这种情况一次性解决,而不是每个键单独解决。逻辑会更复杂,但可能运行得更快。