Hello World
Spiga

使用Mono.Cecil解决无法Mock非虚方法和密闭类的问题

2012-01-12 14:50 by 老赵, 765 visits
摘要:之前我在微博上抱怨单元测试会让代码中的接口数量激增,有些同学回复说,这是因为在C#里只能Mock接口,如果是Java的话便可以Mock普通类。不过其实在Mock实现方面,C#和Java没有任何区别,只不过C#的成员默认“非虚”而已,因此无法使用继承后重载的方式实现Mock行为。我不喜欢默认的虚方法,但我也十分不愿意为了“单元测试”这个与具体功能无关的角度而破坏设计本意。幸好,我们可以用Mono.Cecil在单元测试执行之前,将目标程序集里的所有方法修改为虚方法,并去除所有密闭标记,这样遍可以轻而易举的解决无法Mock的问题了。 阅读全文

求助:一份用于学习单元测试的案例需求

2012-01-07 07:23 by 老赵, 1664 visits
摘要:一直熟知单元测试的重要性,也算是了看了几本这方面的经典书籍,但是真开始上手的时候总会遇到各种各样的坎。例如,为什么总感觉自己的单元测试之间有较多的重合,为什么每个单元测试都要准备那么多依赖?有的说法是,这意味着代码设计不够好,单元测试也有问题,或者说没有使用TDD的缘故,等等。但是,现实开发过程中在这方面也颇感无力。前段时间在微博上咨询了几个问题,感觉收获不大,这次干脆整理一份需求,仔细认真向高手学习一下代码设计,单元测试,甚至测试驱动开发的方式吧。我也会准备一些礼物来感谢一部分同学的帮助。 阅读全文

Node.js中相同模块是否会被加载多次?

2011-12-27 15:19 by 老赵, 1211 visits
摘要:JavaScript的包管理一直是个软肋,但既然它流行了,既然人们想要用它做大事了,就要开始为它制定一些模块的约定。Node.js使用了CommonJS模块机制,最近在InfoQ上也有一篇文章讨论了这方面的问题。这篇文章提到Node.js在载入模块时,如果之前该模块已经加载过则不会有重复开销,因为模块加载有缓存机制。这篇文章是我初审的,当时也正好在思考Jscex在Node.js使用时的模块化问题,但研究了它的规则之后,我发现在某些情况下还是可能加载多次。现在我们便来分析这个问题。 阅读全文

受禁锢的异步编程思维

2011-12-19 13:49 by 老赵, 2658 visits
摘要:最近一直在努力推广,补充了很多中文文档和示例,因此博客上都已经有两篇文章有了“上”而没有“下”,即使最复杂的图示也已经绘制完毕。在推广Jscex的过程中,我发现有个比较明显的问题是,许多使用JavaScript的程序员已经习惯旧有的操作方式,甚至推崇一些据说很漂亮“模式”。但其实跟许多GoF模式是在修补OO语言的不足类似,很多异步模式都只是因为JavaScript语言特性不足而设计出来的“权宜之计”。我们在传统JavaScript编程环境下并没有其他选择,单纯地认为这是“美”,说实话只不过是一种安慰罢了。 阅读全文

Jscex正式发布至npm

2011-12-01 06:23 by 老赵, 2040 visits
摘要:之前一直不敢将Jscex发布至npm上,因为有些问题还没有完全拿定主意,例如“取消”任务的模型。一个异步任务一定是需要取消功能,尽管这个模型不一定需要直接定义在Jscex里。但是我还是为Jscex提供了一个统一的标准化的取消模型,一是易于使用,二是提供模型这个之后,API在设计时可以有更多表现力(例如,现在的task的status可能是canceled了)。上周末我实现这个模型(其实也就十几二十行代码),昨天我又修改了模块的加载方式,使其支持CommonJS规范。在发布到npm之后,现在可以说Jscex已经正式对外公开了! 阅读全文

尾递归对时间与空间复杂度的影响(上)

2011-11-15 14:12 by 老赵, 1993 visits
摘要:以前我也在博客上简单谈过“尾递归”及其优化方式方面的话题。前几天有同学在写邮件向我提问,说是否所有的递归算法都能改写为尾递归,改写成尾递归之后,是否在时间和空间复杂度方面都能有所提高?他以斐波那契数列为例,似乎的确是这样的情况。我当时的回答有些简单,后来细想之后似乎感觉有点问题,而在仔细操作之后发现事情并没有理论上那么简单,因此还是计划写篇文章来讨论下这方面的问题。 阅读全文

挖坟鞭尸:当年Sun公司的白皮书《About Microsoft “Delegates”》

