欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談關(guān)于JavaScript API設(shè)計的一些建議和準(zhǔn)則

 更新時間:2015年06月24日 14:29:19   投稿:goldensun  
這篇文章主要介紹了淺談關(guān)于JavaScript API設(shè)計的一些建議和準(zhǔn)則,文中列舉了許多知名的JS API進(jìn)行輔助說明,極力推薦!需要的朋友可以參考下

 設(shè)計是一個很普遍的概念,一般是可以理解為為即將做的某件事先形成一個計劃或框架。 (牛津英語詞典)中,設(shè)計是一種將藝術(shù),體系,硬件或者更多的東西編織到一塊的主線。軟件設(shè)計,特別是作為軟件設(shè)計的次類的API設(shè)計,也是一樣的。但是API設(shè)計常常很少關(guān)注軟件發(fā)展,因為為其他程序員寫代碼的重要性要次于應(yīng)用UI設(shè)計和最終用戶體驗。

但是API設(shè)計,作為我們自己寫的庫中提供的公共接口,能夠向調(diào)用我們代碼的開發(fā)者表現(xiàn)出我們庫的一些特點和功能,所以API設(shè)計和UI設(shè)計一樣重要。事實上,兩者都是為應(yīng)用可以提供更好的用戶體驗具有基本的方式。應(yīng)用UI在用戶UX中占有很重要的位置,應(yīng)用API是開發(fā)者的UX。因此,應(yīng)用API設(shè)計應(yīng)該被給予和我們提供給用戶的接口相同水平的考慮和關(guān)注。正像我們關(guān)注UI的功效,簡潔性和優(yōu)美,我們也應(yīng)該同樣的評估API的功效,簡潔性和代碼的優(yōu)美性!

API設(shè)計——javascript API設(shè)計的內(nèi)容,呈現(xiàn)了唯一的挑戰(zhàn)對所有的開發(fā)者,不管是否你正在開發(fā)一個公共的庫或者一個內(nèi)部的庫。javascript的動態(tài)性,庫使用者的匿名和需求的模棱兩可都給API設(shè)計者呈現(xiàn)了一個令人畏懼的挑戰(zhàn)。然而對于一個好的API設(shè)計是沒有捷徑的,但是可以從現(xiàn)代流行的一些javascript庫中提取出一些設(shè)計準(zhǔn)則是可能的!

API設(shè)計: 天使和惡魔的斗爭

javascript API中差的設(shè)計會給使用你API的開發(fā)者和你帶來高的花費。差的設(shè)計會導(dǎo)致浪費,使用你API的開發(fā)者會因為設(shè)法搞弄明白你接口而浪費時間,而API的開發(fā)者會因為處理不斷增加的需求和解決使用者的困惑而浪費時間。然而幾乎所有的API當(dāng)初被開發(fā)的時候,都是為了能夠提取相同的功能,方便調(diào)用并節(jié)約時間。但設(shè)計不好的API會使你的庫使用者和你產(chǎn)生疑惑,這些庫真的能節(jié)約時間嗎?

優(yōu)秀的API設(shè)計,一方面,完成了提取的目標(biāo),同時也實現(xiàn)了自我描述。當(dāng)一個API被良好的設(shè)計,使用者可以快速地和直觀地完成工作,完全不用不停的使用文檔或者持續(xù)的訪問支持或者解答網(wǎng)站。你也可以通過封裝一些開發(fā)者需要自己花大量時間開發(fā)的一些特征來節(jié)約庫開發(fā)者的時間。好的設(shè)計不僅節(jié)約開發(fā)者的時間,可以使他們看起來更加聰明和有責(zé)任。同樣幫助你的用戶看起來聰明和能干也會使你看起來更加的牛逼!

對于javascript來說,API設(shè)計特別重要

