知识卡片

元数据映射对自动化重构工具的隐蔽破坏

普通读书笔记卡

内容

元数据映射会给软件重构带来一个容易被忽视的副作用,尤其是在依赖自动化重构工具的团队里。如果开发者改了某个私有域的名字,代码本身编译通过、工具也提示重构成功,但应用却可能在运行时莫名其妙地坏掉——原因是那个旧域名早已被悄悄记录在一份XML映射数据文件里,自动化重构工具根本看不到、也不会去检查藏在这份外部元数据文件里的域名引用,因而完全不会发出任何警告。这个问题在用代码生成的团队里会稍好一些——查询机制至少能找到生成代码里对旧域名的引用,重新生成代码时能自动更新,只是这样一来手工对生成代码做的任何改动都会随之丢失(工具会提醒你留意这一点,但改不改元数据最终还是要靠开发者自己判断);如果用的是反射编程,情况则更糟,连这一层提醒都拿不到。反过来看,元数据映射也带来一个正面效应:它让重构数据库本身变得更容易——因为元数据相当于把数据库方案的对应关系显式声明了出来,调整数据库结构时,只需要同步修改这份元数据即可覆盖变化,不用满代码库去找所有硬编码的映射逻辑。可迁移启发:任何把”名字之间的对应关系”存放在代码之外(配置文件、元数据、字符串拼接的反射调用)的设计,都要清楚意识到——这类外部映射天然逃出了静态分析和自动化重构工具的视野,凡涉及改名这类操作,必须额外靠人工核查或专门的一致性测试来兜底,不能指望工具替你把关。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第13章 对象-关系元数据映射模式"之"13.1.2 使用时机"(源文件:_epub-src/OEBPS/Text/000144.html) - 结论依据:原文说明"元数据映射会影响到软件重构,尤其是当使用自动化工具的时候。如果改变了私有域的名字,会出人意料地破坏应用程序。甚至自动的重构工具也不能发现隐藏在XML映射数据文件中的域名……如果你使用反射,甚至不会得到警告……另一方面,元数据映射能够使重构数据库更容易,因为元数据表示数据库方案的接口声明",直接支撑本卡结论。 - 原始内容:如果改变了私有域的名字,会出人意料地破坏应用程序。甚至自动的重构工具也不能发现隐藏在XML映射数据文件中的域名。