知识卡片

查询对象是解释器模式:用类和域取代表和列

普通读书笔记卡

内容

直接在代码里写SQL要求开发者熟悉SQL语法、还得清楚数据库设计方案,而把SQL细节藏进专门的查找器方法虽然省心,却难以支撑更灵活多变的特别查询——数据库方案一旦改动,还得同步去改散落各处的SQL字符串。查询对象换了个角度解决这个问题:它是解释器模式在SQL查询上的应用——由一组对象组成一个结构,这个结构自己知道怎么把自己转换成SQL;关键在于查询是通过引用”类”和”域”(内存对象世界的语言)而不是”表”和”列”(数据库世界的语言)来构造的,这样一来编写查询的人完全可以站在对象模型的视角设计查询、不必关心底层表结构,数据库方案的变化也被这层转换局部化了——当然,要实现这种视角转换,查询对象本身必须知道数据库结构到对象结构的映射关系,这天然要用到元数据映射。查询对象还有一个更轻量的变体:允许用一个”样例对象”来表达查询意图,比如构造一个姓设为”Fowler”、其余属性全部留空的Person对象,查询对象就把它解读成”查找所有姓Fowler的人”——这种写法简单直观,但碰到稍复杂一点的查询条件就无能为力了。查询对象设计上的一条重要经验:不必一开始就追求能表达任意查询的全功能版本,多数应用真正用到的SQL能力远不到SQL全集,先做一个刚好满足当前需求的最小化查询对象,日后需求增加了再逐步扩充,往往比一步到位从零打造一个万能查询对象更划算。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第13章 对象-关系元数据映射模式"之"13.2 查询对象"(源文件:_epub-src/OEBPS/Text/000146.html) - 结论依据:原文说明"查询对象是一个解释器……你可以通过引用类和域而不是表和列来创建这个查询。采用这种方式,那些编写查询的人就能够设计独立于数据库方案的查询……应该为当前的需求创建一个功能最小化的查询对象,并且随着需求的增加改进这个查询对象……查询对象的一种变种是允许用一个样例领域对象来指明一次查询",直接支撑本卡结论。 - 原始内容:如果对象和数据库具有相同的结构,这一点就不重要,如果二者有差异时,查询对象就很有用。为了实现这种视角的变化,查询对象需要知道数据库结构怎样映射到对象结构,这一功能实际上要用到元数据映射。