Hello World
Spiga

C#的设计缺陷(1):显式实现接口内的事件

2012-05-20 13:07 by 老赵, 30 visits
摘要:其实使用C#这么多年,我时不时会遇到一些令人不爽的设计缺陷。这些缺陷大都是些限制,虽说无伤大雅,也很容易避免,但一旦遇到这些情况,总会令人心生不快,毕竟都是些无谓的限制。而且令人遗憾的是,虽说去除这些限制也不会带来什么问题,但我认为C#设计团队也基本不会去修复这些问题了,毕竟它们大都是些细枝末节。作为一名用C#的纯种码农,我突然一时兴起也要把这些设计缺陷记录下,也方便和大伙一起讨论下。那么这次就先从实现接口内的事件说起,当我们需要显式实现一个接口内的事件时,会发现我们必须提供add和remove访问器,这还会稍许影响到事件常用的使用模式。 阅读全文

编写一个“绑定友好”的WPF控件

2012-05-13 15:35 by 老赵, 897 visits
摘要:最近在搞WPF开发,这对我来说是个陌生的领域。话说回来,可能是缺少耐心的缘故,我现在学习新事物的方式主要是“看一些入门文档”,“看一些示例”,然后“猜测”其实现并摸索着使用。在很多时候这种做法问题不大,但一旦有地方猜错了,但在一段时间里似乎和实践还挺吻合的,则一旦遇到问题就会卡死。上周五我就被一个WPF绑定的问题搞得焦头烂额,虽说基本搞定,但还是想验证下是否会有更好的做法,特此记录一下,欢迎大家指正。 阅读全文

HTML Metro开发里的数据绑定(1):WinJS.Binding.List