不管什么編程語言或者框架,API設(shè)計是重要的,API設(shè)計的重要性對于javascript來說是高于其它許多語言的。首先,作為一個動態(tài)的和后期綁定的語言,javascript沒有編譯器可以實現(xiàn)一個安全網(wǎng)或者檢測單元功能,所以javascript不可以發(fā)現(xiàn)你代碼中的錯誤。Linting 或檢驗框架 如 JSLint JSHint 可以幫助我們。這些框架的功能可以指出javascript中的一些普遍的錯誤,但是當(dāng)我們使用API時,他們卻不能發(fā)現(xiàn)javascript的錯誤。

這一切都取決于你,你可以開發(fā)一個具有良好設(shè)計的API,這個API可以幫助你的用戶掉進(jìn)眾所周知的“成功坑”,這就意味著你的庫對于開發(fā)者來說是舒服的和熟悉的,同時也提供了積極的強化和當(dāng)開發(fā)者和你的代碼交互時建立的信心。


“掉進(jìn)成功的坑里”最好的例子是jQuery 通過CSS選擇器語法獲取DOM元素的運用。例如,如果我想要獲取所有帶有類名的article元素,我可以運用jQuery這樣做:
 

$("article.blogPost").fadeIn();

選擇器article.blogPost和下面展現(xiàn)使用完全一樣的語法,這絕不是偶然的!
 

article.blogPost {
 border-radius: 10px;
 background-color: salmon;
 box-shadow: 0px 0px 10px 2px #ccc;
}

jQuery的選擇器引擎被設(shè)計為了使我和其他開發(fā)者能夠使我對CSS選擇器的理解和它的引擎進(jìn)行交互。結(jié)果可想而知,如果jQuery需要我用一種新的,為特定目的形成的語法,我將失去快速,明顯和高效。

我們可以獲得靈感從這些框架中,如jQuery,或者其他框架,并應(yīng)用這些靈感到我們的設(shè)計中。然而,獲得靈感并不是抄襲,有個度的問題,任何設(shè)計過API的人如果是僅僅的基于別人的想法,不管好與壞,他都將繼承。如果我們將在好的javascript中獲得的準(zhǔn)則運用到其他領(lǐng)域中,我們能開發(fā)擁有好的API的框架,這些API設(shè)計能被運用在任何情況下。

出色的Javascript APIs設(shè)計秘訣

雖然軟件不具有與繪畫或建筑類似的視覺評價標(biāo)準(zhǔn),我們?nèi)詢A向于使用與物理實體一樣的形容詞來描述軟件質(zhì)量。例如,使用“優(yōu)雅的”與“漂亮的”來贊美軟件并不罕見。如果用與物理實體相似的形容詞描述軟件接口是合理的話,那么當(dāng)然也可以使用與之相同的原則來評價軟件設(shè)計。

在本節(jié),將四個來自藝術(shù)領(lǐng)域的流行設(shè)計原則擴展至API設(shè)計中:

  1.     和諧一致
  2.     平衡
  3.     對稱
  4.     重點突出

對每一個原則,將列出一到多個實例來說明,這些例子表明流行的Javascript庫API設(shè)計是怎樣遵循這些原則的。

原則1:一致性&協(xié)調(diào)性

在藝術(shù)作品中,一致性是一個作品背后不可缺少的觀念,或者說設(shè)計者如何把一些事物組成連貫的一個整體。協(xié)調(diào)性,從另一方面來說,是一個作品相似元素的布局,這會在考慮整體時產(chǎn)生一種簡潔的感覺。

對于API的設(shè)計者,這些原則可以通過在類庫使用類似的和(或者)統(tǒng)一的元素來實現(xiàn)。就拿Kendo UI來說吧,一個創(chuàng)建富web應(yīng)用程序的javascript框架。Kendo UI提供了一系列的UI控件和工具,這些都可以通過一個簡單的語法初始化。比如,如果我想從一個無序列表創(chuàng)建一個樹形控件(TreeView),我只需調(diào)用以下方法:
 

