Thinking in 查询设计

近日,互联网动物园的各位小伙伴们召开了一次会议,考虑到大火的电子商务,准备在动物园里开发一个电商系统。首先上台的是销售山鸡,清了清嗓子,说道,人类正在进行电商革命,动物园也需要上一个电商系统,必要性有三点,第一点是赚钱,第二点是迅速的赚钱,第三点是赚很多的钱…说完这点后,小伙伴们激动的开始想起之后的场景,所有的栏杆上都用钻石镶嵌,一天来五顿饲料…
产品狗马上敏锐的嗅到了巨大的机会,开始思考起如何贯彻起赚钱的思路,采用什么方法来提高PV,采用什么支付系统来支付,构建一个完整的生态系统,如何提高用户的可用性等等。说到这里,他斜瞥了下旁边的设计狮,最后说道,具体的界面就交给设计狮了。树上的程序猿们自顾自的吃着香蕉,丝毫没注意到下面的骚动。
骚动持续了几日,产品狗和设计狮到香蕉树下,摇了摇香蕉树,摇下了许多香蕉还有程序猿。产品狗介绍了下需求,让程序猿评估下什么时候能搞定。看着初步给的评估结果,产品狗倒吸了一口气,慢条斯理的说,这个产品的最重要的部分就是查询,时间太长了,赶快想想办法给我先上。程序猿开始捂着脑门有点无语了,只有晚上加班呗。
在一个月黑风高的夜晚,程序猿翻了翻尘封已久的教科书,翻到了第187页,指着第二段:

查询是信息系统中一种常见的需求,这种需求经常会有以下特点:演变快,用户体验要求高(性能和操作),对于复杂的查询的代码可维护性要求高(易维护,可分模块高)。
…此处略去几千字。
翻了翻产品狗给的PRD,果然高大上,就是跟某猫长得挺像。威猛的程序猿看了以后拍了拍胸脯,吼了几声,草泥马,先干再说吧…
一、 查询界面:
1.查询条件区

能够根据关键字,类别,属性,价格等等进行筛选商品。
2.展示区

3.分页区

二、 操作逻辑:
用户会在查询条件区中输入条件,点击提交。
展示查询结果,保存查询条件。
三、 解决思路
程序猿开始对这个问题进行剖析:
第一点,对于一个查询条件最简单的处理当然就是从request中获取参数,然后调用服务,得到结果,最后放入到模板中展现,恰似一根面条从头到尾那么自然简单。但对于几十个条件的组合来说,那就是一碗面条那么复杂了。面条与面条之间互相纠缠,无法解开。任何简单的事情到了一定量级之后就不简单。
第二点,http中的key=value来表示数据的传输很经典,但是对于业务的理解来说恰恰相反。在后台逻辑里面向对象的是主流,对象化了之后可以很好的理解这些参数的意义,可维护性大大提高。
第三点,渲染一个几十个组件的界面代码最好能将各自的模型到控件展现数据模型的转换给分割开来,便于维护代码也便于多人开发模块。正如只有适合多线程工作的数据结构才能有效实现的多线程处理,编码工作也是如此。
查询模型组件:

1.Parser(解析器)会将request中的参数转换成Query对象。
主要包括参数整理,字符串à对象,还有页面参数到对象的一些映射操作。
2.Query(查询对象):业务的实体元素,里面存储的都是和业务操作相关的对象。
业务逻辑的接口会从Query里的属性做进一步的操作,将查询参数传递到后台的服务,如数据库,搜索引擎,web api进行处理,得到业务中间结果Result,并存放在Query对象里。
3.Render(渲染器):
将Query对象中的model在合适的条件下将其转换为页面显示的元素。
一般情况下包括是否展示某个控件的逻辑,控件的数据模型,和控件的展示初始参数。
举例来说,类目渲染器负责类目控件的数据模型填充,如类目名称及其下符合条件的商品的数量总和。