2011-11-08 17:07 by 老赵, 3535 visits
摘要:这是一桩当年的Sun公司与Java的旧事,还要追溯到C#还没出现,微软还在搞J++的时代。这篇著名的白皮书便是《About Microsoft “Delegates”》,其中列出了Sun眼中的Delegate的多个缺点。最后,在白皮书里信誓旦旦地写到:“Bound Method Reference并不是语言发展的正确道路”。我的感觉是:不谈Java语言设计者的水平如何,至少这篇白皮书的作者,在语言设计的能力或品味上几乎落后了Anders Hejlsberg十年。从我之前翻译过的一篇文章来看,Anders一直扮演着指引语言发展方向的作用,这也是为什么C#在这十年的发展能比Java要健康得多的主要原因之一。 阅读全文

老赵书托(4):浪潮之巅(内含牢骚,不喜勿入)

2011-11-06 06:35 by 老赵, 6976 visits
摘要:我是一个码农,一个很彻底,很标准的码农,自认为比我遇到过的绝大部分技术人员要码农得多。我喜欢搞技术,玩技术,不喜欢搞管理,搞人,或是搞产品等等。我是死脑筋,凡事都要想很多遍,想个明白,想不明白就不表态。我不喜欢猜测,不喜欢无法验证的事物,因此我成不了那种常见的,著名的,经常指点江山的分析师。每次有人问我对某某事物未来的看法,十有八九我只会婉言谢绝。其实照我的个人口味,我是不太会对《浪潮之巅》这中类型的书感兴趣的,但之前在网上看过谷歌黑板报上的连载,感觉不错,因此也去“搞”来一本品读一番。 阅读全文

使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

2011-09-05 16:21 by 老赵, 3650 visits
摘要:这也是之前在珠三角技术沙龙上的示例之一,解决的是在ASP.NET MVC使用dynamic类型Model时遇到的一个真实问题。C# 4编译器支持dynamic类型,因此在编写页面模板的时候自然就可以把它作为视图的Model类型。表现层的需求很容易改变,因此dynamic类型的Model可以减少我们反复修改强类型Model的麻烦,再配合匿名类型的使用,可谓是动静相宜,如鱼得水。不过,如果把一个匿名类型直接作为Model交给视图去使用,在默认情况下会抛出异常。我们可以用Mono.Cecil来改变这一情况。 阅读全文

在.NET平台下使用C#交互式控制台(上):简介

2011-08-31 16:25 by 老赵, 3631 visits
摘要:上周日在广州的珠三角技术沙龙上,我的演讲题目是“Mono之于.NET程序员”。Mono一直是我十分喜爱的产品,我也一直关注它的发展,总有很多人用各种方式对它进行FUD,甚至是.NET程序员自己。这其实跟程序员使用盗版一样,自掘坟墓,是种无比愚蠢的行为。在演讲中,我提到.NET程序员可以如何从Mono项目中得到帮助,现在便以C#交互式控制台为例,演示下在.NET平台下使用Mono项目的常见方式。 阅读全文

谈谈年度最佳代码“不管你们信不信,反正我信了”

2011-08-05 15:15 by 老赵, 12795 visits
摘要:最近有段十分流行的代码,是从江湖传闻“身怀八蛋”的铁道部发言人王勇平同志的一句名言:“不管你们信不信,反正我信了……这是生命的奇迹……它就是发生了”所引申出来的。这段代码虽然只是在调侃,但是围绕这段代码也产生了一些讨论(如代码风格,编程规范等等),在此顺手记录一下,就当无聊罢。 阅读全文

基于Node.js、Express和Jscex开发的ToDo网站示例

2011-07-15 06:33 by 老赵, 7628 visits
摘要:Jscex的主要使用场景是“JavaScript异步编程”,并不限制是跑在浏览器还是服务器端。最近Node.js很火热,也刚发布了原生的Windows版,不少同学也用它来做一些网站这样的小程序。目前用Node.js开发网站最著名的框架是Express,使用起来也是比较容易的。前段时间看到CNodeJS社区的一篇文章,某同学将一个Python写的ToDo列表网站移植到了Node.js上,我为了推广Jscex,就fork了这个项目,将其修改为基于Jscex的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在寻找更合适的项目。 阅读全文

从今开始远离纸版图书

2011-07-07 16:07 by 老赵, 7741 visits
摘要:纸版图书的历史实在太长了,似乎也已经看得到它被淘汰的那一天。这几天在为去深圳做准备,手边许多技术图书都成了大问题。搬去深圳会大动干戈,况且这些书基本也都只是偶尔翻阅一下,不太可能再认真读起。但如果把它们留在上海,那跟空置也没什么区别。以前我有个习惯,看到经典的书,在看完电子版或国内引进版之后都会买本英文原版的来“收藏”,现在已经“幡然醒悟”,之前也已经转让了一部分。现在除了一部分书,都打算出手了。这里开了个书单,感兴趣的同学可以各取所需。 阅读全文

IBM面试记

