摘要:为了补充引用资料,现在对之前Lambda表达式编写递归函数进行一番性能测试。测试的对象为辗转相除法求最大公约数,使用以下三种方式计算:普通递归,使用SelfApplicable及Fix进行计算。从执行时间上看,直接递归的性能最好,Self次之,但相差不大,但Fix方式消耗的时间就为前两者的7倍左右了。从GC压力上看,直接递归与Sel对GC都没有丝毫压力,但Fib由于构建了额外的委托对象,其压力也相对较大。
阅读全文
谈谈我对《ThoughtWorks文集》中多语言开发部分的看法
2009-09-26 17:44 by Jeffrey Zhao, 13077 阅读, 3 推荐, 收藏, 编辑
摘要:一早看怪怪同学评论《ThoughtWorks文集》公开的样章,一谈多语言开发(第5章),二谈测试(第13章)。怪怪同学的看法是贬前者而捧后者,并提出“同样一个包装下、同一个公司不同的作者,差异如此之大,那么在我们的学习过程中,就要注意去芜存菁了”。说实话,我没有理解他对第5章的评价,如在“抽象方式”方面的说法我没有太深的理解。不过现在我也谈谈我对书中所写多语言开发的看法。用一句话概括的话就是:赞同结论,不赞同论据。的确如怪怪同学所言,即使是有“大师”称号的作者,其内容也该去芜存菁。 阅读全文
幻灯片:LINQ Inside, Part 1
2009-09-26 13:06 by Jeffrey Zhao, 11970 阅读, 0 推荐, 收藏, 编辑
摘要:整理电脑时整理发现一个幻灯片,修改日期是去年年底,当时不知道为了什么,对方是谁讲一次LINQ。这次讲座是入门型的,主要讲了讲什么是LINQ,什么是表达式,表达式树等等。不过这第一部分似乎……还没有提到LINQ,更那个什么的是,我已经找不到第二部分了……因此,大家可以随意看看。目前脑袋写了几篇相当不错的,可作为入门的LINQ相关文章。以后我再提到这部分内容时终于也有东西可以引用了…… 阅读全文
语言特性与API设计
2009-09-25 17:12 by Jeffrey Zhao, 13040 阅读, 4 推荐, 收藏, 编辑
摘要:我平时的主要工作之一,便是编写一些基础及通用的类库,能够在项目中大量复用。换句话说,我的工作目的,是让其他开发人员可以更好地完成工作。因此,如何设计更容易使用的API是我经常要考虑的东西,偶尔也会有一些体会。而现在这些内容,是我在为Functional Reactive Programing写“参考答案”的时候忽然“总结”出来的想法。可能比较简单,但我想也是设计API是需要考虑的一些内容。 阅读全文
我对NHibernate的感受(2):何必到处都virtual
2009-09-24 15:09 by Jeffrey Zhao, 16896 阅读, 3 推荐, 收藏, 编辑
摘要:上一篇文章主要是在夸NHibernate实现的好,而这篇就完全是来抱怨的了。NHiberante有个毛病,就是如果是和数据库产生映射的类,就要求所有的public成员和protected成员必须是virtual的。这就让我觉得无厘头了,为什么没有任何关系的东西也要受到限制?我知道NHiberante要求将属性标记为virtual是为了延迟加载,但这又关没有映射的属性,甚至方法什么事情呢?虽然我现在明白了原因,但还是不能接受——因为我们在承受Java语言所带来的痛苦。 阅读全文
我对NHibernate的感受(1):对延迟加载方式的误解
2009-09-24 14:04 by Jeffrey Zhao, 17457 阅读, 4 推荐, 收藏, 编辑
摘要:我用NHibernate时间不长,而NHibernate的复杂程度也决定了我无法像了解LINQ to SQL那样容易。不过在使用了一段时间过后,还是对它有一定体会。有欣喜,有误解,也有抱怨。总体来说,目前NHibernate是我最满意的ORM框架。之前我一直认为NHibernate使用了一种简单的延迟加载方式。但事实上,它使用了一种维持原有业务逻辑的延迟代理写法。如果您关注我的文章,会发现这就是我之前提出的最为理想的延迟代理实现方式,也是我在Eazy类库中使用的做法。惭愧啊。 阅读全文
一些技术图书编写、推荐、出版人员需要自重
2009-09-23 20:04 by Jeffrey Zhao, 21039 阅读, 31 推荐, 收藏, 编辑
摘要:国内图书市场已经很不健康了,虽然现在许多出版社、编辑和作者的努力都看得到,但是总有更多的书冒出来拖他们的后腿。对于普通人来说,有多少人会区分出版社,区分作者呢?因此,我真希望技术图书的编写、推荐和出版人员还是要自重,写不好书就不要写,出不了好书就不要吹,没看过书就不要推。图书产业虽然也早已商业化,但是这毕竟还代表了知识,有其特殊性,经济利益不该是你们唯一考量的东西。 阅读全文
在ASP.NET MVC中使用IIS级别的URL Rewrite
2009-09-23 15:03 by Jeffrey Zhao, 16049 阅读, 2 推荐, 收藏, 编辑
摘要:大约一年半前,我在博客上写过一系列关于URL Rewrite的文章,把ASP.NET平台上进行URL Rewrit的方式和各自地特点进行了较为详细的描述。应该来说,已经讲的非常具体,可以应对90%的情况。其实IIS Rewrite的原理非常容易理解,进行一些简单的变化和推断之后,便可以得出一些问题的原因和解决方案。现在我们就来看一个真实案例:在ASP.NET MVC中使用IIS级别的URL Rewrite。 阅读全文
趣味编程:Functional Reactive Programming(参考答案)
2009-09-23 10:45 by Jeffrey Zhao, 12382 阅读, 1 推荐, 收藏, 编辑
摘要:初见Functinal Reactive Programming时,它的编程方式让我大开了眼界,居然可以用这种方式来操作和控制事件。虽然从技术角度来说,要实现这种方式并不是非常困难,甚至颇为有趣。因此我把它当作一次“趣味编程”。不过,这次的结果似乎让我对API设计有了一些新的体会,我打算明天再来总结一下。今天,我们先关注原题的解决方式。 阅读全文
片段缓存的实际应用、延迟加载及Eazy类库
2009-09-22 14:54 by Jeffrey Zhao, 13971 阅读, 1 推荐, 收藏, 编辑
摘要:片段缓存已经实现完整了,但好像还没有提到如何在项目中进行实际应用,那么现在就来谈一谈这方面。之前也有朋友提出,这个片段缓存难道节省的只是拼接HTML字符串的时间吗?这其实就涉及到片段缓存在实际项目中该如何使用的问题了。我们通过延迟加载来省下数据加载的开支,而且有了Eazy类库之后,定义延迟加载是件非常容易的事情。 阅读全文
适合ASP.NET MVC的视图片断缓存方式(下):页面输出原则
2009-09-22 11:05 by Jeffrey Zhao, 15891 阅读, 4 推荐, 收藏, 编辑
摘要:上一篇文章里已经把Html.Cache打造成了非常具有可用性的API,需要缓存时我们只需在页面上做一个标记即可。标记内部的写法和普通视图的写法相同,RenderPartial等辅助方法输出内容也会被一并缓存下来。只可惜,上次文章末尾我提到有些效果是有前提的。这个前提就是必须修改RenderPartial的实现,让它遵守一个原则:如果您是在向页面输出内容,请务必将所有内容通过页面的Writer输出。 阅读全文
适合ASP.NET MVC的视图片断缓存方式(中):更实用的API
2009-09-21 15:49 by Jeffrey Zhao, 16231 阅读, 1 推荐, 收藏, 编辑
摘要:上一篇文章中我们提出了了片断缓存的基本方式,也就是构建HtmlHelper的扩展方法Cache,接受一个用于生成字符串的委托对象。但是在实际开发过程中,我们最乐于看到的使用方法,应该只是使用某个标记来“围绕”一段现有的代码。不过这个方法并不实用,如果您要缓存大片的HTML,还需要准备一个Partial View,再用它来生成网页片段。这次我们会构建一个更为良好的API。 阅读全文
幻灯片:Web开发中的缓存
2009-09-21 00:32 by Jeffrey Zhao, 16751 阅读, 3 推荐, 收藏, 编辑
摘要:这是我昨天在博文视点Open Party上海站上关于Web开发中缓存的简单讲座。原本博文视点的朋友们希望我讲一下ASP.NET MVC方面的话题(估计看我最近一直在搞这个),但是我觉得其他平台一直用的是MVC框架,而ASP.NET MVC作为“后来者”也没有什么出彩的地方,所以最终选择这个稍微“通用”些的话题。 阅读全文
从ASP.NET的PHP执行速度比较谈起
2009-09-18 12:14 by Jeffrey Zhao, 28015 阅读, 25 推荐, 收藏, 编辑
摘要:上星期我在InfoQ发表了一篇新闻,对Joe Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结。写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实。当然,如果像某些新闻那样“换一种说法”是可以骗过一些“不明真相的群众”,但是这就有违道德了。因此,在客观陈述完新闻内容之后,我只能选择把自己的感想、评论等内容放在自己的博客上。 阅读全文
适合ASP.NET MVC的视图片断缓存方式(上):起步
2009-09-17 17:19 by Jeffrey Zhao, 20698 阅读, 5 推荐, 收藏, 编辑
摘要:说到网站性能优化,没有什么比“缓存”更重要了。即便是某些朋友口中念念不忘的“静态页”,说到底也只是缓存了整张页面内容而已。但是,显然这样大粒度的缓存策略,在如今“牵一发而动全身”的Web 2.0站点中几乎是无法使用的。视图片断缓存,缓存的也是页面内容,它比更低级别的缓存更有效率,也比静态页等整页内容缓存的适用面要大得多。在Rails或Django中都有类似的功能,但ASP.NET MVC甚至在2.0的Road Map中还没有包含这一功能,我们只能自己动手丰衣足食了。不过有了ASP.NET WebForm作为强大的视图引擎,加这样的功能简直是举手之劳。 阅读全文
趣味编程:将事件视为对象(参考答案)
2009-09-17 09:48 by Jeffrey Zhao, 12377 阅读, 3 推荐, 收藏, 编辑
摘要:这次我们是要编写一个DelegateEvent对象,提供它AddHandler和RemoveHandler的实现。事实上,在之前还有一篇文章中,我们搞了一个人模狗样的构造方式,但是它往往不适合用于实际使用过程中。因此,其实DelegateEvent最关键的地方还是各种不同的“构造方式”,使它可以用于各种情况。 阅读全文
ASP.NET WebForm页面内容输出方式
2009-09-16 14:41 by Jeffrey Zhao, 33088 阅读, 4 推荐, 收藏, 编辑
摘要:这次我们谈的话题是“Web Form页面上输出内容的方式”。这其实是一个非常旧的话题了,因为本文的内容甚至可以运用于ASP.NET 1.1之上。不过这个话题的适用范围很广,因为即使是目前最新的ASP.NET MVC框架,它的默认视图引擎依旧是基于ASP.NET WebForm的(如Page,Control,MasterPage)。甚至说,由于ASP.NET MVC框架的特性,我们会遇到更多在页面上“直接输出”内容的情况。因此,这个话题在ASP.NET MVC应用中可能由为重要。 阅读全文
Get Ready for Real World ASP.NET MVC
2009-09-16 13:37 by Jeffrey Zhao, 13463 阅读, 3 推荐, 收藏, 编辑
摘要:2009年的TechED大会即将在北京举行(11/5 - 11/7),其中有我的一个Session。我将其命名为“Real World ASP.NET MVC”,希望可以分享一下自己在ASP.NET MVC方面的使用体会。现在,希望大家可以给我一点帮助。例如,您在使用ASP.NET MVC开发Web应用程序时有没有遇到什么困难?您认为ASP.NET MVC哪方面还无法让人满意?各个方面都可以。 阅读全文
趣味编程:C#中Specification模式的实现
2009-09-15 20:15 by Jeffrey Zhao, 15254 阅读, 7 推荐, 收藏, 编辑
摘要:Specification模式的作用是构建可以自由组装的业务逻辑元素。多个Specification对象可以组装起来,并生成新Specification对象,这便可以形成高度可定制的业务逻辑。例如,我们可以使用依赖注入(控制反转)的方式来配置这个业务逻辑,以此保证系统的灵活性。但是Wikipedia上提供了非常旧的内容,很可能是在C#只是1.0版本的时候编写的代码(或者说它为了“兼容”Java那种语言的实现方式)。那么在实际开发过程中,我们又该如何利用C#如今的强大特性来实现出更容易使用,甚至是更为“轻量级”的Specification模式呢? 阅读全文
WebFormView的标准修改办法及MvcPatch项目
2009-09-15 12:11 by Jeffrey Zhao, 12533 阅读, 3 推荐, 收藏, 编辑
摘要:上一篇文章中我提到WebFormView的实现破坏了IView对象设计思路,它会把视图内容直接生成至HttpContext.Current而不是Render方法指定的TextWriter中。之前我提出了一种非常临时,非常山寨,非常简陋,绕弯,但是可行,或者说是可以“表现出解决问题的方法”的代码,而这次我们来做一次“标准”的修改。此外,我还创建了一个MvcPatch项目来保存这些内容。 阅读全文
应该算是WebFormView的一个Bug
2009-09-14 15:33 by Jeffrey Zhao, 12549 阅读, 2 推荐, 收藏, 编辑
摘要:最近需要搞一些重要的功能,结果又遇到了意料外的障碍。于是又仔细地看了看ASP.NET和ASP.NET MVC的源代码,又发现了以前不曾知道的一些细节。其实ASP.NET为我们留下了不少切入点,但几乎没什么书会提到这些切入点,我们只能从微软自己的框架中一探究竟。不过这次我想谈的是ASP.NET MVC框架中的一个Bug,这个Bug在一般情况下不会出现问题,但是这的确违反了ASP.NET MVC自身的设计。这个问题就出在WebFormView对象的实现上。 阅读全文
MIT 6.00 Introduction to Computer Science and Programming, Fall 2008
2009-09-14 10:02 by Jeffrey Zhao, 15028 阅读, 2 推荐, 收藏, 编辑
摘要:SICP的替代品,终于有了进一步完整的消息。看着教授用苹果在明亮的教室里讲课的感觉,的确比看之前的视频要舒畅很多。很憧憬MIT的这类顶级学府的学术氛围,虽然这个梦想似乎越来越遥远了。 阅读全文
检查几个程序集中的internal成员
2009-09-13 23:17 by Jeffrey Zhao, 12252 阅读, 1 推荐, 收藏, 编辑
摘要:两个星期前我写了一篇文章谈到一个现象(或是感觉):我发现“类中的internal成员可能是一种坏味道”,原因在于违反了“单一职责”原则。然后谈了一般情况下遇到这种情况时一种可用的重构方式之一。结果自然是有人同意有人反对。不过刚才我忽然想到,不如检查一下微软的框架中internal成员的情况吧。微软最近几个框架都公开的源代码,社区反响不错,应该较为值得参考。 阅读全文
基于DelegateEvent创建第一个IEvent对象
2009-09-11 13:47 by Jeffrey Zhao, 11940 阅读, 1 推荐, 收藏, 编辑
摘要:继续和“事件即对象”打交道。我们之前提到过两个“趣味编程”:DelegateEvent与Functional Reactive Programming,现在我们在它们两者之间架起一座桥梁。也就是说,我们要从一个DelegateEvent对象创建一个IEvent对象出来。这样,您就可以把它作为第一个IEvent对象,继续尝试Functional Reactive Programming了。 阅读全文
如何创建TextWriter的子类
2009-09-11 00:42 by Jeffrey Zhao, 14510 阅读, 1 推荐, 收藏, 编辑
摘要:如果您需要继承TextWriter实现自己的类型,您会怎么做?继承TextWriter不难,不过接下来,您打算覆盖(override)掉哪些方法?从Reflector的观察结果发现,其中所有的方法最终都会委托给Write(char)方法。但是只覆盖Write(char)方法只能保证最终成果“可以运行”,却无法保证是最优秀的结果。但是又有谁可以告诉我,究竟该怎么做呢? 阅读全文
趣味编程:Functional Reactive Programming
2009-09-10 12:26 by Jeffrey Zhao, 14960 阅读, 1 推荐, 收藏, 编辑
摘要:基于事件的编程再常见不过了,尤其是在和UI相关的WinForm,WPF,Silverlight开发方面。把事件作为一等公民看待之后,我们可以实现一些较为“特别”的编程模型,例如Functional Reactive Programming。这是一种较为优雅的基于事件的处理方式,适合一些如交互式动画,自动控制方面的工作。即使平时不太常见,我想作为一个“尝试”或“练习”也是非常合适的。那么我们就学习F#的类库,为C#也设计一套这样的功能吧。 阅读全文
监视程序中的死锁及其他
2009-09-10 00:08 by Jeffrey Zhao, 14576 阅读, 0 推荐, 收藏, 编辑
摘要:每天回家路上总有一段比较长的路一片漆黑无法看书。这种时候,如果我有兴致则会用手机上上网,但是大部分情况下还是用来想问题的。今天我回忆起今天园子首页的一篇文章谈到死锁,想到了一种可行的解决方案,只可惜到家一搜索……别人已经实现过了。于是,又没我什么事情了…… 阅读全文
趣味编程:将事件视为对象
2009-09-09 13:11 by Jeffrey Zhao, 13158 阅读, 4 推荐, 收藏, 编辑
摘要:如果一个语言(平台)把事件视为对象,则表明它把“事件”作为了语言的一等公民来对待。这可以有效地提高语言的抽象能力,由于.NET本身无法将事件作为单个对象处理,因此在某些时候就会束手束脚,也难以引入一些特别的编程模型。前一篇文章中我们提出了一个糊弄人的解决方案。而这次,不妨由您来试试看如何给出一个更好的实现。 阅读全文
我犯了一个错误,您能指出吗?(结论)
2009-09-08 15:55 by Jeffrey Zhao, 13853 阅读, 6 推荐, 收藏, 编辑
摘要:其实许多朋友已经在回复中发现问题所在了。泛型类中的静态变量会因为T的不同而产生不同的值,也就是说每个T所访问的静态变量都是独立的。因此,看似共享的静态ConnectionKey实际上是两个不同的Guid。 阅读全文
我犯了一个错误,您能指出吗?
2009-09-08 10:01 by Jeffrey Zhao, 15520 阅读, 6 推荐, 收藏, 编辑
摘要:这是我最近在项目中犯的一个错误,您能指出吗? 阅读全文
把事件当作对象进行传递
2009-09-07 17:20 by Jeffrey Zhao, 7492 阅读, 4 推荐, 收藏, 编辑
摘要:最近在琢磨一些事情,和API设计有关。API设计在很多时候是和语言特性有关的,因此如Java这样的语言,在API设计时会处处受到压抑。而C#就能够出现如Moq或Fluent NHIbernate这样的项目。同样,F#能够开发出FsTest,Scala号称Scalable Language,都是依靠着丰富的语言特性。不过,最近在使用C#的时候鼻子上也碰了一点灰,这是因为我发现“事件”这个东西没法作为对象进行传递。 阅读全文
较为理想的延迟代理的编写方式
2009-09-07 11:15 by Jeffrey Zhao, 7859 阅读, 2 推荐, 收藏, 编辑
摘要:之前我谈到,在普通情况下我们可以很轻松地写出过一个代理类,用来处理延迟加载的情况。当时给出了一个很简单的做法,也就是指创建基类,覆盖它的一些属性实现。不过我当时也提到,这么做可能够用,但是也有一些缺点。例如,它破坏了SomeID属性中包含的业务逻辑。这也是我认为NHibernate的延迟加载方法欠妥的原因。因此我又想了想,理想中的延迟加载方式应该是什么样的呢? 阅读全文
如果是能简单解决的问题,就不用想得太复杂了
2009-09-05 17:41 by Jeffrey Zhao, 7556 阅读, 4 推荐, 收藏, 编辑
摘要:有个朋友在MSN问我说,有没有关于Emit的资料,它想生成一个类的动态代理。他抱怨Emit还是很麻烦,不过交谈过后知道他是想要做什么。他希望为一个对象的某个属性作延迟加载,这样可以避免一些无谓的消耗。不过我提出,这个方法是不是太重了,因为动态代理不是那么孤立存在的,它往往需要考虑很多其他东西。有时候我们可以使用最简单的代码,在一定程度上也可以达到目的。 阅读全文
一份值得阅读的幻灯片:微软对PHP支持的改进,及其它一些胡言乱语
2009-09-04 02:17 by Jeffrey Zhao, 11426 阅读, 15 推荐, 收藏, 编辑
摘要:这里有一份我觉得值得推荐给大家的幻灯片。这个幻灯片是不久前举办的WordCamp China 2009上微软王超群的演讲,演讲主题是《熟悉的陌生人:微软对PHP的新支持使WordPress在IIS7上雄起》。WordCamp是业界著名的PHP大会,不过我这里推荐这个幻灯片不是为了为了推广PHP,而是为了说明一些其他问题——当然也有关于技术的有价值的内容,这些您看了幻灯片和我的文章之后就会明白了。 阅读全文
通过表达式树构造URL时忽略部分参数
2009-09-03 11:37 by Jeffrey Zhao, 5126 阅读, 2 推荐, 收藏, 编辑
摘要:您的使用ASP.NET MVC的时候,一定遇到过使用Post接受数据的Action方法。为了实现这个功能,我们必须在客户端准备一个form,并填写它的Action——也就是Post的目标URL。按照传统的做法,我们会使用表达式树来构造这个URL,但因为ASP.NET Routing在处理配置规则中没有标明的Route Values时,会将它们作为Query String拼接在URL后面。因此,我们需要得到一种“忽略”某个参数的方式。 阅读全文
您能看出这个Double Check里的问题吗?(解答)
2009-09-02 17:16 by Jeffrey Zhao, 9081 阅读, 5 推荐, 收藏, 编辑
摘要:已经很有很多朋友得到了结果,是由于m_categories过早初始化,而导致double check的验证条件被破坏(或者说,满足)。不过,这里我们可以再谈一些更深入地内容,例如Memory Consistency Model。 阅读全文
您能看出这个Double Check里的问题吗?
2009-09-02 15:11 by Jeffrey Zhao, 8807 阅读, 5 推荐, 收藏, 编辑
摘要:昨天在做code review时看到一位同事写了这样的代码。这段代码的目的使用Double Check的做法来保证线程安全的延迟加载。但是我看到这代码之后发现了一个问题,这个问题不是第一次出现。因此,我打算在博客上记录一笔,希望可以给更多人提个醒吧。 阅读全文
趣味编程:函数式链表的快速排序(参考答案)
2009-09-02 10:58 by Jeffrey Zhao, 5123 阅读, 2 推荐, 收藏, 编辑
摘要:之前我提出了一个“趣味编程”,模仿Haskell的方式对一个链表进行快速排序。在那篇文章中我解释了Haskell列表的结构,并给出了ImmutableList的基础实现。快速排序的例子很多,多做也没有意思。这题虽然打着“快速排序”的旗帜,但事实上这里的关键在于实现ImmutableList数据结构的相关操作——否则为什么叫“函数式链表”的快速排序呢?。 阅读全文
优化通过表达式树构造URL的性能
2009-09-01 19:29 by Jeffrey Zhao, 5441 阅读, 5 推荐, 收藏, 编辑
摘要:我们继续改进通过表达式树构造URL的方式。在上一篇文章中,辅助方法可以正确地识别了ActionNameAttribute,而这次改进的则是性能方面的问题。原先的代码使用了传统计算一个表达式树的方式:“使用LambdaExpression对象封装,再编译,最后执行”来获得一个Expression对象的值。但是,Compile方法的性能是比较低下的,如果密集地执行会对性能产生一定影响。我们可以使用FastLambda中的组件来优化这部分操作的性能。 阅读全文
通过表达式树构建URL时正确识别ActionNameAttribute
2009-09-01 14:25 by Jeffrey Zhao, 5777 阅读, 1 推荐, 收藏, 编辑
摘要:在MvcFutures项目中提供了一个辅助方法,可以将一个表达式树对象转化成一个RouteValueDictionary集合。只可惜,这个辅助方法的毛病比较多。例如,它直接把方法名作为action的值,而忽略了其上标记的ActionNameAttribute。这导致了某个被“改名”的Action方法一旦用在了表达式树中,最终得到的URL便是错误的。不过只需寥寥数行代码便可改变这个情况。 阅读全文