---------------------------------------------完结---------------------------------------------
Thinking in 查询设计的更多相关文章
- .NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)
阅读目录: 1.背景介绍 2.对业务功能点进行逻辑划分(如:A.B.C分别三个业务点) 2.1.配置映射关系,对业务点配置查询契约(构造VS插件方便生成查询契约) 2.2.将配置好的映射策略文件放在调 ...
- EntityFramework 学习 一 Entity Framework 查询设计
First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ...
- 字段username没有默认值查询(设计数据库一定要养成好习惯,不是主键最好设置为可以为空)
今天创建了一个表,但是username作为外键(不是主键)没有设置为可以为空,结果提交表单时忘记写username就报错了
- 大数据查询——HBase读写设计与实践
导语:本文介绍的项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的 ...
- 大数据查询——HBase读写设计与实践--转
背景介绍 本项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的不断 ...
- 一种简单的CQRS架构设计及其实现
一.为什么要实践领域驱动? 近一年时间我一直在思考一个问题:"如何设计一个松耦合.高伸缩性.易于维护的架构?".之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻 ...
- 解析大型.NET ERP系统核心组件 查询设计器 报表设计器 窗体设计器 工作流设计器 任务计划设计器
企业管理软件包含一些公共的组件,这些基础的组件在每个新项目立项阶段就必须考虑.核心的稳定不变功能,方便系统开发与维护,也为系统二次开发提供了诸多便利.比如通用权限管理系统,通用附件管理,通用查询等组件 ...
- .NET架构设计、框架设计系列文章总结
从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以 ...
- .NET应用架构设计—用户端的防腐层作用及设计
阅读目录: 1.背景介绍 2.SOA架构下的显示端架构腐化 3.有效使用防腐层来隔离碎片服务导致显示端逻辑腐烂 4.剥离服务调用的技术组件让其依赖接口 5.将服务的DTO与显示端的ViewModel之 ...
随机推荐
- 关于RAS加密中pfx格式提取字符串私钥 (转)
openssl 使用以下命令 如果如果执行出错,请查看是否安装环境或在命令前面加上openssl --提取出来的无法直接使用 pkcs12 -in zhaoshang2.pfx -nocerts -n ...
- C#软件安全 反编译 加密与安全等等
我最近开发了一些C#语言的软件,但是由于这是一种解释型语言,也就是会转化成中间件语言,很容易就被反编译解密,包括exe和dll库等等,这时候我们真的需要使用一些技巧来将自己的成果进行加密,加壳等办法. ...
- PAT1034. Head of a Gang ——离散化+并查集
题意:成员A与成员B通话 ,成员B与成员C通话,则 ABC即为一个团伙,一共有若干个团伙,每个团伙的人数大于2且相互通话时间超过一定值即为黑帮,每个黑帮伙里有一个BOSS,boss是与各个成员打电话最 ...
- ubuntu :安装一个方便的终端工具,Guake Terminal
前言: 刚刚用ubuntu不久,就想找点新鲜玩意儿,提高linux能力,当然啦,我喜欢折腾,今天就碰到Guake Terminal这个玩意儿,它的功能很简单,就是一个终端,按F12就出现,再按就隐藏, ...
- postman请求ajax失败的解决方法
第一步,把要提交的数据放到Body里 第二步:去掉请求头的Content-Length字段
- 【转】JMeter 通过 JDBC 访问 Oracle 和 MySQL
JMeter 的手册中描述了如何访问 MySQL,但是没有说明如何访问 Oracle.对于没有 Java 应用开发经验和对 Oracle 不是特别熟悉的朋友,可以参考这篇文章来简单.快速的配置好 JM ...
- Java 静态对象 static
什么是静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立. 然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了 ...
- crontab 定时任务设置
CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...
- struts2的搭建和简单的例子(采用struts-2.5.2版本)
struts框架的概述: 当2001年初,Struts的第一个版本在apache网站上发布,它提供了一种分离视图和业务应用逻辑的web应用方案. 在Struts诞生之前,开发人员都是在jsp里写入处理 ...
- Django的视图层
HttpResquest对象: request属性: /* 1.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数.详情请参考 QueryDict 对象. 2.H ...