BssCriticalCompiler 设计说明(草案)(概设) -解决站点关键数据,状态数据,无须持久化数据的一些思路 bearocean 2008-06-04
1. 关键数据(CriticalData) 的定义 站点系统中通常会出现一些改动不大的数据项。 这些数据不会经常改动的原因在于: (1) 这类型数据本身在需求中不要求修改。 (2) 这类型数据大规模参与了系统逻辑,修改将导致系统中大规模重构,当要对这类型数据项进行修改时,会导致从页面(View) 到Controller 到逻辑层,最后到数据库中的过往数据,均要求rebuild。
通常我们从这类数据中提取出2个关键属性: DisplayName, Value,实际上有枚举或者键值对的意思。 这类数据的常见例子: 性别信息, 如: DisplayName: 男 Value: 1 (即表示显示层显示男, 内部逻辑和数据库中,我们通常存放1表示一个用户为男性) DisplayName: 女 Value: 2
国家/地区信息, 如: DisplayName: 中国 Value: 1 DisplayName: 美国 Value: 2 DisplayName: 法国 Value: 3 ….
状态信息, 如一个用户的状态我们可以表示为: DisplayName: 开通 Value: 1 DisplayName: 暂停 Value: 2 DisplayName: 关闭 Value: 3 ….
这种数据在系统中常常被硬编码,如 显示层,我们在用户注册页面会出现如下代码:
用户编辑页面也会出现这样的代码。
对于状态信息,我们常见的逻辑编码会出现这样的代码
对于国家地区类数据,我们常常把他们存放于数据库。 但是如果没有对国家地区类数据进行 修改/添加/删除的必要,实际上这种数据也没有太大的必要存放于数据库中。
总的来说,这类型数据(特别是状态码) 通常是整个系统的关键支撑。 对于实践过程,我们通常不推崇修改这类型数据。 设想,系统中,过去表示用户开通状态的编码在数据库中为(int)1 , 在页面上显示为”开通”。 但是如果我们出现需求(姑且不论这个需求是否合理) 要求开通的编码用2表示, 在页面上不再显示开通, 而显”正常运行”。那么我们要修改哪些地方:
显示用户信息的所有页面 用户添加页面 用户状态修改页面 修改用户状态的编码逻辑(开通逻辑将改为设置用户状态为2) 过去已存储的用户数据 1->2 ….
这是一个噩梦。 如果不提及对于这类数据的修改。 只考虑添加一种新的状态: DisplayName: 欠费 Value =4 (系统总是会扩展的) 那么我们发现需要修改的部分有: 用户添加页面 用户编辑页面 修改用户状态的编码逻辑(添加欠费相关逻辑) ….
仍然是噩梦,而且在进行代码修改的时候,凭借开发者的记忆,怎样能确保所有相关的修改都已经完成,例如我们可能会忽略某一个页面的修改。
过去曾经有一个记忆深刻的教训 我们在开发一个HR站点的时候,由于学历类型相对比较固定,所以在系统中硬编码了学历数据。 类似于:
这样的代码分布在十多个页面中。 后来客户提出要添加一项 “value =11 博士后” 的时候, 我们开始找这十多个页面。实际上,可想而知,这是非常的痛苦的。
这类型的数据没有统一的定义。我们姑且将其定义为关键数据(CriticalData) 关键数据在Web系统中通常有这样一些特性: a) 不需要存储于数据库中。 b) 通常大量参与逻辑 c) 虽然通常不变,但要进行修改/添加 的时候会非常麻烦。 e) 在代码中的表现方式通常是: 硬编码/ 或者静态变量。
2.1.3. 同时支持编译时和运行时策略 2.1.3.1. 编译时策略 编译时策略的种体思想类似于MDD (Model Driven Development) 具体过程如下图所示: 使用方式为 开发人员 定义XML 关键数据定义文件。 其后调用CriticalCompiler 将XML 关键数据定义文件转换为一种较为合理,调用方便的关键数据定义源代码。(Java 中初步考虑的是一组包含静态变量的接口). 开发人员在系统中对该生成的CriticalData 定义进行依赖。尽可能避免硬编码。 如果需求发生变更,重复上述过程。 2.1.3.2. 运行时策略 运行时体系结构作为另外一种可选策略受支持。相对于编译时策略,XML定义文件和解析过程完全一致。但是不同的地方在于CriticalCompiler对XML 解析/编译在网站运行时(具体应该是网站startup的时间) 并且不会生成源代码。 开发者的代码可以同过对CriticalComiler RunTime Lib 的依赖对关键数据进行引用。 最大的优点在于,修改XML 并不需要重新编译整个项目。只需要重新将XML 文件部署到合适的文件夹路径,并重新启动Web服务。 如下图所示: 3. 结语: 总的来说,该模型非常简单,主要目的在于集中控制关键数据,增强代码的扩展性和可维护性,作为关键数据定义的XML 文档,即可以作为源代码的一部分(元数据).也可以作为文档存在。 通过这种思想来实现该Lib 是否能真正的降低Web 修改时造成的重构成本。还不能够确定。目前主要作为一种设计/实践 思路来应对。 基于Java 的CT RT 模块预计本周可以完成模型。 另外该文档不涉及BssCriticalComiler 的调用说明,只作为思路阐述文档和概设存在。
bearocean 2008-06-04 我发现 cnblogs 比csdn的blog好用。。。但是我很久没做.net 了。
posted on 2008-06-04 15:01 BearOcean 阅读(2025) 评论(12) 编辑 收藏 所属分类: 设计模式 、BlueSources
Powered by: 博客园 Copyright © BearOcean