技术讨论总结:客户化、缓存

 最近,GIX4项目需要开展客户化工作。同时,下一期sprint中,客户还要求大幅度提升产品的性能。针对所存在的问题,开发人员决定开一系列的技术讨论会。
    我总结了目前遇到的和可能遇到的问题:
客户化
    实体类客户化
        各客户对同一产品表现出的需求,要求实体类在一定程序上各不相同。这就需要领域模型做到可以客户化。
    界面客户化
        需求不同,界面自然也需要客户化。这是一般性需求。
性能
    实体类优化
        目前系统使用的是基于CSLA对象模型的实体类。由于使用了CSLA托管属性,性能比较差。同时,由于一个聚合类往往通过多个多层的实体类聚合而成,调试时却都是在调试CSLA的基类,基类中为所有实体类使用同一种模式进行架构,而用递归和继承来实体类间结构,使得代码难于调试,经常让人晕头转向。
    缓存的植入
        要提升现在分布式系统的性能,最直接最易用的方法就是对一些常用而不常变的对象进行缓存,减少网络传输,减少数据库访问次数。



 

20100826
    今天和周哥、杜强、智哥一起讨论了系统的客户化方案。时间持续了大概2个小时,内容不多,收获也不多,但是觉得很重要。主要有以下两点:
第一、更加清晰了GIX4(包括OpenExpressApp)的思想、架构和RoadMap。
    我想,产品GIX4架构思想可以这么解释:特定于建筑领域的产品线架构方法。

    产品不同于项目,它是为整个建筑行业开发的,需要考虑其通用性,同时也必须能够满足各企业的定制化需求。整个产品线开发中,包含了三类客户,按照721的原则划分,这三类客户是:
    一类用户:70%;这些客户的功能需求完全符合整个行业的习惯,他们代表了行业的一般性情况。这些需求肯定要被包含在产品中。
    二类用户:20%;这些客户一般分为几种类别;同一类客户的需求往往相同,同不类客户的需求往往不同;这些需求一样要被包含在产品中,产品需要一定的策略来给各类用户进行定制。
    个性用户:10%;这些客户的功能需求往往源自其自身的习惯,往往不能被其它同行所采用。这类需求将不会被包含在产品中,但是作为一个有平台性质的产品,应该具备为这些用户定制功能的扩展能力。

    软件架构采用领域驱动,所以主干代码中的领域模型需要代表行业的整体需求。同时,也要能表达二类用户的情况,这可能需要多个小分支模型。个性用户的需求需要在主干模型的基础上扩展。(在类设计上主要使用继承,而建模环境将会在不远的将来支持,同样也需要支持模型扩展。)

第二、设计时,应该尽量避免二义性。
    关于设计的讨论,是在讨论一个具体的问题引起的小插曲,问题如下:
    在原来的产品设计中,有这样的聚合关系:Project->Contract->Budget;但是现在需要同时支持:Project->Budget。而这两个需求本身就是从两家不相干的客户提出,它们不能同时存在。
    我一开始主张BudgetParent->Budget的聚合,然后Project和Contract都继承自BudgetParent。提出这个方案的原因在于,我从客户的需求开始倒推领域需求,我觉得在客户的浅意识里,Budget之上是有某一个东西有进行组织(BudgetParent)。但是后来知道,这个推论是片面的,行业内并没有这样的认知。所以从领域角度讲,这个设计并不成立。
    对于我提出的方案,周哥提出尽量不要带有二义性的设计。如果只可能是Project和Contract,在没有必要的情况下,不需要再引入一个“BudgetParent”类或接口。这样不但会增加程序的复杂度,更重要的是它会让程序变得含糊,看程序的人并不能从类的设计上一眼看出领域需求。后来一想,确实如此,没有必要的话,还是使用具体类再加有实在意义;不要因为程序的考虑,而使得领域复杂化。
    后来的结论是:需要再次和领域专家确认后,才能知道到底一个Budget会不会可能同时被Project和Contract进行组织。如果是,则Budget类本身应该拥有Project和Contract的引用。如果不是,则可能需要设计两个不同的Budget子类来实现。确实,不管最后是选用哪一种,都能清晰地表达出Budget、Project、Contract之间的关系。:)

时间: 2024-10-30 23:05:15

技术讨论总结:客户化、缓存的相关文章

spring mvc-java web前端实现技术讨论

