随笔分类 - 设计相关
关于“设计”的文章
摘要:最近,GIX4项目需要开展客户化工作。同时,下一期sprint中,客户还要求大幅度提升产品的性能。针对所存在的问题,开发人员决定开一系列的技术讨论会。 我总结了目前遇到的和可能遇到的问题:客户化: 实体类客户化 各客户对同一产品表现出的需求,要求实体类在一定程序上各不相同。这就需要领域模型做到可以客户化。 界面客户化 需求不同,界面自然也需要客户化。这是一般性需求。性能: 实体类优化 目前系统使用的是基于CSLA对象模型的实体类。由于使用了CSLA托管属性,性能比较差。同时,由于一个聚合类往往通过多个多层的实体类聚合而成,调试时却都是在调试CSLA的基类,基类中为所有实体类使用同一种模式进行.
阅读全文
摘要:前面已经把原理都讲了一遍,这篇主要是给出一个应用的实例。该实例取自GIX4,比较复杂。 领域模型: 领域模型间的关系,如下: 右边模型链的具体关系在《第二篇》中已经描述过,不再赘述。 本次重点在于红线框住部分: Project:表示一个建设项目; ProjectPBS:一个项目下包含的很多PBS; PBSPropertyValue:一个PBS我们可以为它设置多个值,每一个值对应一个PBSType(模板)中已定义的属性,值的范围也是只能在属性中已定义的可选值中进行选择。 对应的UI如下: 聚合SQL应用: 首先,从应用来考虑:当用户到这个界面时,首先显示的是左边那个Project(项目)的列表.
阅读全文
摘要:前篇说到了使用异步线程来实现数据的预加载,以提高系统性能。 这样的操作一般是在客户端执行,用以减少用户的等待时间。客户端发送多次异步请求,到达服务端后,如果服务端不支持多线程处理操作,线性处理各个请求,必然导致客户端的异步请求变得没有意义。 大家肯定会说,谁会把服务端设计成单线程的啊,那不是明显的错误吗?是的!但是我们的系统使用了CSLA来作为实现分布式的框架,而它的服务端程序却只能支持单线程……这个问题我们一直想解决,但是查过CSLA官方论坛,作者说由于GlobalContext和ClientContext的一些原因,暂时不支持多线程。火大,这还怎么用啊!无奈目前系统已经极大地依赖了这个框.
阅读全文
摘要:本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为什么要用它? 我们所需要的API 一个简单的例子 什么是预加载? 预加载其实就是在真正开始使用数据之前,先异步把数据加载好,等到需要使用时,就可以直接使用之前加载好的数据。这时,由于数据已经加载完成,而不用等待漫长的加载过程,所以程序的速度得到一个明显的提升。 那么,什么时候需要使用它呢?我觉得,主要是这种情况:当我们可以预知程序接下来的步骤中,很可能会用到一些数据,而获取这些数据的操作比较耗时的时候,我们就可以使用预加载的方式,提前把数据准.
阅读全文
摘要:本节主要介绍,在GIX4系统中,如何应用上篇讲的方案来改善性能,如果与现有的系统环境集成在一起。大致包含以下内容:SQL的生成映射-数据读取方案工厂方法-接口的命名约定实例代码SQL生成 GIX4系统中的所有领域模型及分布式访问机制,使用CSLA作为底层框架。而ORM机制,使用了一个非常轻量级的开源代码LiteORM实现。模型类的定义,采用以下的格式: 可以看到,在类的元数据定义中(这里目前使用的是Attribute的形式),已经包含了对应数据表和列的信息。所以为SQL的自动化自成提供了一定的支持。 其实,由于目前对性能要求比较高的模块少,所以用于优化查询的SQL主要还是依靠人工手写。但是
阅读全文
摘要:本篇主要讲如何使用一句较复杂的SQL来加载整个聚合对象,以达到最小化数据库连接次数。主要是解释其中的原理。 LazyLoad及其缺点 相信越来越多的人已经开始使用富领域对象进行领域/业务层的实现了。而目前主流的数据库依然还是关系型的。这中间的转换,我们叫它ORM。ORM的设计中,有一个常用的模式叫作“延迟加载(LazyLoad)”。基设计思想大致上是说,不要把所有的数据都加载进内存,而是等到真正要使用数据的时候,再把它加载进内存。 例如以下这个聚合对象: (为了和后面的代码保持一致,这里面使用的是GIX4项目中真实的类,可能会带有一些领域特性,望读者见谅。后面可能会继续使用此例,现大致对其
阅读全文
摘要:最近一直忙着学2010、WPF、看架构师教程、学英语,搞得都没时间写博客了。 最近在GIX4项目上做了一些性能方面的优化,为了方便和同事们分享经验,今天准备把一些相关的小技巧都写一下。这几个技巧并不难,也不是说设计得多好,而是我觉得它们很重要。记得我在做上一个Web系统时,也支持OO的业务富模型,其中大部分不太要求性能的场景中,我使用了LINQTOSQL来实现数据访问。而性能要求比较高的场景中,又使用了人工SQL来进行数据访问。但是在两种方式中,在对数据访问进行优化时,都使用了同样的方法。今天,在GIX4中又再次使用同样的方法。 可见,在面向领域模型进行编程的应用程序中,这样的优化方案可能会.
阅读全文
摘要:I have wrote a article which describes how to deal with a complicate data structure “sortable tree”. See here.As i said, it is so complicate that cann’t be maintain easily.Now, i have found a new fluent way to sort this tree:”Sorting by Double”.“Sorting by double “ is more convinient than int, becau
阅读全文
摘要:上次随便画了一篇关于GIX4项目目前的类的结构图(见:GIX4 目前大致的类结构),目的是为了更好的认识系统,并对其进行改进。发现AutoUI部分的耦合性比较大。所以提取了一个IUIFactory的接口,并用同事推荐的EA重新画了一下目前系统的图,如下: 图1 框架包图 图2 实体元数据 结构图 图3 逻辑视图(ObjectViews) 结构图 图4 命令结构图 图5 列表编辑器(ListEditors) 图6 属性编辑器(PropertyEditors) 图7 列适配器(Columns) 图8.1 视图控制器(1) 图8.2 视图控制器(...
阅读全文
摘要:项目做了半年了,一直没把结构图画下来。为了方便以后更改和添加新功能,现在先把里面比较重要的类的结构一起画下来。暂时先用着:
阅读全文
摘要:原来就想写一些关于分布式的设计。正好目前开发的GIX4项目中,需要对客户端的许多操作进行记录。这个功能的设计或多或少能说明,一般情况下,多层的分布式系统应该如何设计。现在我就对这个功能进行描述。功能描述 GIX4项目中有个审核日志记录功能,它需要以下功能: 需要把客户的所有操作记录下来,以便支持审计。如,当用户进行:登录、打开模块、查看数据、点击按钮……等操作时,把相关的数据全部在服务器的数据库中记录下来,这些数据有:操作类型、操作时间、操作内容、操作者、客户端机器名等。 在服务端对某些特定的事件进行记录,如:计算出错。设计目标 这个模块需要支持以下目标: *为客户端代码、服务器端代码都提供.
阅读全文
摘要:本篇博客记录了我在工作过程中的一个设计单元。 需求 GIX4项目中需要为非国标清单进行匹配,用户自定义匹配规则。规则可以被存储到数据库中,下次重复使用。界面原型如下: 图1 界面原型 用户可以指定对对象的某属性进行某个比较操作。 设计-总体结构 图2 总体结构 看上去会有点晕?懒了一点,就全画一起了。 :o) 中间的接口就是整个结构的核心所在,下面会详细解释: 第一组接口:设计匹配概念 首先,明确匹配的概念,这个概念是与GIX4应用无关的。 一个是可以被匹配的对象,另一个则是主动匹配者。如下:/// <summary>/// 被匹配的对象/// </summary>pu
阅读全文
摘要:记录一下,9月份参加研发峰会时的材料。写得不好,而且思想也并不成熟。大致内容如下(EXCEL中直接粘过来的,比较乱): 类别 任务名称 背景介绍 目的(不超过三个) 目标(smart_c) 关键策略 选定方案 策略、方案、计划制定人 实施负责人 协作人 督导人考评人 时间 行动计划关键里程碑 成败攸关因素 管理三问 开发 设计:领域建模解决方案模式 1.业务与代码实现脱离:一般情况下,在进行领域...
阅读全文
摘要:原文见:DG Update: Dispose, Finalization, and Resource Management *Explicit Cleanup & Implicit Cleanup *实现Finalizer的类,无可避免地加大了系统的负担。最小的开支来自于,至少要把这个对象,加入Finalizable Object列表。 Dispose Pattern: Do imple...
阅读全文
摘要:看到这篇博客的朋友,你好。:) 如果你觉得这个问题有点意思,那么请留下你对这个问题的观点。 :) 类似的小问题,还有一个: null != obj 和 obj != null 之间的区别?
阅读全文
摘要:前一篇博客 写了在这次重构中,如何找到关键的概念,并将它提取成为接口。这样,重构的方案基本上就已经被确定了。这篇博客主要说一些有意义的细节: 抽象实现 提取接口模型后,各“指标”类已经呈现出一种正确的逻辑关系。那么,现在更重要的就是重构上文中提到的“普通计算过程”。由于计算过程依然有很多种,并且有通用的抽象部分。再加上接口模型已经定义出了大量重要的...
阅读全文
摘要:背景 GIX4是一个建筑行业的指标计算软件,用于数据统计、分析。导入的大量数据,大部分呈现逻辑上的树状结构(关于它的重构,见:《重构一个繁琐的数据结构》),关系复杂。这些数据,需要经过由底向上的汇总,并进行业务上的计算,然后以另一形式展现给用户。开发一段时间后,表现系统的应用层出现以下问题: 1.速度慢 < 系统的计算分为两类,在这里,我简单地叫它们:正常计算过程、复杂计算过程。而复杂计...
阅读全文
摘要:转自《关于静态方法和实例方法的一些误区。》 一、 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。 事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。 二、 静态方法在堆上分配内存,实例方法在堆栈上。 事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是...
阅读全文
摘要:今天和同事一起讨论了CQRS(Command Query Responsibility Segregation),过程中,我产生了一些疑问,先记录在这里,以后有解决方案了再说。:) http://blog.jteam.nl/2009/12/21/rethinking-architecture-with-cqrs/ 以下是讨论正文: 发件人: 1B-2-12 胡庆访; 发送时间: 2009年12月31日 12:36收件人: 1B-2-14 穆洪星;3D-1-02 周金根抄送: 1B-2-05 李智; 1B-2-13 孟伟斯主题: 答复: 使用CQRS重新考虑架构 CQRS其实是说在使用DDD的
阅读全文
摘要:前言 这里主要说一个使用using躲过异常的小技巧。 我原来就遇到过类似的问题好几次了,也没想到办法,直接有一天,调试得实在受不了了,才认真想了以下的解决方案。 问题 原来的代码是这样的: public abstract class Command : RoutedUICommand{ private bool _isExecuting = false; public void Execu...
阅读全文

浙公网安备 33010602011771号