RSS 2.0 Feed
2004-02 Entries
摘要:在很多朋友的一再催促下,偶关于.NET中实现基本AOP编程的第二篇文章终于在上个周末出炉了。这里首先多谢在大周末帮我做review的朋友们,多谢你们的火眼金睛,群众的眼睛真的是够靓啊!!:)   在写这篇文章的时候,我从MS的e-CompanyStore新收到的微软无线桌面套装精英版给我添了不少乐趣,可也带来了不少烦恼。键盘的手感虽比不上我那台老的IBM金属键盘,却仍是舒适、便捷得很(尤其是那条皮质的腕托,还有左面的纵横滚轮——可惜不能按!);鼠标虽然不是想象中的皮革版(明明在买它的时候看到图上照片是皮的嘛!上当!),不过仍是十分的漂亮且舒服。不过要命的是,无线的键盘经常会“批发”多余的按键,让人防不胜防(我按一下DELETE键没准给我发出6个!十分钟至少一次的说——怀疑是不是买到了次品?别的用微软无线键盘的朋友有遇到这个问题吗?);另外F/Lock锁定键的默认状态是快捷功能而不是功能键,且没有直观显示,难道F键要下岗了吗?这一点实在有些自作聪明了(其实这些双态键不妨设计为机械式的锁定按键,用键位的高低来显示状态,既不费电,也很直观,而且可以保持用户的习惯——顶多就是内部走线复杂一些,可也对得起这价钱啊)。还有,F功能键从4键x3组变成了3键x4组,更是让我头疼不已(所以没有把它拿回家用——回家我就是开开Flight Simulator 2004,它的键位可是按照4个一组来设计的,所以基本上是没法用了——不过Visual Studio受影响也不小啊)!看来这款“新颖的”产品应该更适合于那些从来没有用过传统键盘布局的朋友吧——不然你且得适应一下呢(而且适应以后就更用不惯不是这样设计的键盘了,还真是微软的一贯风格嘿)。   嗯,总之呢,写文章还是挺辛苦的,不过只要能有几个朋友读过文章后有所收获的话,我也就心满意足了。当然,如果你觉得有什么不吐不快的意见和建议啥的,也可以通过博客堂随时与我交流(写评论或者用联系链接),多谢啦!:)...[阅读全文]

posted @ | Feedback (8) | Filed Under [ General ]

摘要:先来看这段NUnit测试代码,我们希望用反射机制在运行时访问一个对象的枚举类型的域或属性:   [TestFixture]public class PaymentInfo{  public enum PaymentType  {    Cash, CreditCard, Check  }  public PaymentType Type;  public void Test()  {    PaymentInfo payment = new PaymentInfo();    payment.Type = PaymentType.Cash;    System.Reflection.FieldInfo enumField = GetType().GetField("Type");    int paymentTypeInt32;    paymentTypeInt32 = (int)enumField.GetValue(payment);    Assert.AreEqual((int)PaymentType.Cash, paymentTypeInt32);    enumField.SetValue(payment, paymentTypeInt32);    Assert.AreEqual(PaymentType.Cash, payment.Type);  }}   实际上运行测试时发现在标红的这行上抛出一个异常:“对象类型无法转换为目标类型”。究其原因,原来是因为CLR的反射机制不允许枚举类型与整数类型之间隐式转换。不过C#编译器还是允许我们通过强制类型转换的语法来进行两者间的显式转换。   在这个测试中,使之通过的办法其实非常简单:把划线部分强制转换为枚举类型即可,如:(PaymentType)paymentTypeInt32。可问题是:在运行时如何动态转换类型呢?比如说我在写ElegantDAL的时候,需要将从数据库读出的一个类型为int的数值写入到要返回的对象的一个枚举型字段中,此时我只有fieldInfo、columnValue和resultObject,然而写成fieldInfo.SetValue(resultObject, columnValue)就会出现前面提到的错误,可是我又只有一个运行时的Type信息(fieldInfo.FieldType),我又不能写成fieldInfo.SetValue(resultObject, (fieldInfo.FieldType)columnValue)……   只好将这种情况列为一个特例处理,而我们的救兵则是Enum.ToObject()方法——你知道有更好的方法解决这个问题吗?   BTW: 很多朋友写信来问偶承诺的下一篇文章什么时候才能搞定,其实我也不想拖,可最近工作确实比较紧张,而我的最佳写作时间又都在深更半夜(之前还要热身进入状态),所以迟迟不能结稿。目前其实已经写了好多(已经和第一篇长度差不多了),可是发现要写的内容还太多(也许是我写得太细了,因为我的目标不仅是讲how,更多的是what和why),所以现在决定把本篇文字再细分为两部分(上篇只讲TP/RP+MBR对象;把CBO相关的内容放到下篇再写),以便能够尽快让大家看到新的内容——嗯,争取周五release吧。至于还有朋友希望我能够深入写些关于ElegantDAL的设计与实现细节,这个留待稍后吧,正好我们将要整理的项目文档中也要有这一块内容(现在在我们这个企业级项目中用得还真挺好),到时候一起写啦(希望能够和canyue尽快完成第三版本的重写工作,目前使用的是第二版)。...[阅读全文]