$("ul.tree").kendoTreeView({ /* Configuration goes here */ });

2015624141513720.png (634×294)

Kendo UI樹形組件

如果我想通過一個列表創(chuàng)建一個面板PanelBar,我只需稍微改成不同的調(diào)用方法.
 

$("ul.panel").kendoPanelBar({ /* Configuration goes here */ });

2015624141539614.png (634×402)

Kendo UI 面板組件

Kendo UI 對所有組件使用一致的kendoX語法,促進(jìn)整體的協(xié)調(diào)。更重要的,這樣的設(shè)計依賴jQuery對象為DOM元素封裝了統(tǒng)一的一層,使設(shè)計有利于所有熟悉jQuery開發(fā)者。數(shù)百萬開發(fā)者使用類似的“土語”(jQuery語法),Kendo UI可以順利地跨庫使用。

另一個協(xié)調(diào)的案例是Backbone的[object].extend語法創(chuàng)建對象,繼承和擴展Backbone的Models,Views,Collections和Routers的功能。用如下代碼就可以創(chuàng)建一個Backbone Model,帶有Backbone的完整支持,也可以自定義我需要的功能:
 

var Book = Backbone.Model.extend({
 initialize: function() { ... },
 author: function() { ... },
 pubDate: function() { ... },
});

統(tǒng)一和協(xié)調(diào)的目的是讓API新手感覺熟悉和舒服。通過雖然功能不同,但是語法相同或相似,使API變得熟悉,大大減輕了開發(fā)者使用新工具的負(fù)擔(dān)。

原則 2 :平衡

下一條原則是平衡,組織元素時不會讓某個部分過于重量級而蓋過其它部分,使用時不穩(wěn)定。藝術(shù)作品里,平衡就是視覺權(quán)重。即使不對稱,作品中仍能感覺到不對稱下的平衡,因為它遵循某種模式。上下文中的API設(shè)計的平衡,我特指代碼的視覺權(quán)重和可預(yù)測性(看得出功能)。

平衡的API讓人覺得其組成部分屬于彼此,他們行為相同,或互補地完成一個目標(biāo)。通過擴展,APIs也可以感覺平衡,它們允許開發(fā)人員簡單的預(yù)測其他API并使用。如Modernizr的屬性測試,它們的平衡性在兩個方面,a)屬性名對應(yīng)HTML5和CSS術(shù)語和API名稱,b)每個屬性測試統(tǒng)一地返回true或false值。
 

// All of these properties will be 'true' or 'false' for a given browser
 Modernizr.geolocation
 Modernizr.localstorage
 Modernizr.webworkers
 Modernizr.canvas
 Modernizr.borderradius
 Modernizr.boxshadow
 Modernizr.flexbox

 

2015624141604498.png (634×267)

 訪問一個單一的屬性來告訴開發(fā)者需要了解到的相關(guān)屬性,以便通過它訪問每一個其他屬性,一個高質(zhì)量API的強大之處就在于它的簡單。平衡性也保證了我寫和Modernizr交互的代碼在每次讀寫時具有相同的視覺加權(quán)。如何在我使用和訪問API時看起來和感覺上一樣,而不顧我的慣例。另一方面,如果Modernizr添加了一個polyfill Canvas的API,不僅僅是類庫的視覺加權(quán)受到新API的影響,Modernizr的范圍和用途也將大大擴大,并且我在和API交互時可預(yù)測性也受到了限制。

達(dá)到平衡的另一種方式是通過依靠開發(fā)人員對概念的熟悉獲得可預(yù)測性的結(jié)果。一個典型的例子就是(jquery選擇器的語法),它映射css1-3的選擇器到自己的DOM選擇器引擎:
 

$("#grid") // Selects by ID
$("ul.nav > li") // All LIs for the UL with class "nav"
$("ul li:nth-child(2)") // Second item in each list

