摘要: 昨天买了一本《Effective C#》,看了几个Item,虽然没有当初读《Effective C++》时的那般震撼,但是也收获不少。把其中的要点记录于下,有些条款加上了自己的理解,权当作读书笔记吧 :-)Item 1: Always Use Properties Instead of Acces... 阅读全文
posted @ 2005-11-25 16:54 zhuweisky 阅读(1270) 评论(0) 推荐(1) 编辑
摘要: 昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。 关于这个问题,我给出了自己的答案,首先解决第一个问题: //////IsTriangle判断集合中的头三个点PointF是否可以构成一个三角形///publicstaticboolIs... 阅读全文
posted @ 2005-10-16 11:54 zhuweisky 阅读(3705) 评论(21) 推荐(2) 编辑
摘要: 以前空闲的时候用C#实现的路径规划算法,今日贴它出来,看大家有没有更好的实现方案。关于路径规划(最短路径)算法的背景知识,大家可以参考《C++算法--图算法》一书。 该图算法描述的是这样的场景:图由节点和带有方向的边构成,每条边都有相应的权值,路径规划(最短路径)算法就是要找出从节点A到节点B的累积 阅读全文
posted @ 2005-09-29 14:38 zhuweisky 阅读(63866) 评论(39) 推荐(15) 编辑
摘要: 出手自Rod Johnson的《J2EE Development without EJB》是一本难得的好书,无论是对于Java程序员,还是.NET程序员。特别是对于.NET程序员,.NET平台的企业级应用还不是很多,.NET平台上的实用性的架构也远远不及J2EE这么成熟,所以我们.NET开发人员绝对有必要Open自己,到Java的世界去看看。 .NET世界里很多处于探索和试验阶段的技术实际上在J2EE中都有了很成熟的实现和应用。值得庆幸的是,在企业级开发的世界里,.NET正在迎头赶上。NHibernate出现了、Spring.NET出现了、AOP.NET、还有什么NUnit、NAnt、NDo. 阅读全文
posted @ 2005-09-29 11:15 zhuweisky 阅读(3744) 评论(15) 推荐(1) 编辑
摘要: 前文介绍了异常关闭器的AOP实现,而权限管理也是一个AOP可以大展拳脚的地方,下面就来看看如何使用EsbAOP实现权限管理。 首先要解决的问题是如何判断用户是否拥有调用某个操作的权限,这个判断是由各个应用程序自己实现了,为了统一对权限的判断,所以我们指定了接口IPermissionVerifier... 阅读全文
posted @ 2005-09-28 12:06 zhuweisky 阅读(3001) 评论(1) 推荐(2) 编辑
摘要: 以我自己的异常处理经验,我通常会在UI事件处理函数或线程启动函数中截获所有的异常,然后对截获的异常作特定的处理--很多情况下,是显示一个错误信息给用户,或记录异常日志!在这“很多情况下”,我都需要做相同的工作,首先是用try...catch把UI事件处理函数或线程启动函数中的所有代码围起来,然后,... 阅读全文
posted @ 2005-09-28 08:42 zhuweisky 阅读(915) 评论(1) 推荐(0) 编辑
摘要: EsbAOP是EnterpriseServerBase类库中的轻量级AOP框架,它实现了AOP的主要思想--对方法调用进行截获,并加入自定义的预处理、后处理。 EsbAOP与其它很多开源的AOP实现有些不同,其不同之处主要在于EsbAOP并没有严格的实现AOP理论的各种设施,但是EsbAOP非常实... 阅读全文
posted @ 2005-09-28 08:41 zhuweisky 阅读(1296) 评论(1) 推荐(0) 编辑
摘要: 事件通知服务用于解决多个应用程序之间的事件发布与预定的问题。在.NET平台上,跨应用程序的事件发布/预定通常以Remoting作为底层的通信基础,在此基础之上,事件通知服务使用中介者模式来简化跨应用程序的事件通知问题。 本文采用的解决方案中,有两个重要组件:事件服务器EventServer和事件客户端EventClient。EventServer作为中介者,并作为一个独立的系统,通常可以将其作为w... 阅读全文
posted @ 2005-09-26 15:16 zhuweisky 阅读(4777) 评论(7) 推荐(3) 编辑
摘要: 在开发中,经常会遇到这种情况,在A.dll中需要反射B.dll中的类型,如果稍不注意,就会产生运行时错误。关于跨程序集的反射,记住两点就可以:(1)如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行。可以说,typeof是支持强类型的。比如TypesupType=typeof(En... 阅读全文
posted @ 2005-09-23 12:52 zhuweisky 阅读(3227) 评论(3) 推荐(1) 编辑
摘要: 当UI动作引发一个耗时的计算时,我们经常需要将这个耗时的过程放到后台线程中去完成,然后获取该过程的结果。使用.NET提供的默认设施,无论是使用Thread还是使用异步调用,细节都比较繁琐。在前几天的blog上也看到了有些兄台的解决方案,但是觉得还不够好用,于是自己封了一个AsynCaller。 A... 阅读全文
posted @ 2005-09-23 09:44 zhuweisky 阅读(1910) 评论(1) 推荐(0) 编辑
摘要: 类厂服务的主要功能是简化创建具体工厂任务,使工厂访问代码和工厂创建代码解藕。类厂服务是以抽象工厂模式为基础,并且在其上进行再综合。 在正式进入正题之前,为了方便后面的叙述,先要澄清一些概念,把上下文(Context)搭建起来,然后,我们再在这个上下文中进行讨论。 首先是两个基本定义:族和系列。(这两个概念是我自创的,不知道常用的术语是什么,知道的朋友请留言告诉我:))(1)族 ... 阅读全文
posted @ 2005-09-13 17:57 zhuweisky 阅读(3406) 评论(2) 推荐(1) 编辑
摘要: 所谓企业开发基础设施,指的是为那些几乎所有的企业开发都会遇到的共同的基础性的问题提供服务的设施,比如事务、日志、权限等等。其中很多设施都会以AOP的方式实现,有些则可能以类库的方式提供。我也一直在积累这方面的AOP组件和类库。 曾经做过一些关于日志、权限管理的AOP实现,这几天正在研究“类厂服务”,于是就有了写这个“企业开发基础设施”系列文章的想法,把自己的一些思想拿出来和大家一起讨... 阅读全文
posted @ 2005-09-13 17:06 zhuweisky 阅读(2092) 评论(0) 推荐(1) 编辑
摘要: 人们都善于用直观简单的方式来理解事物,我也坚信,所有优秀的解决方案都是直观而简单的,我喜欢直观而简单的解决方案,也许在找到直观简单的解决方案之前,我们已经尝试了用很多复杂费解的方式来解决问题。如果你不能把我们程序的解决方案用通俗易懂的方式给隔壁卖青菜的阿伯解释清楚的话,说明,这个解决方案还不够好――还不够简单和直观。宇宙够复杂了吧,可是霍金却创作《时间简史》系列的科普读物,既然是科普,它的读者就是广大的普通老百姓,不一定非要是物理学或天文学的博士。 在软件解决方案上,为了追求直观而简单的解决方案,我们发明了面向对象,之后又是N层架构、面向组件、AOP,又到现在比较热门的MDA、WebServ. 阅读全文
posted @ 2005-09-13 09:22 zhuweisky 阅读(1021) 评论(0) 推荐(1) 编辑
摘要: 所有的软件技术和思想的出现都是为了解决所在的那个年代软件开发的复杂性,对象技术和组件技术也不例外。当然还有很多其它技术,像DBC(契约式编程)、AOP、MDA等,这些思想都在影响我们设计/实现程序的方式,但无可否认的是,当今最主流的编程技术是对象技术和组件技术。 面向对象技术已经成熟的发展将近20年了,关于这方面的经典书籍和论文也随处可见。为了解决更大的系统的复杂度,组件技术应运而生,在windows平台上,组件从最初的动态链接库到COM,在到现在的中间件、.NET,就是组件思想走过的轨迹。 面向对象技术的基础是封装--接口与实现分离,面向对象的核心是多态--这是接口和实现分离的更高级升华,. 阅读全文
posted @ 2005-09-13 09:16 zhuweisky 阅读(5486) 评论(7) 推荐(1) 编辑
摘要: 相比于写代码,我更喜欢写能自动产生代码的生成器,和许多人一样,我讨厌写重复的代码,这种重复包括字面的重复和结构的重复、还有思想的重复。 在日常的开发过程中,一旦我发现一种需要经常使用的元素(类/结构/方法),我就将它整理出来,所谓整理主要是做这样的工作:重构、最大限度降低这个元素与其它元素的耦合性、 阅读全文
posted @ 2005-09-13 09:14 zhuweisky 阅读(2720) 评论(8) 推荐(2) 编辑
摘要: 一个系统不仅需要优秀的分析和设计,更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理,也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别,她们之间的比例不是1:100或1:1000这样量化的数字能够表示的。就像一个团队建造了一幢摩天大楼屹立于云霄,而另一个团队的... 阅读全文
posted @ 2005-09-12 11:50 zhuweisky 阅读(5312) 评论(14) 推荐(2) 编辑
摘要: 软件架构师的主要职责是什么?是抉择、是权衡。把软件称为艺术一点都没有夸张,可以说软件是科学、工程、与艺术的结合体。软件的艺术体现在权衡上。在这一期的《程序员》杂志上看到了一篇“鱼与熊掌--完美主义架构师的梦魇”,其中关于权衡要素的论述正切合我之所想,现将主要部分转摘如下,如果想了解更详细内容,请在本期程序员阅读全文。(1)Time or Space 时间 vs. 空间 牺牲内存换取时间或牺牲时间以节省内存是我们常用的伎俩。 (2)Elegancy or Efficiency 优雅 vs. 效率 比如,多态很优雅,却是以效率为代价,而丑陋的函数指针却正好相反。(3)Fashion or Fam. 阅读全文
posted @ 2005-09-11 10:08 zhuweisky 阅读(1947) 评论(4) 推荐(1) 编辑
摘要: 事件是面向组件开发的必要特性之一,但C++不直接支持事件,没关系,我自己实现了一个,感觉很好用,分享给大家! 最开始打算用函数指针模拟事件,但由于C++中成员函数指针不能和void*相互强转,而且typedef中不能含有模板,所以才不得已以接口继承实现。这样效果也不错 :)一. 先看看事件接口定义... 阅读全文
posted @ 2005-09-10 22:35 zhuweisky 阅读(14616) 评论(5) 推荐(2) 编辑
摘要: 1.异常处理相对于返回错误代码的一个最大优点在于,异常可以被自动传递,这样,在编程时异常更加难以被忽视。2.通常,只在最上层(一般是UI层)捕捉异常。如果要在其它层捕捉异常,除非是下列情况之一:(1)能够处理该异常,或者(2)能够忽略该异常,或者(3)需要转换该异常为其它特定异常后抛出新异常3.UI... 阅读全文
posted @ 2005-09-10 16:54 zhuweisky 阅读(8459) 评论(11) 推荐(2) 编辑
摘要: 很久以前我就考虑这样一个问题:有这样一个函数,它的功能是从一个整数集合中返回最大的那个数,如何设计这个函数的签名了?当时没有得出令自己满意的答案,所以就搁浅了。今天重新思考,终于有所悟!现在把我思索的整个过程展现于此。最直观的函数签名设计如下:intGetMaxElement(ArrayListeleList);乍看之下,很好,很直接的反映了意图。稍微深入一点就发现,如果eleList为null或者其中元素个数为0,GetMaxElement返回什么了?第一反应,修改签名为下面的形式:boolGetMaxElement(ArrayListeleList,outintresult); 我问了很多 阅读全文
posted @ 2005-09-10 11:07 zhuweisky 阅读(3842) 评论(21) 推荐(3) 编辑