2011-07-02 15:29 by 老赵, 14704 visits
摘要:话说其实我很久没有被正经面试过了。一开始去微软实习自然经过了经典的笔试和几轮面试,然后去了朋友的创业公司并立即被激动集团收编——没有面试,接着从激动集团去合伙创业——没有面试,然后被朋友推荐去盛大创新院——面试更像是讨论及聊天。由于长久缺乏职场磨练,我虽然对自己能力有一定能力,但也怀疑自己如果通过“正经渠道”去面试的话能有多少机会成功。这次面试IBM终于算是过足了面试瘾,记录一下。 阅读全文

两则.NET高级技术人员的招聘信息

2011-06-21 15:25 by 老赵, 9335 visits
摘要:几小时前我在微博上发布了一条消息,表示我即将加入一家外企,而且完全是大家耳熟能详的IT公司之一,而且这个公司会让大家感到“意外”。于是大伙有猜微软的,也有猜Google,Apple,Oracle,HP等等,当然也有猜对的童鞋。在此公布答案,它便是传说中的IBM公司,我将在那里继续我的.NET程序员之旅。同时,我也希望可以找到一位同学可以帮助我目前在盛大创新院的项目继续良好地发展下去。 阅读全文

匿名类型的硬伤:围绕this的成员捕获策略

2011-06-15 09:27 by 老赵, 3116 visits
摘要:时不时听到一些C#程序员说,希望在C#里出现像Java匿名类一样的特性。以前我也觉得Java里的匿名类是个不错的特性,C#应该吸取进来。不过前段时间我仔细地理解了Java语言规范中关于内部类、匿名类的部分之后,一下子就被恶心到了。恶心过后,我忽然也意识到有些问题的确也是硬伤,也不能指责Java设计者的“品位”。例如,现在我想要谈的关于匿名类中this使用的问题——如果C#没法漂亮地实现这个特性,我宁愿它继续保持现状。 阅读全文

JavaScript:假如default不是switch的最后一项

2011-05-24 03:33 by 老赵, 3355 visits
摘要:话说大家对于switch语句应该再熟悉不过了,各种类C语言都不例外,JavaScript自然也是如此。switch的逻辑很简单,根据switch内容的值执行对应的case项,否则执行default项即可。但是不同的语言在具体一些细节上面的处理却是不同的。例如在JavaScript里,每个case项都可以没有break,于是语句便会顺延到下个case或是default里面去——但某些语言设计者认为这种特性容易造成代码理解上的偏差,因此比如在C#里便要求每个非空的case都要有个break。那么再来一个细节问题:如果default之后还有case,那么会出现什么样的情况?如果default里没有break呢? 阅读全文

上周末Jscex项目介绍的幻灯片

2011-05-16 05:43 by 老赵, 2556 visits
摘要:上周末,在风景秀丽的浙江大学校园内,举行了NodeParty杭州站的活动。我在活动上结合Node.js项目对Jscex进行了简单介绍,包括其设计目的,设计原则,使用方式,高级模式,组成部分等等。在场的许多朋友也提出了不少问题,我也一一作了解答或是演示。总体感觉还算不错,毕竟是亲手编写的项目,对其各方面还是了然于胸的。在此发布演讲用的幻灯片,希望能给不在现场的同学带来一些帮助。 阅读全文

浅谈Jscex的$await语义及异步任务模型

2011-05-10 14:29 by 老赵, 884 visits
摘要:从某些程度上说,Jscex的是提供了“新语言”,只不过这种新语言和JavaScript长的一模一样,最多添加了一个$await操作这个语义而已。其他方面,JavaScript的各种语法都可以让Jscex编译,所以它基本可以说是个完备的方案。之前有朋友提出疑问,说$await只能执行单个任务,那么岂不是多个任务之间就出现了先后依赖关系?假如有三个任务:A和B可以并行,但C依赖前两者,ABC如果串行的话,系统的总耗时便不够理想了。其实Jscex并没有这种限制,因为它的任务模型和$await语义简单且具有深厚的理论基础,灵活、丰富而统一。 阅读全文

浅谈Jscex编译结果的优化

2011-05-05 10:45 by 老赵, 871 visits
摘要:Jscex的核心是一个JavaScript语言到Monadic形式的编译器。从理论上说,这种编译规则十分简单,要写一个能够“正常运行”的编译器很容易。但是“正常运行”不代表足够优化。优化不当,会导致生成的结果中产生太多函数及闭包,对性能产生负面影响。在Jscex的早期原型中,从AST生成最终代码的逻辑比较简单,只做了一些基础优化。后来重构了编译器,减少了不必要的代码。而上周我提交了更新,实现了更复杂而有效的优化策略。如今的Jscex编译器部分应该已经足够稳定,剩下的便是类库方便的发展了。 阅读全文
1 2 3 4 5 6 7 8 9 ... 29 Next >
使用Live Messenger联系我