通過使用一個熟悉的概念并且映射到自己的類庫,jquery避免了新的選擇器語法,同事也創(chuàng)建了一個機制讓新用戶通過一個可預(yù)測的API快速的把類庫應(yīng)用到生產(chǎn).。

原則 3: 相稱性

接下來的原則是相稱性,它是用來衡量一個作品中元素的大小和數(shù)量的。與其說一個好的API是一個小的api,相稱性是相對于用途的大小。一個相稱的API它的API表面和它的能力范圍相匹配。

例如,Moment.js,一個流行的日期轉(zhuǎn)換和格式化類庫,可以把它視為具有相稱性,因為它的API表層是緊湊的,它和類庫的目的明確的匹配。Moment.js用于處理日期,它的API提供了便利的功能用來處理javascript Date對象:
 

moment().format('dddd');
moment().startOf('hour').fromNow();

2015624141630224.png (634×270)

 對于一個有針對性的類庫,像Moment.js,保持API的專注和簡單是非常重要的。對于更大和更廣闊的類庫,API的大小應(yīng)當(dāng)能夠反映出類庫自身的能力。


Underscore來說,作為一個多種用途功效的庫,它提供大量便利的函數(shù),這些被設(shè)計的函數(shù)是用來幫助開發(fā)者處理javascript集合,數(shù)組,函數(shù)和對象。它的API量遠(yuǎn)遠(yuǎn)超過像Moment.js這樣的庫,但是Underscore也是成比例的,因為庫中每個函數(shù)都有自己的功效目的。考慮下面的例子,前兩個例子用Underscore來處理數(shù)組,最后一個來處理字符串。
 

_.each(["Todd", "Burke", "Derick"], function(name){
 alert(name);
});
 
_.map([1, 2, 3], function(num){
 return num * 3;
});
 
_.isNumber("ten"); // False

2015624141653770.png (634×272)

 當(dāng)一個庫逐漸成長的過程中,維持比例的挑戰(zhàn)變的更加具有嚴(yán)峻。為了確保添加進(jìn)庫的每個功能和函數(shù)都能加強庫的目的,需要更多的考慮投入。對于一個大的庫像kendo UI,易擴展性的目的并不是意味著我們需要往庫中添加每個特性。對于一個像kendo一樣大的庫,功能對象和特性應(yīng)該證明它們的價值才能被庫包含。例如, Kendo UI's JavaScript 基于DataSource, 它能夠被用來查詢和處理遠(yuǎn)程數(shù)據(jù)。
 

var dataSource = new kendo.data.DataSource({
 transport: {
  read: {
   url: "http://search.twitter.com/search.json",
    dataType: "jsonp",
    data: { q: "API Design" }
   }
  },
 schema: { data: "results" }
});

初看第一眼,它好像一個習(xí)以為常的數(shù)據(jù)源,感覺超出了庫本身的基本目的。然而今天網(wǎng)站的裝飾都需要動態(tài)數(shù)據(jù)的支持。數(shù)據(jù)源的引入允許Kendo UI可以使用一個穩(wěn)定,并舒適的范式在整個庫范圍內(nèi)來解決遠(yuǎn)程數(shù)據(jù)。
 

讓一個API轉(zhuǎn)變?yōu)橐粋€名符其實的javascript垃圾抽屜,對于一個庫的擴展這是危險的,但對于庫來說,這也不是唯一的危險。掉入一個不讓你的API伴隨著庫的成長圈套,或者由于某些人為原因,限制你庫的大小,這些同樣都是危險的!

不處理API增長最好的一個例子是jQuery的 jQuery or $ function。和我一樣有成千上萬的開發(fā)者喜歡jQurey, 但它的門戶方法是有點亂的,從DOM選擇到在jQuery對象中包含DOM元素,這個方法提供了超過11個獨立超負(fù)荷選擇方式。

