Random Clippings栏目已经有一段时间没有更新了,主要是因为一直没能挑选到适合的文章推荐(有可能是因为这段时间我读英文文章少了,哈哈),这次一定要好好补上,推荐两篇好文章给大家。
你真的懂UPDATE语句吗 (Think you know how to write UPDATE statement? Think again.)
怎么又是Omar Al Zabir?别急别急,这家伙写的文章够恶搞,而且也算易读,所以重点推荐。先来看看他在文章开头如何恶搞吧:
“在我还很小的时候,每天晚上睡觉之前母亲都会给我念一些UPDATE查询。我听了很多很多关于如何将对象更新到数据库的故事,其中绝大部分都是如此的老土……因此,我也带着类似的更新对象到数据表的想法逐步成长,和其它的同龄人没什么两样。所有的UPDATE语句都包括所有的字段,而存储过程都要获取对象的所有属性。”
看完这段,估计大家都明白作者接下来要踩踩代码生成器或ORM工具所生成的全字段通用UPDATE了。
接着作者从Pageflakes从选取了一张名为Channel的数据表,加上Code Smith生成的存储过程,来说明这UPDATE有多“邪恶”。这张Channel表仅包含4个字段,其中一个主键、两个外键,然后来看看UPDATE有多可怕——那两个几乎从不会被更新的外键造成了严重的效率损失。而经验告诉我们,一般设置为外键的字段,很少会是需要频繁更新的字段,如果在UPDATE中删除对外键的SET,将能为频繁的更新操作提升效率。
“到此为止,你还觉得你真的懂UPDATE语句吗?再想清楚一些吧。”这是作者最后讲的话。如果你想真正“学习”一下UPDATE语句,那就模仿他的做法把你日常所用的UPDATE语句放到查询分析器里看看还有什么地方可优化的吧。
当有layout之时 (On having layout)
如果你拥有丰富的跨浏览器CSS设计经验,看到"On having layout"的标题,就应该能估计到我准备要说哪篇文章了。没错,就是那篇著名的"On having layout"。如果你正在进行CSS设计有关的工作,并且不是打算仅仅“兼容”IE这种“远古”的浏览器,又没有听说过这篇"On having layout",现在就是时候来仔细读读它了,以此了解IE众多古怪的布局bug来源,以及回避这些bug的一些基本方法。
文章开篇是“简介”,虽然名为简介,却略显神秘,告诉你很多IE的布局问题可以通过为元素引入"layout"来解决,然而却说要解释清楚"layout"是什么并不容易,这就吸引你继续看下去了。
接下来是“layout的定义”,在这里文章说明了"layout"是一个IE/Win的私有概念,能够影响元素的很多特性。如果你不仅仅设计CSS,同时也设计面向对象的程序,那就应该马上想到私有的东西我们不应该去碰,因为它应该是封装在接口之下的,我们不知道它也不影响使用。而在这个问题上,IE/Win的设计者作了一个很奇怪的决定,选择将"layout"这个属性对外暴露出来,这就是hasLayout属性了。这个属性是一个只读属性,默认值为false,而如果此元素拥有某些CSS规则,则hasLayout属性将变为true,除非这些CSS规则被去掉,否则hasLayout属性无法变回false。
说到这里,我们对hasLayout有了一个很浅层的认识,知道它是一个属性,而且只读,其值受其它因素影响而改变,还与众多IE的布局问题相关。你一定想了解一下这些布局问题是什么吧,或许有你碰到过的,你就可以趁机解决它,那就继续看下去吧。文章的“相关问题”一节中,简单地列举了一些常见的当一个元素hasLayout后引起的怪异现象,你可以看看你曾经遇到的问题是否在列表上,如果是的话,这篇文章将是该问题的一个很好的解释。
“layout来自何方”这一节中,文章列举了默认为hasLayout的一些元素,以及会导致元素hasLayout的一些CSS属性,还包括如何通过CSS属性重置(撤销)hasLayout。在这节中有一小节专门讲述inline元素在QuirksMode下如果hasLayout则会变成inline-block的效果,如果你是一个熟悉CSS标准的设计师,你会理解到这其中的区别。另外还有一小节专门讲述脚本中如何获取hasLayout属性。
接着“CSS技巧”给出了一些大家所熟悉的针对IE的过滤器,例如著名的Holly hack、underscore hack,或者是在IE中通用的条件注释。使用这些过滤器,为你希望hasLayout的元素加上一个特定的class触发其hasLayout条件,这能在某些时候帮助你。在这里我要说明一下这个“帮助”的意思,它是指假如你遇到某种在标准浏览器中能够实现的视觉效果,却在IE中无法实现,你可以考虑换种方式,让IE中该元素变为hasLayout然后或许有另外一些CSS属性组合能够达到等效的视觉效果。和文章里说的一样,我也要提醒你,千万不要把Holly hack当作真正的holy(神圣的) hack而盲目使用,因为hasLayout的元素能实现一些视觉效果的同时也就无法实现另外一些标准浏览器下能实现的效果。
还有,如果IE/Mac也是你的设计所要兼容的浏览器的话,就要看看“关于IE Mac的小问题”这一节了。因为IE/Mac的呈现引擎与IE/Win完全不同,显得更加标准,所以完全不知道hasLayout为何物,因此在使用上述技巧时应该避免“错误命中”IE/Mac。
“MSDN文档”摘录了来自MSDN本身的话,简单解释了一下为什么hasLayout的元素会如此特别。因为当一个元素hasLayout时,它必须是一个矩形区域,同时它负责自己内部所有元素的大小与定位。理论上每一个元素都hasLayout时,所有的元素定位都是最准确的,然而这导致计算复杂度增加,IE的执行效率降低到无法接受的程度,因此IE设计为只有特定条件才会触发一个元素hasLayout。而hasLayout也不意味着一个元素完全符合标准地呈现,例如它要求此元素绝对是矩形,而容纳有float属性元素的父元素就不是矩形了,它让开了一些位置给有float属性的元素,如果这个父元素hasLayout了呈现出来也就不符合标准了。
“分析”一节简述了作者对hasLayout的理解,作者认为hasLayout是一个内部的标志位,一旦被设置该元素就好像一个独立的小窗体一样,负责自己内部的呈现。
接着就进入文章中最长的一节了,“各种情况的详细说明”。在这里,你可以看到hasLayout带来的各种影响,例如常见的Containing Floats,又或者是IE著名的three pixel text-jog。当你把这一节看完,相信你肯定会惊叹——原来IE有那么多呈现时的bug啊!这一节比较长,而前对外部页面的引用也很多,但我相信你能够坚持看下来,因为你每打开一个外部链接都能看到一个有趣的bug,你肯定忍不住要看看下一个bug又是多搞怪。
“堆叠、分层与layout”这一节补充说明了hasLayout对分层的影响。所谓的分层,就是指z-index所能影响的东西,当多个矩形区域存在重叠范围时,应该哪个覆盖哪个。之后的“混乱的contenteditable”、“与CSS规范的相似性”、“Quirks mode”几节都描述了类似的与hasLayout有关的其它问题。
文章的最后几节尝试归纳了hasLayout的本质问题,说明IE/Win的对象模型算是文档模型与传统的Windows窗体模型的糅合,而hasLayout则是这两种模型之间切换的一个标志位。
如果在阅读这篇文章的时候,你需要一些帮助,可以考虑直接看它的中文翻译版本。你可以尝试着中英对照阅读,不过因为原文所用的很多单词和语法都很难直译为中文,所以在阅读中文版本时没必要太过深究它的翻译质量,只要它表达了原文的意思就够了。无论你喜欢哪个语言的版本多一些,我都强烈建议你收藏其中的一篇,以便在遇到IE的bug时能够快速查阅是否属于hasLayout有关的问题,并找到解决方案。
Microsoft前沿技术混合使用示范 (DinnerNow.net Sample Application and Resources)
又是超值大赠送时间了,这次提供给大家的最新资讯是DinnerNow.net。如果你已经看完了PetShop,并且因为这东西不加些AJAX又或者WinFX的功能上去而感到有些不满,那就应该看看DinnerNow.net啦。DinnerNow.net要展示的技术包括:IIS7, ASP.NET Ajax Extensions, Linq, Windows Communication Foundation, Windows Workflow Foundation, Windows Presentation Foundation, Windows Powershell, and the .NET Compact Framework,足够梦幻组合吧!
DinnerNow.net实际上是一个虚构的在线订餐网站。你可以在上面订餐,然后Workflow就开始了,从烹调开始,到上路运输,都是Workflow的状态,而作为订餐者你可以网站上追踪到状态的更新。如果你不想开着浏览器,你还可以将DinnerNow.net的Windows Vista Sidebar Gadget添加到你的Sidebar,从而直接在Gadget上了解你的订单状态。又或者你根本就不在PC前,使用Windows Mobile设备同样可以访问DinnerNow.net。
DinnerNow.net还有很多值得研究的地方等着大家去挖掘,大家有兴趣的话就去下载一个来研究研究吧。因为现在DinnerNow.net才刚刚放出来,所以网上的研究资料可能非常有限,特别是中文资料还没有人写,所以研究起来或许会有一定的难度。
最后,感谢各位读者花那么多时间来读完本期的Random Clippings。如果你喜欢Random Clipplings栏目,可以通过订阅的方式来支持Cat in dotNET,可选的方式包括通过Feed订阅(http://feeds.feedburner.com/CatChen/dotNET)和通过Email订阅(http://www.feedburner.com/fb/a/emailverifySubmit?feedId=573799)。