2012-05-01 14:53 by 老赵, 683 visits
摘要:前段时间接触了一些WPF开发方面内容,了解如何使用MVVM模式将界面与模型几乎彻底分离开来,只通过其强大的绑定功能连接两者,让人叹为观止。Win8的Metro开发支持使用XAML(配合C#,C++等语言)或是HTML(配合JavaScript),前者的控件和数据的绑定已经相当完备,而后者一直没有一个标准的模型。之前我也简单了解过如Knockout这样的绑定支持与MVVM模式实现,理论上说也完全可以在Metro开发里使用,但其实Metro开发本身也已经提供了一些内置的绑定支持,基本对应于XAML/C#开发里涉及到的ObservableCollection与INotifyPropertyChanged。 阅读全文

关于C#中async/await中的异常处理(下)

2012-04-12 01:26 by 老赵, 985 visits
摘要:上一篇文章里我们讨论了某些async/await的用法中出现遗漏异常的情况,并且谈到该如何使用WhenAll辅助方法来避免这种情况。WhenAll辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则会抛出“其中一个”异常。那么究竟是哪个异常?如果我们要处理所有的异常怎么办?我们这次就来详细讨论await操作在异常分派时的相关行为。 阅读全文

关于C#中async/await中的异常处理(上)

2012-04-11 01:15 by 老赵, 1520 visits
摘要:在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制。不过对于异步编程来说,异常处理一直是件麻烦的事情,这也是C#中async/await或是Jscex等异步编程模型的优势之一。但是,同步的错误处理机制,并不能完全避免异步形式的错误处理方式,这需要一定实践规范来保证,至少我们需要了解async/await到底是如何捕获和分发异常的。在开发Jscex的过程中,我也在C#内部邮件邮件列表中了解了很多关于TPL和C#异步特性的问题,错误处理也是其中之一。在此记录一下吧。 阅读全文

使用Jscex改进Node Club(4):改写首页

2012-03-10 06:11 by 老赵, 1301 visits
摘要:上次我们分析了Node Club的首页实现,了解了它的功能以及目前的实现方式。这次我们便来使用尝试使用Jscex来改进首页的逻辑。作为一个面向开发人员的工具,Jscex除了隐藏必要的复杂度之外,还要让目标程序“可控”,无论是串行、并发还是逻辑表达——Jscex使用JavaScript语法,保证了程序逻辑的灵活与可控,尽可能地避免出现Leaky Abstraction。EventProxy的确提供了一种“完全并发”的抽象,但是对于需要“可控并发”,或是“串行执行”的逻辑和场景便显得无能为力了。 阅读全文

使用Jscex改进Node Club(3):分析首页实现

2012-02-29 15:44 by 老赵, 818 visits
摘要:上次我们已经将Jscex成功地引入项目,现在便可以正式开始关注Node Club的实现了。Node Club中存在大量基于回调的JavaScript代码,颇有无从下手的感觉。既然如此,我们便随便挑一个,从首页入手吧!首页的目标其实很简单,加载几部分数据组成一个对象,再交给模板引擎生成HTML代码并输出。Node Club使用EventProxy类库来尝试解决大量异步函数的嵌套问题,但是在我看来,在这里使用EventProxy并没有带来太多的益处,从简化编程的角度来说,效果十分有限。 阅读全文

使用Jscex改进Node Club(2):引入Jscex类库

2012-02-20 13:57 by 老赵, 1040 visits
摘要:之前我们已经将Node Club在本地运行起来了,接着我们便来引入Jscex类库,为常用异步方法扩展出Jscex版本,并试着编写一些最简单的Jscex代码。在编写Jscex方法中,我们无需操作回调函数,只要在异步点上使用$await进行“等待”即可。我们也无需显式地处理错误,因为一旦出现错误便会抛出异常,异常如果没有被某个try…catch捕获到,则会顺着调用路径一路向上传递,直到被我们的代码或是系统捕获为止。Jscex将简单易用的传统编程模式与实践重新带回异步编程中,做到“同步编写,异步执行”的效果。这就是Jscex诞生的意义。 阅读全文

使用Jscex改进Node Club(1):运行Node Club网站

2012-02-20 06:24 by 老赵, 1981 visits
摘要:一直想做个相对完整的项目来演示下Jscex的使用,可惜缺少创意和精力,一直没能实现。前几天看到Node Club将其网站开源了,不禁让我十分欢喜。Node Club网站是个真实案例,复杂度适中,既是Jscex的典型使用场景,又能避开我不擅长的网页样式设计和制作,简直是一个再合适不过的基础样板了。周末我大致看了下代码,也试着将几个部分使用Jscex改进了一下,效果也十分显著,于是打算写作一个系列指引,希望可以对Jscex类库的推广有所帮助。在此第一篇,自然是最基本的环境建设开始说起。 阅读全文

增强Jscex目标代码可调试性:已包含输入代码

2012-02-16 15:30 by 老赵, 806 visits
摘要:经过了糜烂堕落的春节长假,Jscex的改进和推广又该步入正轨了。尽管使用Monad形式的目标代码已经比状态机展开要易读许多,甚至可以直接翻译回原始代码,但总还是有朋友被“编译”两个字和略显复杂的代码吓退。因此我最近一直在修改Jscex的代码生成器,即将发布的0.6.0版本的编译器会在目标代码已经包含了原始的输入代码,并且和目标代码行行对应。如今在调试Jscex的代码时已经可以把注意力更多放在原始代码上,而不用肉眼去识别相对复杂的Monad代码了。 阅读全文

一份用于学习单元测试的案例需求(实现)

2012-02-03 10:44 by 老赵, 2690 visits
摘要:终于把这份实现写完了,比想象中要花时间,尤其是为了可测试性而增加的代码结构。我并没有使用TDD来开发这个类库,依然是先写代码,再写单元测试,测试代码也只关注了代码主体,没有刻意去测试边界情况。一部分原因是其中都是内部实现,可以把握住输入,令一部分原因是这段实现主要是各种交互,而没有复杂的业务逻辑。我个人满足于单元测试而不是测试驱动开发,但如果您是使用测试驱动开发(TDD)甚至传说中的BDD来实现这个方案,那就更好不过了。 阅读全文

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

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

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

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

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

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

受禁锢的异步编程思维

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

Jscex正式发布至npm

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

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

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

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

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

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

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