<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>岁月如歌 &#187; api</title>
	<atom:link href="http://lifesinger.org/blog/tag/api/feed/" rel="self" type="application/rss+xml" />
	<link>http://lifesinger.org/blog</link>
	<description>关注用户体验、前端开发，记录生活点滴、岁月足迹。</description>
	<lastBuildDate>Wed, 28 Jul 2010 00:40:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>以用户为中心的 API 异常设计</title>
		<link>http://lifesinger.org/blog/2010/06/api-exception-design/</link>
		<comments>http://lifesinger.org/blog/2010/06/api-exception-design/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 03:36:50 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[user]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2599</guid>
		<description><![CDATA[设置一个元素的高度： var elem = document.getElementById('some-id'), val = '200px'; elem.style.height = val; // 原生写法 YAHOO.util.Dom.setStyle(elem, 'height', val); // YUI2 写法 $(elem).height(val); // jQuery 写法 当val = '200px'时，以上三种写法都能正确工作。 当val = '200xx'时，以上三种写法在 IE 下都抛出异常，在非 IE 下被忽略。 当val = '-200px'时，以上三种写法在 IE 下前两种抛异常，jQuery 忽略。 由于 height 值在不少使用场景下是动态计算出来的，比如淘宝宝贝详情页，就有如下代码： YUD.setStyle(switchTrigger, 'height', viewportHeight + docScrollTop - detailTop + 'px'); 在某些特定情况下，viewportHeight + docScrollTop - [...]]]></description>
			<content:encoded><![CDATA[<p>设置一个元素的高度：</p>
<pre>
var elem = document.getElementById('some-id'),
     val = '200px';

elem.style.height = val; // 原生写法
YAHOO.util.Dom.setStyle(elem, 'height', val); // YUI2 写法
$(elem).height(val); // jQuery 写法
</pre>
<p>当<code>val = '200px'</code>时，以上三种写法都能正确工作。<br />
当<code>val = '200xx'</code>时，以上三种写法在 IE 下都抛出异常，在非 IE 下被忽略。<br />
当<code>val = '-200px'</code>时，以上三种写法在 IE 下前两种抛异常，jQuery 忽略。</p>
<p>由于 height 值在不少使用场景下是动态计算出来的，比如淘宝宝贝详情页，就有如下代码：</p>
<pre>
YUD.setStyle(switchTrigger, 'height', viewportHeight + docScrollTop - detailTop + 'px');
</pre>
<p>在某些特定情况下，<code>viewportHeight + docScrollTop - detailTop</code>是负数，于是悲剧就产生了：IE 下，将会抛出异常，导致后续代码都不再执行。（这是一个真实的故事，淘宝的部分宝贝详情页，在发这篇文章之前，就因为该异常而导致部分功能不可用）</p>
<p>对于前端类库来说，在设计异常时，要尽可能考虑周全：</p>
<p>1. 异常的作用，是给程序员排查和定位错误用。对于线上代码来说，要尽可能的将异常设计为不打扰方式。比如在特定参数开启下，才会抛出或以 log 的形式输出。</p>
<p>2. 要特别小心浏览器自身 API 异常的不良设计。比如 IE 下对 style.height 非有效值的处理上，就不如其它浏览器。</p>
<p>3. 当然，该抛的异常还是得毫不犹豫抛出来。比如<code>null.method()</code>，所有浏览器都会告诉你错了。类库的 API 在某些场景下也需如此设计，以让开发者第一时间内发现问题。</p>
<p>两句话概括 API 的异常设计原则：</p>
<p>1. 当某个异常不会导致后续代码不可执行时，这种异常在设计时，要尽可能不打扰用户；<br />
2. 当某个异常会严重导致后续代码不可执行并产生不可预期的隐患时，就大胆抛出来。</p>
<p>简言之，就是 API 设计要以用户为中心，包括页面浏览者、类库使用者和类库开发者。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2010/06/api-exception-design/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>jQuery 让人恋恋不舍的秘密</title>
		<link>http://lifesinger.org/blog/2010/01/the-beauty-of-jquery-api/</link>
		<comments>http://lifesinger.org/blog/2010/01/the-beauty-of-jquery-api/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 15:41:09 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2396</guid>
		<description><![CDATA[jQuery 将马上发布 1.4 正式版，代码也从 googlecode 上迁移到了 github. jQuery 是我接触的第一个 JS 类库，俗话说初恋总是让人难以忘记。一年以前，这种难以忘记仅仅是一种纯感觉，说不出来具体原因。前几天重新看了一遍 github 上的源码。从纯功能上说，jQuery 并没有特别出色的地方。究竟是什么让我如此恋恋不舍呢？ 昨天搭建 taskspeed, 检查 jQuery 的测试代码时，突然明晓了一个也许大家都已知道的秘密： jQuery 最出色最让人恋恋不舍的是它的 API 设计。 比如 dom-style 的 api, YUI3 和 MooTools 等框架采用的是传统方式： el.setStyle(prop, val); el.getStyle(prop); el.setStyles({ propA: valA, propB: valB }); el.getStyles(propA, propB); // MooTools 支持 在 jQuery 里，一个 css 方法全部搞定： el.css(prop); // 表示 getStyle el.css(prop, [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery 将马上发布 1.4 正式版，代码也从 googlecode 上迁移到了 <a href="http://github.com/jquery/jquery">github</a>. jQuery 是我接触的第一个 JS 类库，俗话说初恋总是让人难以忘记。一年以前，这种难以忘记仅仅是一种纯感觉，说不出来具体原因。前几天重新看了一遍 github 上的源码。从纯功能上说，jQuery 并没有特别出色的地方。究竟是什么让我如此恋恋不舍呢？</p>
<p>昨天搭建 <a href="http://lifesinger.org/labs/taskspeed/">taskspeed</a>, 检查 jQuery 的测试代码时，突然明晓了一个也许大家都已知道的秘密：</p>
<p><strong>jQuery 最出色最让人恋恋不舍的是它的 API 设计。</strong><br />
<span id="more-2396"></span><br />
比如 dom-style 的 api, YUI3 和 MooTools 等框架采用的是传统方式：</p>
<pre>
el.setStyle(prop, val);
el.getStyle(prop);
el.setStyles({ propA: valA, propB: valB });
el.getStyles(propA, propB); // MooTools 支持
</pre>
<p>在 jQuery 里，一个 css 方法全部搞定：</p>
<pre>
el.css(prop); // 表示 getStyle
el.css(prop, val); // 表示 setStyle
el.css({ propA: valA, propB: valB }); // 表示 setStyles
el.css(prop, func); // func 是一个返回 val 值的函数
</pre>
<p>对比以上两种 API 设计，乍一看 jQuery 显得不那么“标准”。但从可记忆性和灵活性上讲，我觉得 jQuery 的设计都更人性化。jQuery 的 API 还符合学习上的渐进式思维：先学会最简单的情况<code>el.css(prop)</code>, 再了解到还可以有两个参数，接着发现参数可以是 map, 更进一步发现 val 还可以是一个函数。func 参数甚至能带给学习者一种惊喜：居然还可以这样用！jQuery 把一种渐进和愉悦带进了学习和使用的过程中，实在漂亮！</p>
<p>YUI3 的 API 缺少这种乐趣。查询 jQuery 的 API, 会有一种探寻秘密的寻宝感觉。YUI 的文档查询则让人感觉就是份工作，有点 boring.</p>
<p>和 YUI2 相比，YUI3 的 API 做了些改变。在 YUI2 里，YAHOO.util.Dom 的方法名，严格以动词开头，虽然有些方法名长点，但总体规律性很强，可记忆性还不错。在 YUI3 里，则出现了 byId, elementByAxis 等方式命名的方法。纯粹为了省几个字符？这种不一致性很纳闷。还有一些以名词命名的方法：ancestor, docHeight, 乍一看很难以为是方法。</p>
<p>老婆说，要睡觉了，就不码字了。最后说一句：YUI3 的 API 整体还是挺不错的，比如 Node 的方法命名，就非常严谨。ancestor 也是为了对应 next, prev 等命名。也就是说：Y.Dom 其实已变成了内部 API, 不鼓励用户直接调用。</p>
<p>但是不知为什么，我还是觉得 jQuery 的 API 设计高出一个层次，套用一句流行话就是：<br />
<strong>jQuery API 的用户体验更好。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2010/01/the-beauty-of-jquery-api/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
	</channel>
</rss>
