摘要:
在上一篇文章中我们列举了各种URL生成的方式,其中大致可以分为三类:1) 直接拼接字符串,2) 使用Route规则生成URL,3) 使用Lambda表达式生成URL。我们可以轻易得知,这3种作法可维护性依次增加,而性能依次减少。不过,我们还是有一个疑问,这个性能究竟相差多少?它是否的确真的可以被忽略?为此,我们还是来进行一次性能对比吧。您可以在这里下载文末的解决方案,亲自试验一下——不过在此之前,您不妨进行一个预测,猜猜看最后的结果究竟如何。 阅读全文
随笔分类 - 05. 实践优化
浅谈URL生成方式的演变
2009-10-29 00:29 by Jeffrey Zhao, 21126 阅读, 收藏, 编辑
摘要:
开发Web应用程序的时候,在页面上总会放置大量的链接,而链接的生成方式看似简单,也有许多不同的变化,且各有利弊。现在我们就来看看,在一个ASP.NET MVC应用程序的视图中如果要生成一个链接地址又有哪些做法,它们之间又是如何演变的。这个演变的过程,其实也是一步步发现缺点,再进行针对性改进的过程。我们虽然使用在ASP.NET MVC的视图作为演示载体,但是它的方式和思路并不仅限于此,它也可以用在ASP.NET MVC的其它方面(如在Controller中生成URL),或是其它模型(如WebForms),甚至与Web开发并无关联的应用程序开发上面。 阅读全文
您选择简单的组合,还是完整的集成?(补充)
2009-10-28 10:03 by Jeffrey Zhao, 17187 阅读, 收藏, 编辑
摘要:
昨晚就写到这里,刚看到有朋友提意见了,说我标题党,标题写着“文化”,里面变成PowerShell介绍了。其实如果我要介绍PowerShell就会更详细一些,而现在即使把所有的PowerShell脚本删了也还是有些内容的吧……不过现在还想多谈一些东西。例如,如果你要完成一件事情,那么会选择什么方式。我这里简单分为两种,一种是集成进常用的工具,如Visual Studio;另一种便是使用额外的工具——可以是Shell,也可以是别的。 阅读全文
您选择简单的组合,还是完整的集成?
2009-10-28 01:09 by Jeffrey Zhao, 17577 阅读, 收藏, 编辑
摘要:
其实这是两种文化,很多人说前者属于Unix文化,后者属于Windows文化。前者好比是一系列分散的小工具,它们互相配合完成任务,其典型代表是Unix Shell。而后者好比是一个完整的工具箱,包含了完成某件特定工作所需的几乎全部功能,其典型代表是我们再熟悉不过的Visual Studio。当然,既然是文化,就能够互相借鉴和采纳,因此我们在Unix环境中也可以使用如Eclipse和IntelliJ IDEA,而Windows环境中也有cygwin和Powershell。我今天写这个东西的原因是,我想要做的一件事情正好落入了这样的“俗套”,于是不仅“多想”了一些。这个事情便是所谓的“项目模板”。 阅读全文
对Action方法的参数进行双向转化
2009-10-23 09:47 by Jeffrey Zhao, 19205 阅读, 收藏, 编辑
摘要:
昨天有朋友忽然告诉我,在G点中国上搜索URL Routing时,我的《请别埋没了URL Routing》一文排在首位。这不禁让我汗颜,这是因为从现在的角度看起来,这篇文章的内容虽不能算错,但的确也不算是一种非常合适的做法。那篇文章的目的是展示如何利用URL Routing的扩展能力,将URL和Route Values通过Formatter进行双向的转化。这样便可以在Action方法中使用复杂参数的同时,也可以使用复杂参数得到正确的URL。这个目标是好的,可惜当时的思路有些偏差。现在我总结出了更合适的做法,并已经在项目中大量使用,效果不错。 阅读全文
我的TDD实践:可测试性驱动开发(下)
2009-10-19 08:48 by Jeffrey Zhao, 19750 阅读, 收藏, 编辑
摘要:
在上一篇文章里,我谈到自己在采用传统TDD方式进行开发时感到有些尴尬,最后不得不放弃这种先写测试再写代码最后重构的方式。不过我还是非常注重单元测试的实践,慢慢发现自己的做法开始转向另一种TDD方式,也就是“可测试性驱动开发”。简单的说,我现在采取的做法是,先开发,再测试,一旦发现产品代码不太容易测试,则将其重构为容易测试的代码。我发现,这种时刻注重可测试性的开发方式,其最终也能够得到质量较高的代码。上次谈的比较理论,而这次我便通过一个简单功能的开发过程,来表现我的思维方式及常用做法。 阅读全文
谈吉日嘎拉的《白话反射技术》及其他(技术篇)
2009-10-16 19:16 by Jeffrey Zhao, 26252 阅读, 收藏, 编辑
摘要:
社区又掀起了腥风血雨,这次又是吉日嘎拉这一博客园的众矢之的所引发的惨案。他的一篇《白话反射技术》发表之后,被包同学一篇文章狠狠地踩在脚底下,言辞之激烈令人罕见。从两片文章的内容与评论来看,大家的眼光似乎都没有集中在技术本身,而是针对个人在你来我往。有评论称这是“门派之争”,虽然看不出到底哪门哪派,但看上去也还真像那么一回事情。不过这真是技术社区该有的讨论氛围和方式?如果觉得吉日嘎拉在技术上有问题,难道不应该条条指出吗?既然没有人做这件事情,那么就还是我来吧,反正我写博客也成习惯了。 阅读全文
我的TDD实践:可测试性驱动开发(上)
2009-10-15 13:34 by Jeffrey Zhao, 21342 阅读, 收藏, 编辑
摘要:
TDD(测试驱动开发,Test Driven Development)是重要的敏捷实践之一,它的基本原理是用测试来带动开发,先写测试代码,再写开发代码,最后重构。许多TDD推广和实践者认为,这种方式易于带来高质量的代码。而如今,TDD也慢慢有了Test Driven Design,也就是测试驱动设计的意味。也就是说,它更像是一种设计方式了。这些理论我很愿意相信,也很支持,但是从实际角度来说,我还是较难接受正统的TDD行为。不过,我也在实际开发过程中总结出……怎么说呢,应该说是更适合我自己的实践方式,在此希望能和大家交流一下。 阅读全文
简化DomainRoute的配置
2009-10-15 09:57 by Jeffrey Zhao, 19057 阅读, 收藏, 编辑
摘要:
昨天有朋友写邮件告诉我说,他正在项目中尝试着使用我提供的DomainRoute组件。我很高兴,这说明我的努力不是在自娱自乐,是对别人有实际帮助的,也有一些朋友会尝试着自行对项目进行扩展,而不总是靠微软提供的食物来过活。不过他说,他发现DomainRoute的配置非常繁琐,需要为每个Route使用WithDomain,提供了大量重复的信息。他说他也在构建了辅助API,不过似乎效果不够好,问我有没有更好的解决方法。其实是有的,因为我在使用DomainRoute的初期也遇到了这个问题,不过现在已经在MvcPatch中提供了个人认为比较令人满意解决方案。 阅读全文
关于排错:专注思考,细心观察,步步为营
2009-10-14 14:27 by Jeffrey Zhao, 19027 阅读, 收藏, 编辑
摘要:
时常有朋友发邮件给我,说遇到了一个什么什么奇怪的问题,不知道是怎么回事,希望我帮忙看看。我基本上每天都会抽出或长或短的时间来回复这些邮件,不过也经常发现,其实许许多多的问题都完全是有能力自行解决的。在很多时候,我发现许多朋友还缺乏最基本的解决问题,分析问题的方式。其实我在平时工作中也会遇到各种各样的问题,有时候甚至异常古怪,但是在仔细分析之下,往往都能解决。于是我现在打算谈点解决问题的基本方式,希望可以帮到一些朋友。 阅读全文
我对NHibernate的感受(4):令人欣喜的Interceptor机制
2009-10-13 13:45 by Jeffrey Zhao, 22861 阅读, 收藏, 编辑
摘要:
之前谈了NHibernate的几个方面,似乎抱怨的居多,不过这次我想谈一下我对Interceptor的感受,则基本上都是好话了。这并不一定是说Interceptor设计的又多么好(事实上它使用起来还是挺麻烦的),但是这的确也是我认为NHibernate超越LINQ to SQL,尤其是Entity Framework的又一个重要方面——因为Entity Framework本身也已经不差了。更重要的是,Interceptor机制让我得以实现我“理想中的”数据访问功能。当然现在只是浅尝辄止一番,我打算以后再慢慢地,详细地谈谈我所满意的“数据访问层”设计。 阅读全文
浅谈Route规则名称的作用,及MvcPatch的处理方式
2009-10-13 10:00 by Jeffrey Zhao, 18075 阅读, 收藏, 编辑
摘要:
国庆前的最后一天,我写了《关于ASP.NET Routing的几点内容》,其中谈论了ASP.NET Routing作用,设计目的,工作流程等等。不过我还有一个比较重要的东西一笔带过了,不知道您注意到了没有,在向ASP.NET Routing的RouteTable.Routes属性(一个RouteCollection对象)中添加Route规则的时候,我们会同时指定一个“名称”。在微软给出的官方“广告”中,似乎看不出这个名称有什么用。但事实上,它的功能非常关键。 阅读全文
NHibernate自定义集合类型(下):自动维护双向关系
2009-10-12 00:49 by Jeffrey Zhao, 17881 阅读, 收藏, 编辑
摘要:
如果使用NHibernate自带的集合类型,其中一个问题就在于需要在代码中手动维护双向关系,迫使开发人员编写额外的代码。其实这就是集合自定义逻辑的一个应用方面。现在,既然我们已经得到了一个方便的自定义集合的解决方案,那么现在便把“自动维护双向关系”作为目标来实现一番,也算是一个非常典型的示例了。 阅读全文
NHibernate自定义集合类型(中):通用实现方式
2009-10-11 11:27 by Jeffrey Zhao, 18044 阅读, 收藏, 编辑
摘要:
上一片文章中我们观察了在代码中自定义一个基于Set的集合类型该怎么做,以及简单了解了一下NHibernate的这些自定义支持大致是如何工作的。不过文章最后还是留了两个问题,一是认为这种扩展方式不够通用,二是其中会出现的“重复”或是“反向依赖”。现在我们就需要在上文的基础上进行总结,提出一个通用的实现,可以方便我们构建自定义的集合类型。 阅读全文
NHibernate自定义集合类型(上):基本实现方式
2009-10-10 10:54 by Jeffrey Zhao, 26779 阅读, 收藏, 编辑
摘要:
前天一篇文章中我说NHibernate的集合类型实现有些“尴尬”,它无法使用自定义集合类型,设计也有些古怪——不过在许多朋友的指点下,我意识到NHibernate是可以使用自定义集合类型的。至于它的设计是否合理(或者说是用是否方便?)……这就是这几篇文章中想要探讨的内容了。不少朋友给出了一些自定义集合类型的示例链接,我参考之余也自己找了一些资料,慢慢尝试,也终于有了一些体会。 阅读全文
我对NHibernate的感受(3):有些尴尬的集合支持
2009-10-08 21:59 by Jeffrey Zhao, 15162 阅读, 收藏, 编辑
摘要:
既然是一个ORM框架,那么自然是将O这一端映射R上。至于集合,是O这方面最常见,也是R这一边非常容易表示的关系。例如,一个问题(Question)可以包含多个回答(Answer)。不过,NHibernate需要“一锅端”地设置集合属性,它没有保留自定义集合的逻辑。此外,在更新集合数据的时候,它也会出现多余的数据加载。 阅读全文
趣味编程:C#中Specification模式的实现(参考答案 - 下)
2009-09-29 10:35 by Jeffrey Zhao, 12408 阅读, 收藏, 编辑
摘要:
上一篇文章中我们利用C#语言的特性实现了一种轻量级的Specification模式,它的关键在于抛弃了具体的Specification类型,而是使用一个委托对象代替唯一关键的IsSatisfiedBy方法逻辑。据我们分析,其优势之一在于使用简单,其劣势之一在于无法静态表示。但是它们还都是在处理“业务逻辑”,如果涉及到一个用于LINQ查询或其他地方的表达式树,则问题就不那么简单了——但也没有我们想象的那么复杂。 阅读全文
使用Model Binder绑定Action参数字段时的取舍问题
2009-09-28 13:57 by Jeffrey Zhao, 12995 阅读, 收藏, 编辑
摘要:
刚才在看代码的时候忽然发现了一件可能会成为问题的情况,而这个情况还挺隐蔽的。因此,我原本写到一半的东西就暂时停下,顺延至明天,而现在先来谈谈这个问题。这个问题就是在使用DefaultModelBinder在绑定字段时的取舍问题。而您在使用ASP.NET MVC的时候不妨也检查一下,看看有没有这方面的情况。 阅读全文
在视图中使用递归生成树状结构
2009-09-27 13:45 by Jeffrey Zhao, 16751 阅读, 收藏, 编辑
摘要:
在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来。例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的HTML结构。这个问题看似简单,但是如何让实现变的轻松、易于使用也是一个值得讨论的问题。这次就来谈谈这部分的情况。 阅读全文
使用Lambda表达式编写递归函数(性能测试)
2009-09-27 13:23 by Jeffrey Zhao, 11937 阅读, 收藏, 编辑
摘要:
为了补充引用资料,现在对之前Lambda表达式编写递归函数进行一番性能测试。测试的对象为辗转相除法求最大公约数,使用以下三种方式计算:普通递归,使用SelfApplicable及Fix进行计算。从执行时间上看,直接递归的性能最好,Self次之,但相差不大,但Fix方式消耗的时间就为前两者的7倍左右了。从GC压力上看,直接递归与Sel对GC都没有丝毫压力,但Fib由于构建了额外的委托对象,其压力也相对较大。
阅读全文