随笔分类 -  设计单元

平时写的代码。 一个一个的小“模块”吧。
摘要:本篇主要描述GIX4项目中如何把单独的模块设计为一个“插件”,如何把它组装到系统中。至于为什么加引号,之后会有说明。 原理 在基于产品线开发时,7,2,1的产品功能分类中,20%的功能是需要在产品线主干中包含进来的。这些功能一般会被设计为“可选包”。在某一客户版本产品的装配阶段,在“可选包”集合中挑选需要的功能,进行组装,得到最终的产品。具体内容,见:《软件产品线工程方法:如何在OpenExpressApp做客户化工作》。 在基于OpenExpressApp框架的GIX4项目中,“合同”模块就是属于这20%的功能,它被设计为独立的DLL,在产品装配时为需要的客户进行装配。 DLL间的关系 项. 阅读全文
posted @ 2010-09-28 10:11 BloodyAngel 阅读(2148) 评论(4) 推荐(4) 编辑
摘要:上篇 已经就客户化的整体方案进行了叙述,这次主要是说明一些细节部分的设计。 类型的视图元数据 基于OEA框架的GIX4项目中,客户化工作主要是对各客户版本中类型的视图信息进行定义。下图是包含这些类型的类图: 图1 客户化API中的类型视图元数据 属性继承 在应用程序定义中,需要支持继承类型的视图信息定义,也就是说,在基类上定义的视图信息,子类在没有定义的情况下,直接使用基类的定义;当然,也可以为具体的子类做特殊的定义。 但是,TypeViewInfo是某一个实体类型的视图信息,它只对应唯一一个Type。所以要支持继承定义,需要做一些特殊的处理。 一种方案是为所有TypeViewInfo建立父. 阅读全文
posted @ 2010-09-26 10:32 BloodyAngel 阅读(1946) 评论(0) 推荐(3) 编辑
摘要:这篇文章还是对工作内容的总结,主要是总结一下这几天做的产品的客户化工作内容。 关于产品线工程中客户化的理论知识和概念,请见金根的《产品线工程》。具体的,OEA框架中的客户化理论,见:《软件产品线工程方法:如何在OpenExpressApp做客户化工作》。 本文主要从以下几个方面来叙述如何在OEA框架中设计和实现客户化框架: OEA客户化框架设计目标 方案设计 具体实现 设计目标 支持实体类的扩展。 支持实体扩展包的动态加载。 支持界面扩展及界面扩展包的动态加载。 各版本间自定义界面元素,可以基于现有的特定版本修改一些内容。 各版本间支持自定义内容文件,如果没有使用,则使用默认版本的内容文件。. 阅读全文
posted @ 2010-09-20 20:37 BloodyAngel 阅读(2790) 评论(5) 推荐(4) 编辑
摘要:前面已经把原理都讲了一遍,这篇主要是给出一个应用的实例。该实例取自GIX4,比较复杂。 领域模型: 领域模型间的关系,如下: 右边模型链的具体关系在《第二篇》中已经描述过,不再赘述。 本次重点在于红线框住部分: Project:表示一个建设项目; ProjectPBS:一个项目下包含的很多PBS; PBSPropertyValue:一个PBS我们可以为它设置多个值,每一个值对应一个PBSType(模板)中已定义的属性,值的范围也是只能在属性中已定义的可选值中进行选择。 对应的UI如下: 聚合SQL应用: 首先,从应用来考虑:当用户到这个界面时,首先显示的是左边那个Project(项目)的列表. 阅读全文
posted @ 2010-07-07 18:11 BloodyAngel 阅读(2939) 评论(0) 推荐(4) 编辑
摘要:前篇说到了使用异步线程来实现数据的预加载,以提高系统性能。 这样的操作一般是在客户端执行,用以减少用户的等待时间。客户端发送多次异步请求,到达服务端后,如果服务端不支持多线程处理操作,线性处理各个请求,必然导致客户端的异步请求变得没有意义。 大家肯定会说,谁会把服务端设计成单线程的啊,那不是明显的错误吗?是的!但是我们的系统使用了CSLA来作为实现分布式的框架,而它的服务端程序却只能支持单线程……这个问题我们一直想解决,但是查过CSLA官方论坛,作者说由于GlobalContext和ClientContext的一些原因,暂时不支持多线程。火大,这还怎么用啊!无奈目前系统已经极大地依赖了这个框. 阅读全文
posted @ 2010-07-01 15:45 BloodyAngel 阅读(4251) 评论(7) 推荐(4) 编辑
摘要:本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为什么要用它? 我们所需要的API 一个简单的例子 什么是预加载? 预加载其实就是在真正开始使用数据之前,先异步把数据加载好,等到需要使用时,就可以直接使用之前加载好的数据。这时,由于数据已经加载完成,而不用等待漫长的加载过程,所以程序的速度得到一个明显的提升。 那么,什么时候需要使用它呢?我觉得,主要是这种情况:当我们可以预知程序接下来的步骤中,很可能会用到一些数据,而获取这些数据的操作比较耗时的时候,我们就可以使用预加载的方式,提前把数据准. 阅读全文
posted @ 2010-06-30 20:30 BloodyAngel 阅读(3728) 评论(2) 推荐(6) 编辑
摘要:本节主要介绍,在GIX4系统中,如何应用上篇讲的方案来改善性能,如果与现有的系统环境集成在一起。大致包含以下内容:SQL的生成映射-数据读取方案工厂方法-接口的命名约定实例代码SQL生成 GIX4系统中的所有领域模型及分布式访问机制,使用CSLA作为底层框架。而ORM机制,使用了一个非常轻量级的开源代码LiteORM实现。模型类的定义,采用以下的格式: 可以看到,在类的元数据定义中(这里目前使用的是Attribute的形式),已经包含了对应数据表和列的信息。所以为SQL的自动化自成提供了一定的支持。 其实,由于目前对性能要求比较高的模块少,所以用于优化查询的SQL主要还是依靠人工手写。但是 阅读全文
posted @ 2010-06-25 18:44 BloodyAngel 阅读(1899) 评论(0) 推荐(2) 编辑
摘要:本篇主要讲如何使用一句较复杂的SQL来加载整个聚合对象,以达到最小化数据库连接次数。主要是解释其中的原理。 LazyLoad及其缺点 相信越来越多的人已经开始使用富领域对象进行领域/业务层的实现了。而目前主流的数据库依然还是关系型的。这中间的转换,我们叫它ORM。ORM的设计中,有一个常用的模式叫作“延迟加载(LazyLoad)”。基设计思想大致上是说,不要把所有的数据都加载进内存,而是等到真正要使用数据的时候,再把它加载进内存。 例如以下这个聚合对象: (为了和后面的代码保持一致,这里面使用的是GIX4项目中真实的类,可能会带有一些领域特性,望读者见谅。后面可能会继续使用此例,现大致对其 阅读全文
posted @ 2010-06-25 16:32 BloodyAngel 阅读(3940) 评论(9) 推荐(2) 编辑
摘要:最近一直忙着学2010、WPF、看架构师教程、学英语,搞得都没时间写博客了。 最近在GIX4项目上做了一些性能方面的优化,为了方便和同事们分享经验,今天准备把一些相关的小技巧都写一下。这几个技巧并不难,也不是说设计得多好,而是我觉得它们很重要。记得我在做上一个Web系统时,也支持OO的业务富模型,其中大部分不太要求性能的场景中,我使用了LINQTOSQL来实现数据访问。而性能要求比较高的场景中,又使用了人工SQL来进行数据访问。但是在两种方式中,在对数据访问进行优化时,都使用了同样的方法。今天,在GIX4中又再次使用同样的方法。 可见,在面向领域模型进行编程的应用程序中,这样的优化方案可能会. 阅读全文
posted @ 2010-06-23 20:02 BloodyAngel 阅读(777) 评论(3) 推荐(0) 编辑
摘要:原来就想写一些关于分布式的设计。正好目前开发的GIX4项目中,需要对客户端的许多操作进行记录。这个功能的设计或多或少能说明,一般情况下,多层的分布式系统应该如何设计。现在我就对这个功能进行描述。功能描述 GIX4项目中有个审核日志记录功能,它需要以下功能: 需要把客户的所有操作记录下来,以便支持审计。如,当用户进行:登录、打开模块、查看数据、点击按钮……等操作时,把相关的数据全部在服务器的数据库中记录下来,这些数据有:操作类型、操作时间、操作内容、操作者、客户端机器名等。 在服务端对某些特定的事件进行记录,如:计算出错。设计目标 这个模块需要支持以下目标: *为客户端代码、服务器端代码都提供. 阅读全文
posted @ 2010-03-10 12:58 BloodyAngel 阅读(5262) 评论(4) 推荐(2) 编辑
摘要:本篇博客记录了我在工作过程中的一个设计单元。 需求 GIX4项目中需要为非国标清单进行匹配,用户自定义匹配规则。规则可以被存储到数据库中,下次重复使用。界面原型如下: 图1 界面原型 用户可以指定对对象的某属性进行某个比较操作。 设计-总体结构 图2 总体结构 看上去会有点晕?懒了一点,就全画一起了。 :o) 中间的接口就是整个结构的核心所在,下面会详细解释: 第一组接口:设计匹配概念 首先,明确匹配的概念,这个概念是与GIX4应用无关的。 一个是可以被匹配的对象,另一个则是主动匹配者。如下:/// <summary>/// 被匹配的对象/// </summary>pu 阅读全文
posted @ 2010-02-05 19:47 BloodyAngel 阅读(1340) 评论(6) 推荐(3) 编辑
摘要:前一篇博客 写了在这次重构中,如何找到关键的概念,并将它提取成为接口。这样,重构的方案基本上就已经被确定了。这篇博客主要说一些有意义的细节: 抽象实现 提取接口模型后,各“指标”类已经呈现出一种正确的逻辑关系。那么,现在更重要的就是重构上文中提到的“普通计算过程”。由于计算过程依然有很多种,并且有通用的抽象部分。再加上接口模型已经定义出了大量重要的... 阅读全文
posted @ 2010-01-12 20:44 BloodyAngel 阅读(1738) 评论(3) 推荐(3) 编辑
摘要:背景 GIX4是一个建筑行业的指标计算软件,用于数据统计、分析。导入的大量数据,大部分呈现逻辑上的树状结构(关于它的重构,见:《重构一个繁琐的数据结构》),关系复杂。这些数据,需要经过由底向上的汇总,并进行业务上的计算,然后以另一形式展现给用户。开发一段时间后,表现系统的应用层出现以下问题: 1.速度慢 < 系统的计算分为两类,在这里,我简单地叫它们:正常计算过程、复杂计算过程。而复杂计... 阅读全文
posted @ 2010-01-11 21:05 BloodyAngel 阅读(2228) 评论(6) 推荐(1) 编辑
摘要:前言 这游戏跟《兔子跳铃铛》一样,也是在大学的时候写的。不过前者使用的是C++,而这个则是在大三上学期的时候用JAVA,在J2ME平台上开发出来的。代码不多,当时使用了不到三天时间,但是却感觉比兔子的游戏好多了。 我就写过这两个游戏,感觉玩起来还不错,所以都写出来和大家分享一下。代码在最后。:) 效 阅读全文
posted @ 2009-12-07 00:30 BloodyAngel 阅读(4047) 评论(11) 推荐(3) 编辑
摘要:前言 好几年没有写C++代码了,今天朋友问起一个C++的问题,我是怎么也想不起答案来了。哈哈。所以现在把原来在大二时候写过的一个C++游戏先写下来,要不然以后估计都会忘记得一干二净啦…… 效果 打开游戏,先是一个闪屏: 然后是游戏主界面: 游戏开始后,一只被我减过肥的小兔子蹲在“烂”草坪上: 时间仓 阅读全文
posted @ 2009-12-05 20:13 BloodyAngel 阅读(3661) 评论(6) 推荐(1) 编辑
摘要:在GIX4项目的开发过程中,遇到一个比较复杂的数据结构。复杂,是因为它有许多限制条件。我的工作是在现有系统中,添加新的功能,并在过程中重构部分旧代码。 约束及需求 以下约束是系统中已经存在的必要的约束,不可绕开这些约束而进行代码的开发。 1.项目中,有许多的实体类,都含有一种多叉树的关系和逻辑。 2.这些实体的树型关系,在运行时,只有键的关系,而没有对应的实体引用关系。 由于GIX4是数据分析... 阅读全文
posted @ 2009-12-02 16:34 BloodyAngel 阅读(2101) 评论(5) 推荐(3) 编辑