posted @ | Feedback (5) | Filed Under [ .NET Stuffs ]

摘要:  昨天,我第一次在实际开发工作中体验到了结对开发的魔力(以前也就是两个人一起研究问题而已),那确实是一种令人神怡且有效的工作方式——至少it works extremely well for me!   在下午三四个小时的开发工作中,我和我的搭档一起解决了已经困扰了我很久的几个问题,并令人激动不已的在NUnit中点绿了单元测试中所有的测试项(就这几个问题我已经拖了半个月了还没能解决)——这意味着我可以放心的开始对代码进行重构(而不是重写)了(本来一直没有信心这样做,因为到处都有红灯,而每一个红灯都牵扯到很多的问题)……体会一:结对编程消除了最影响开发人员情绪的孤独感,进而重新迸发工作激情,大大提升工作效率和质量。   其他同事都下班以后,我们简直是进入了一种turbo的开发状态——我们先是一起总结了前面开发中最不爽的几个环节,并一致认为一定有好办法能够让开发变得更简单一些——于是我的灵感突然涌出,我告诉他“我将把让我们的开发变得繁琐的这些类都删掉,用一个custom proxy搞定所有的类”!“听上去不错,可是……有这么好的事吗?”“看我的——你就帮我瞧着那些绿灯吧!”当然,我在下手之前还是像唐僧一样把改造的思路说了几遍,当我确信搭档已经明白我的意图后,我开始动手了:三下五除二,我先把一个private成员提为internal(本来它只是被自己的一系列public gateway methods访问的,现在我要让它能被custom proxy使用),并马上写出了这个custom proxy,用它替代了以前那些繁琐的method gateway和那个接口实现类,最后,我到组件工厂中把实现接口的类换为由custom proxy构造的transparent proxy——NUnit.Run! Bingo! We got it! 体会二:两个人的智慧确实大于一个人,尤其当两个人从两个方向共同考虑同一个问题的时候——当然,彼此持续、默契的交流是必不可少的。   现在回头想想,这一下午的进展真的是匪夷所思,我又一次亲身体会到了结对编程的魔力和乐趣——当然,坐在我对面的项目经理估计也体验了他工作以来强度最大、持续时间最长的人造噪音。不过我想说的不是sorry,而是thanks!谢谢你给我们这样的机会,这是在其他团队中难以想象的事情。我相信你也将亲眼看到我曾向你描述的关于结对编程的种种好处。另外,thanks to my partner canyue!和你一起工作真的很开心,我在你谨慎的约束下变得更专注也更有效率,而你也能在看我开发的时候学到更多的东西。Cool!   如果你也有类似的敏捷开发经历,不妨写在评论中与我们分享——无论是成功的经历还是失败的经历,我想都会很有参考价值。其实关于敏捷方法论(尤其是其中最著名的极限编程技术),我也有很多实践经验和想法,希望以后有时间能够在这方面也写些心得体会吧——不过当务之急,还是先把腾苦不堪的颈椎疼痛消灭掉吧!现在开车都成问题了……...[阅读全文]

posted @ | Feedback (18) | Filed Under [ Agile/XP ]

摘要:动态属性依然是类的一部分?——I really do NOT think so!http://blog.joycode.com/microhelper/posts/12394.aspx#12408 不可否认attribute的强大 但它必须依赖程序而存在的事实就注定了它的脆弱?——What do you think?http://blog.joycode.com/jgtm2000/posts/10064.aspx#10220 “具体情况、具体分析”——就算所有的技术都是死的,人还是活的……...[阅读全文]

posted @ | Feedback (35) | Filed Under [ General ]

摘要:摘要:本文通过一个高度简化的示例,逐步的揭示在面向对象设计与开发中面临的若干问题,并导出软件开发对AOP(即面向方面编程)思想的需求。这是文章的第一部分,主要利用面向对象编程技术与设计模式给出解决问题的一个思路,并分析该实现面临的问题,以此形成对面向方面编程技术的直观需求。   欢迎大家提出自己的观点、意见和建议,文章的下半部分正在写作中。谢谢!:)   http://blog.joycode.com/jgtm2000/posts/12103.aspx...[阅读全文]

posted @ | Feedback (1) |