陈亮亮的专栏

造适不及笑,献笑不及排,安排而去化,乃入于寥天一。

陈亮亮ID:cll0320
179951次访问,排名396好友2人,关注者8
cll0320的文章
原创 57 篇
翻译 0 篇
转载 0 篇
评论 331 篇
陈亮亮的公告
陈亮亮,字又明。湖北荆州人。
喜爱哲学与技术,尤其是中国传统哲学。
希望能交到更多的朋友。
chenyoming@gmail.com  
最近评论
mghueh:wow power leveling
carry1002:你好,我是猎头公司carry,我们服务的对象主要是世界500强企业,现在有thougthtworks公司的职位机会,TW是敏捷方法领域的领头羊,有兴趣的朋友请和我联系,我的msn:carry.1@hotmail.com
kjq_vb:<a href="http://www.wcfh.cn">福海大酒店</a>
[url=http://www.wcfh.cn]福海大酒店[/url]吴川市福海大酒店荣获AAA+级质量信誉企业,并通过了ISO9001质量体系认证,月饼荣获全国月饼

双金奖。[url=http://www.wc126.com]吴川网[/url]
limin4506:LZ高明,小子班门弄斧
limin4506:LZ

呵呵,<易经>我也花了不少时间.

后人的解释太牵强,古人未必想得那么深奥.

中国古代的文化,我慢慢也不看了.学习西方的思想,

文章分类
收藏
    相册
    照片
    朋友的Blog
    宗刚的专栏(RSS)
    小明的专栏(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 partial class:扩展功能新思路收藏

    新一篇: 富有还是贫困 | 旧一篇: 程序员应该怎样修身

    开闭原则:“对修改封闭,对扩展开放”。在面向对象的系统中,通过类的继承实现扩展。.net中提供的partial class提供了扩展类的新思路。

    一、应用场景

    可以使用partial class的场景很多。这里分析一个ORM的例子。
    系统中有一个Cat类,属性ID、Age、Weight都需要存储到数据库中,一个信息系统中常见的需求。通过读取数据库的结构,可以用工具生成Cat类的代码。并且ORM框架支持了从数据库信息生成Cat对象。
    现在的Cat什么动作都没有,客户说,我们需要一个Miaow()的函数。这时就需要对ORM生成的Cat类进行扩展了。
    可以肯定地一点是,我们不能修改自动生成的代码,因为这会牵涉到数据库结构与代码同步的问题。解决这个需求有两种方法:继承方式扩展,partial class扩展。


    二、继承方式扩展

    工具自动生成一个CatBase类,这个类只有属性,嵌入到ORM框架中。既然需要扩展功能,很容易想到对这个基类继承,于是有了Cat类。Cat类如愿以偿地有了Miaow()函数。
    以前系统中用的是CatBase的实例,现在创建CatBase实例的地方需要改为创建Cat的实例。这个问题让ORM框架解决吧。
    客户的需求实现了,我们自己的代码生成也没有遭到破坏,任务完成。

    三、partial class扩展

    partial class简单地说就是可以将一个类的代码写到两个或多个代码文件中。编译器在编译的过程中将这几个文件组合起来一起编译。一个很酷的技术。
    工具生成的Cat类仍然不变。既然需要增加函数,那么在新建一个代码文件,将Miaow()函数写出来就可以。需要做的仅仅是将类的声明由class改为partial class,任务完成。

    四、对比分析

    两种思路都可以实现需求。孰优孰劣需要仔细分析一下。
    实例创建:partial class更加简洁。
    系统复杂度:对于系统来说,partial class方式下只存在一个类,而继承方式有两个类。
    继承逻辑:从逻辑上讲,Cat并不需要一个基类CatBase,这样做仅仅是因为在代码构建过程中的一个限制。
    维护性:两种方式下都会存在两个代码文件,维护成本并没有区别。
    可读性:两个Cat文件确实让人费解。

    整体上说,使用partial class更加优雅一些。
    “继承”的这种方式比较符合传统的思维习惯,而partial class到底是不是满足开闭原则呢,这点确实不好说。不过在软件构建上,我是一个实用主义者,哪种方式好用就用哪一种。
    在ORM的场景中,partial class更加好一些,但有的时候,两个类之间确实就存在继承关系,那么就必须用到继承了。虽然绝大多数情况下,都需要继承方式,但是既然有了partial class技术,我们在做设计时也需要考虑这个思路。

    在VS2005中,Form、DataSet都使用了partial class方式,原理和这个一样。但是要将这个原理推广到“业务实体”中,可能在理解上需要有所突破。
    使用partial class确实会带来可读性的损失,尤其是一个类分布在很多个文件中的时候,所以文件的命名最好是有一个规范来保证。 

    发表于 @ 2007年07月05日 02:48:00|评论(loading...)|编辑

    新一篇: 富有还是贫困 | 旧一篇: 程序员应该怎样修身

    评论

    #kiol 发表于2007-07-05 19:52:35  IP: 222.129.40.*
    呵呵,我还是喜欢ruby里的open class,更加直接和有效
    2007-07-05 19:58:53作者回复
    毕竟还不是主流,一般的项目是不会用这类语言的。我也喜欢动态语言,可惜工作中没有使用的机会。
    #rijing2000 发表于2007-07-06 13:56:32  IP: 219.136.96.*
    可以肯定地一点是,我们不能修改自动生成的代码,因为这会牵涉到数据库结构与代码同步的问题
    ------------------------------
    一个类添加一个方法,为什么我们不能改自动生成的代码?
    数据库结构也只是与类的属性同步而已吧,不理解,可不可以说的详细点?
    2007-07-06 14:13:44作者回复
    如果数据库结构只是与类的属性同步,这样的代码生成工具实现起来是比较困难的。另外,自动生成的代码和手写的代码混杂在一起,反而不是很清晰。至少我在项目里面还没有见过这样的用法。
    #Go_Rush 发表于2007-07-07 10:21:27  IP: 88.88.88.88, 59.*
    不错,支持一下
    #xiammy 发表于2007-07-07 21:39:11  IP: 61.51.148.*
    将partial class和ORM放在一起,确实不错!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 陈亮亮