问题描述 java web前端实现技术讨论 做过java web项目开发的人都知道struts2和spring mvc,这两者都是java前端的mvc架构,页面利用丰富的struts和spring标签,通过框架提供的多种封装技术方便快捷的跟action或者Controller进行交互,从而简化页面的功能实现.另一种页面实现则是采用javascript+html+css,不使用框架提供的标签或者其它功能,而是通过ajax或者其它方式调用action或者Controller的代码.对于这两种方式(或

lattices-有研究加密算法的技术讨论群吗

问题描述 有研究加密算法的技术讨论群吗 最近在研究lattices加密算法 有类似的组织根据地吗 求大大们拖走 我的QQ451800977

技术讨论:微服务和容器比虚拟机快多少?

本文讲的是技术讨论:微服务和容器比虚拟机快多少?[编者的话]本文是Microscaling Systems的联合创始人Anne Currie在微服务日伦敦站的演讲整理稿,通过阅读本文可以深入了解到当和虚拟机比较时,微服务和容器的速度和效率. Anne Currie,Microscaling Systems的联合创始人,提供了一个关于为何采用容器的很好概述.请享受她最初在微服务日伦敦站的演讲,该演讲研究了什么使得微服务和容器的结合如此强大. 希望你能和我们一样享受这个演讲. 视频 幻灯片 今天,你

一起谈.NET技术,Discuz!NT 缓存设计简析 [原创]

       作为一个社区类型软件,大并发支持和高效稳定运行永远是"硬道理",而有效安全的使用缓存恰恰能起到事倍功半的效果.而.NET本身所提供的缓存机制又显得过于"单薄",比如说订制不太灵活方便, 缓存对象之间层次感不强, 使用时缺乏统一的管理等等.           Discuz!NT缓存产生背景:        在去年五月份我加入Discuz!NT项目组时,发现这个项目当时还未使用缓存机制.主要原因是项目还处于起步阶段,很多东西还只是有想法,但未付诸实施,或

基于Mule的ESB技术讨论

问题描述 本人一直在研究基于Mule的ESB技术,刚刚换到一家新公司,想继续深入的学习这部分技术,可是发现新公司做这部分的人太少了,技术交流上比较少,想在论坛上认识研究这部分技术的大牛,咱们一起讨论,一起进步,本人QQ(496896408).上一家公司我在医疗行业做得是ESB,现在的新公司是做银行业务的,有做这部分的同行的话,我们可以一起学习,一起进步,我做这部分两年时间,自认为还是菜鸟,还得继续努力!ESB的发展前景不知道怎么样?好多大公司都在使用,今后我想去二线城市(比如:西安)发展,过几年

一起谈.NET技术,ASP.NET缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman

ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓存 ASP.NET 缓存全解析5:文件缓存依赖 ASP.NET 缓存全解析6:数据库缓存依赖 ASP.NET 缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman Memcached - 分布式缓存系统  1.Memcached是什么? Memcached是高性能的,分布式的

一起谈.NET技术,页面片段缓存(二)

在上一篇文章中,我介绍了我们用土法炼钢的方法,使用Velocity提供的自定义标签实现片段缓存.这样的方式虽然也解决了我们的问题,但还是引出了一些bug.而且还有点hack的味道(虽然我喜欢hack).实际上对于片段缓存,业界有成熟的解决方案,还有一个所谓的W3C标准:ESI(Edge Side Include) . ESI本身没有什么,只是一个XML的标签集合.ESI和SSI(Server Side Include)很相似,做过ASP开发的都熟悉这么一个标签: <!--#include src

一起谈.NET技术,asp.net 缓存

缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一.例如你可以在复杂查询的时候缓存数据,这样后来的请求就不需要从数据库中取数据,而是直接从缓存中获取.通过使用缓存可以提高应用程序的性能. 主要有两种类型的缓存: ·输出缓存Output caching ·数据缓存Data caching 1. 输出缓存(Output Caching) 使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,ASP.NET不会再执行页面的生命周期和相关代码而是直接使用缓存的页

一起谈.NET技术,页面片段缓存(一)

一般,页面上会分为很多部分,而不同的部分更新的频率是不一样的.如果对整个页面采用统一的缓存策略则不太合适, 而且很多系统的页面左上角都有一个该死的"Welcome XXX".这种特定于用户的信息我们是不能缓存的.对于这些情况我们就需要使用片段缓存了.对页面不同的部分(片段)施加不同的缓存策略,而要使用片段缓存,首先就得对页面进行切分.土一点的办法可以用iframe,用iframe将页面划分为一块块的,不过我总觉得iframe是个邪恶的东西.好点的办法可以用Ajax单独的请求这个片段的内