就大部分而言,有些不是十分相關(guān)的特性被硬塞進(jìn)同一個API。從全局看,jQuery是一個大的庫并且能被認(rèn)為庫比例是合理的。另一方面,當(dāng)我們嘗試將一個功能硬塞進(jìn)一個單一接口并且不考慮庫比例,jQuery方法也可以實現(xiàn)這樣的功能。

如果你發(fā)現(xiàn)你正在將一個不相干的特性強塞進(jìn)已經(jīng)存在的方法,或者正在想法設(shè)法使一個并不適合API的函數(shù)的添加合理化,你需要做的改變是松開皮帶并且讓庫呼吸。你的用戶在調(diào)用一個新的可以自我描述名字的函數(shù)時,將會更加節(jié)省時間,并且不會給另一個已經(jīng)存在的方法添加負(fù)擔(dān)。

原則 4: 強調(diào)性

在藝術(shù)作品中,強調(diào)是利用對比來使作品中某一方面脫穎而出形成一個焦點。在許多API中,焦點可能是一個通道或者類庫主要方法的錨點。另外一個關(guān)于強調(diào)性的例子可以參考“鏈接”方式或者fluent API,它通過增加強調(diào)性效果突出了類庫中心對象。jquery傾向于從許多功能演示中的強調(diào)這個對象:

$('ul.first').find('.overdue')
 .css('background-color','red')
 .end()
 .find('.due-soon')
 .css('background-color', 'yellow');

對于許多現(xiàn)代的類庫,另一個關(guān)于強調(diào)的例子是可擴展性:類庫創(chuàng)建者沒有提供的那部分,會為你提供一個工具你可以自己完成相關(guān)擴展。

一個典型的例子可以參考, 一般的擴展點可以通過數(shù)不清的插件和補充的類庫來完成:

(function($) {
 $.fn.kittehfy = function() {
  return this.each(function(idx, el) {    
   var width = el.width,
    height = el.height;
   var src= "http://placekitten.com/";
   el.src= src + width + "/" + height;
  });
 };
})(jQuery);

另一個擴展性的例子是Backbone的“extend”的函數(shù),我們已經(jīng)在本文中看到過:

var DocumentRow = Backbone.View.extend({
 tagName: "li",
 className: "row",
 events: {
  "click .icon": "open",
  "click .button.edit": "openEditDialog"
 },
 render: function() { ... }
});

2015624141715183.png (634×258)

 可擴展作為強調(diào)性的一方面是因為它讓我們意識到這樣的一個事實,已有的類庫并不意味著一切是完美的,同時也鼓勵我們擴展適合自己的類庫。當(dāng)類庫支持?jǐn)U展時,它們不僅開啟了新的用途,也使無數(shù)開發(fā)者受益于一般的用途。一個最好的例子是Backbone.Marionette框架,一個擴展于Backbone的類庫,它的目標(biāo)是“簡化大型的javascript應(yīng)用程序的結(jié)構(gòu)”。如果不是像Backbone那樣的類庫擴展,Marionette之類的類庫將變得非常復(fù)雜,甚至不可能實現(xiàn)。

API 設(shè)計:不只為庫代碼編寫者

如果你不是一位 JavaScript 庫的編寫者,而是一位 JavaScript 應(yīng)用開發(fā)者或庫的實現(xiàn)者,你可能會認(rèn)為本文中的原則并不適用于你。畢竟,我們大多數(shù)人在聽到“API”的時候,往往想到的是第三方庫,一如我在本文中的示例一樣

事實是,API ,如同其定義所言,無非就是一個提供給他人利用的隔離功能的接口。 現(xiàn)在,讓我用一句老話來強調(diào)很重要的一點:編寫模塊化的 JS 代碼是為了實用,使用的次數(shù)并不重要。


正如本文中引用的類庫,你可以把自己的javascript代碼公開接口給其他人。即使你的代碼的用戶是一小部分或內(nèi)部團(tuán)隊——甚至你構(gòu)建自己的一個私有類庫——你不必像一個公開類庫的作者那樣考慮本文中API設(shè)計原則和這些原則的實現(xiàn)。利用API設(shè)計的好處是即使只針對一個使用者,也要像對數(shù)百萬使用者一樣設(shè)計。

