知识卡片

显式标识映射优于通用标识映射

普通读书笔记卡

内容

设计标识映射时,一个关键决定是做成显式的还是通用的。显式标识映射为每种需要的对象类型各提供一个专门方法,比如findPerson(1);通用标识映射则用一套统一方法服务所有对象类型,靠一个参数指明具体要哪种对象,比如find("Person", 1)。通用映射最明显的好处是可以做成一个通用、可复用的组件——一个注册表就能服务所有对象类型,新增一种对象类型时甚至不需要改动这个映射本身。但作者仍然推荐用显式标识映射,理由不止一条:在强类型语言里,显式映射能享受到编译期检查,这是通用映射用一个字符串参数区分类型所天然做不到的;更进一步,显式接口的其他好处也一并具备——能一眼看出当前系统里有哪些映射可用、它们各自是怎么被调用的。这意味着每增加一种对象类型就要多写一个方法,但相较于显式化带来的好处,这点负担只能算是很小的代价。可迁移启发:在”做一个通用、少写代码的组件”和”为每种情况单独写一个显式接口”之间选择时,通用方案省下的重复劳动,往往要用牺牲编译期检查和接口可读性去换——如果语言本身支持强类型检查,这笔交易通常不划算。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第11章 对象-关系行为模式"之"11.2.1 运行机制"(源文件:_epub-src/OEBPS/Text/000095.html) - 结论依据:原文说明"必须确定把标识映射设计为显式的还是通用的……然而,我推荐使用显式的标识映射。首先,在一种强数据类型的语言中用显式数据映射能做编译时的检查。但是,其优点远不止此,它还拥有显式接口的其他全部优点:比较容易看到哪些映射是可用的,它们是怎么被调用的",直接支撑本卡结论。 - 原始内容:虽然这意味着每增加一个映射就要加入一个方法,但对显式化的优点来说也不过是一个小负担。