因為API的設(shè)計代表著對開發(fā)者的用戶體驗,它就像UI設(shè)計對于最終用戶的重要性一樣。正如我們可以通過學(xué)習(xí)一些原則和參考一些好的或者壞的例子來開發(fā)出優(yōu)秀的UI一樣,我們也可以通過同樣的方式學(xué)習(xí)到更好的API設(shè)計。應(yīng)用文中提到的四個原則,以及其他你自己發(fā)現(xiàn)的原則,可以幫助你建立出優(yōu)秀的API,并且讓用戶得到良好的體驗。

相關(guān)文章

  • 一個JavaScript變量聲明的知識點

    一個JavaScript變量聲明的知識點

    JavaScript變量聲明很簡單,但是這里也有要學(xué)習(xí)的知識點,對于JavaScript基礎(chǔ)學(xué)習(xí)很重要。
    2013-10-10
  • JavaScript中document.referrer的用法詳解

    JavaScript中document.referrer的用法詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript中document.referrer的用法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 簡單了解JavaScript作用域

    簡單了解JavaScript作用域

    這篇文章主要介紹了JavaScript作用域的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • javascript基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換教程示例

    javascript基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換教程示例

    總結(jié)了javascipt中的數(shù)據(jù)類型之后,我們就了解了,prompt()接收的全是字符串,因此數(shù)據(jù)類型轉(zhuǎn)換就顯得尤為重要,一起來學(xué)習(xí)一下吧
    2022-03-03
  • 簡單談?wù)刯avascript中this的隱式綁定

    簡單談?wù)刯avascript中this的隱式綁定

    在JavaScript中,this 的概念比較復(fù)雜。除了在面向?qū)ο缶幊讨?,this 還是隨處可用的。這篇文章介紹了this的隱式綁定,希望大家能夠喜歡。
    2016-02-02
  • js限制文本框輸入長度兩種限制方式(長度、字節(jié)數(shù))

    js限制文本框輸入長度兩種限制方式(長度、字節(jié)數(shù))

    在實際應(yīng)用中根據(jù)需要會用到文本框限制字符長度,以些新手朋友有們可能還不清楚如何應(yīng)付,本人搜集整理了一些常用技巧,曬出來和大家分享一下,希望可以幫助你們
    2012-12-12
  • JavaScript 基本概念

    JavaScript 基本概念

    本文續(xù)上文,繼續(xù)講述javascript的基礎(chǔ),分為一下幾個部分:區(qū)分大小寫、標(biāo)示符、注釋、語句、關(guān)鍵字和保留字,希望能給大家一些新的認(rèn)識。
    2015-01-01
  • Ajax的概述與實現(xiàn)過程

    Ajax的概述與實現(xiàn)過程

    Ajax是Asynchronous JavaScript XML的簡寫,不是一門新技術(shù),而是對現(xiàn)有技術(shù)的綜合利用。本文詳細(xì)介紹了Ajax的概述與具體實現(xiàn)方法。有需要的朋友可以看下,希望對你有所幫助
    2016-11-11
  • 好好了解一下Cookie(強烈推薦)

    好好了解一下Cookie(強烈推薦)

    Cookie是由服務(wù)器端生成,發(fā)送給User-Agent,瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內(nèi),下次請求同一網(wǎng)站時就發(fā)送該Cookie給服務(wù)器,對cookie知識感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • JavaScript學(xué)習(xí)筆記之JS對象

    JavaScript學(xué)習(xí)筆記之JS對象

    這篇文章向我們詳細(xì)介紹了javascript中的對象,包括默認(rèn)對象、數(shù)組對象、字符串對象、自定義對象,并通過示例對這4中對象做了對比分析,推薦給大家。
    2015-01-01

最新評論