亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

API的最佳表現(xiàn)形式

SmallBoyO / 2378人閱讀

摘要:從一般的編程理論中也明確闡述,類變量或稱為數(shù)據(jù)應(yīng)該用訪問方法如和進(jìn)行封裝,以保證數(shù)據(jù)的完整性和一致性。當(dāng)類變量或稱數(shù)據(jù)只能通過類函數(shù)訪問時,正好符合中的類定義。

引言

Werner Vogels在主題演講上簡要敘述了Lambda設(shè)計思路的由來。

Vogels首先拋出一個問題:什么是云計算的根本(primitives)?

答案:云計算是一個執(zhí)行環(huán)境。

Vogels再拋出第二個問題:什么是應(yīng)用的根本?

答案:函數(shù)(functions,即業(yè)務(wù)邏輯的載體)+數(shù)據(jù)(data,即跟業(yè)務(wù)相關(guān)的輸入與輸出),以及這兩者之間的交互——即事件(events。常見的事件如增加、變更、刪除等)。

換言之,對于一個應(yīng)用來說,除了functions、data、events這三個東西是根本之外,其他無論什么代碼和框架,無非都是膠水或者UI罷了。

既然如此,理想的情況是用最少的時間寫膠水,將做多的時間投入到應(yīng)用的核心當(dāng)中。

而最常見的膠水代碼,就是觸發(fā)器(trigger):當(dāng)發(fā)生一個事件(event)時,執(zhí)行某個函數(shù)(function),輸出新的數(shù)據(jù)(data)。Vogels以Excel表單為例:在一個表單當(dāng)中,一個單元格數(shù)值的變更,觸發(fā)總和列對應(yīng)單元格數(shù)值的變更,就是一個事件觸發(fā)函數(shù)將新的變量納入計算得出新的數(shù)值的過程。這個過程是自動的,還可以是并發(fā)的,即一處變更同時觸發(fā)多個函數(shù)。

基于這個思路,AWS做了Lambda服務(wù)。

從編程語言角度審視Vogels的觀點

在編程語言中,函數(shù)(functions)+數(shù)據(jù)(data)+事件(events)的有機(jī)組合就是類(class)。在ES6中、類(class)的主體只能包含方法,不能包含數(shù)據(jù)屬性。從一般的編程理論中也明確闡述,類變量或稱為數(shù)據(jù)(data)應(yīng)該用訪問方法(如getter和setter)進(jìn)行封裝,以保證數(shù)據(jù)的完整性和一致性。

Vogels以Excel表單舉例,說明當(dāng)數(shù)據(jù)(data)變化后,觸發(fā)函數(shù)執(zhí)行;更多人會用react的stats舉例,當(dāng)數(shù)據(jù)(data)變化后,觸發(fā)DomTree刷新。這是受數(shù)據(jù)驅(qū)動編程的影響?我只能理解為流派之爭。怎么著你都得寫個listener吧?listener也是函數(shù)!

回到正題,既然應(yīng)用的本質(zhì)都是一個類(class),當(dāng)然最好的API接口也是一個類(class)。當(dāng)類變量或稱數(shù)據(jù)(data)只能通過類函數(shù)訪問時,正好符合ES6中的類(class)定義。ES6中的類(class)只包含類函數(shù)(functions),其中一部分函數(shù)(functions)被其它程序直接調(diào)用,另一個部分函數(shù)(functions)被事件激活調(diào)用。

API類(class)是單例對象(singleton object)

你new與不new,API單例對象都在那里,不增也不減。

這里借用scala語言中對單例對象的敘述:“類和單例對象間的一個差別是,單例對象不帶參數(shù),而類可以。因為你不能用new關(guān)鍵字實例化一個單例對象,你沒機(jī)會傳遞給它參數(shù)。每個單例對象都被作為由一個靜態(tài)變量指向的虛構(gòu)類:synthetic class的一個實例來實現(xiàn),因此它們與Java靜態(tài)類有著相同的初始化語法。Scala程序特別要指出的是,單例對象會在第一次被訪問的時候初始化?!?/p>

與Java語言一樣,在ES6中也沒有單例對象(singleton object)的定義方法。而要記住的是對每一個調(diào)用接口的程序而言,實現(xiàn)的接口(API)類是個單例對象。

API類(class)三個基本問題(直接上結(jié)論)

跨域訪問 - 支持

瀏覽器中調(diào)用 - 支持

nodejs中調(diào)用 - 支持

編寫第一個接口API類 - HelloWorld.es6
class HelloWorld {
    constructor() {
        this.greeting = "Hello World!";
    }
    welcome(callback) {
        callback(null, this.greeting);
    }
}

export default HelloWorld;

使用babel轉(zhuǎn)成ES5

$ babel HelloWorld.es6 -o HelloWorld.js

現(xiàn)在要把你寫好的class發(fā)布出去了!

# npm install nodeway -g
# nodeway --class HelloWorld.js --host 0.0.0.0 --port 8080 --docs . &

這句的意思是啟動一個Web Server,把HelloWorld.js發(fā)布出去。好了,現(xiàn)在剩下的就是測試了。

編寫測試程序 index.html



    
    HelloWorld
    




用瀏覽器訪問你寫的這個index.html文件,就可以看到你發(fā)布成功了。

在HelloWorld.es6實現(xiàn)事件(events),需要增加兩個函數(shù)emit和on。(這段只是原理性展示,實際代碼不要這樣寫)
class HelloWorld {
    constructor() {
        this.greeting = "Hello World!";
        // 以下是新添加代碼,6秒發(fā)一個"again"事件
        this.events = {};
        setInterval(() => {
            this.emit && this.emit("again", null, this.greeting);
        }, 6000);
        // 以上是新添加代碼
    }
    // 以下是新添加代碼
    on(eventName, fn) {
        this.events[eventName] = fn;
    }
    emit() {
        let args = Array.from(arguments),
            fn = this.events[args.shift()];
        fn && fn.apply(this, args);
    }
    // 以上是新添加代碼
    welcome(callback) {
        callback(null, this.greeting);
    }
}

export default HelloWorld;
一點基礎(chǔ)知識 - ES6原型鏈

為了不暴露emit代碼,將其放到函數(shù)on中(參考ES6原型鏈)。
class HelloWorld {
    constructor() {
        this.greeting = "Hello World!";
        // 以下是新添加代碼,6秒發(fā)一個"again"事件
        this.events = {};
        setInterval(() => {
            this.emit && this.emit("again", null, this.greeting);
        }, 6000);
        // 以上是新添加代碼
    }
    // 以下是新添加代碼
    on(eventName, fn) {
        this.events[eventName] = fn;
        this.constructor.prototype.emit ||
        (this.constructor.prototype.emit = function() {
            let args = Array.from(arguments),
                fn = this.events[args.shift()];
            fn && fn.apply(this, args);
        });
    }
    // 以上是新添加代碼
    welcome(callback) {
        callback(null, this.greeting);
    }
}

export default HelloWorld;
修改測試程序 index.html,實現(xiàn)事件(events)。



    
    HelloWorld
    




看執(zhí)行結(jié)果吧!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/79990.html

相關(guān)文章

  • 2017年2月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經(jīng)典排序算法(帶動圖演示) 為什么知乎前端圈普遍認(rèn)為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細(xì)注釋|供新手學(xué)習(xí)使用 擴(kuò)展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉(zhuǎn)換...

    lily_wang 評論0 收藏0
  • 2017年2月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經(jīng)典排序算法(帶動圖演示) 為什么知乎前端圈普遍認(rèn)為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細(xì)注釋|供新手學(xué)習(xí)使用 擴(kuò)展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉(zhuǎn)換...

    chengjianhua 評論0 收藏0
  • 2017年2月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經(jīng)典排序算法(帶動圖演示) 為什么知乎前端圈普遍認(rèn)為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細(xì)注釋|供新手學(xué)習(xí)使用 擴(kuò)展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉(zhuǎn)換...

    Anonymous1 評論0 收藏0
  • 2017年2月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經(jīng)典排序算法(帶動圖演示) 為什么知乎前端圈普遍認(rèn)為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細(xì)注釋|供新手學(xué)習(xí)使用 擴(kuò)展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉(zhuǎn)換...

    dreamtecher 評論0 收藏0
  • 最佳實踐

    摘要:什么是重構(gòu)字面上的理解重新組織結(jié)構(gòu)為什么要重構(gòu)原來的結(jié)構(gòu)是什么樣子的有什么問題函數(shù)邏輯結(jié)構(gòu)條件判斷循環(huán)操作包含關(guān)系集合關(guān)系非關(guān)系可擴(kuò)展性差新的變化不能被靈活處理對象強(qiáng)耦合可復(fù)用性差重復(fù)代碼多性能消耗太多隨著技術(shù)發(fā)展新的好特性如何重構(gòu)知道問題 什么是重構(gòu)? 字面上的理解: 重新組織結(jié)構(gòu) 為什么要重構(gòu)? 原來的結(jié)構(gòu)是什么樣子的?有什么問題? 1. 函數(shù)邏輯結(jié)構(gòu)[條件判斷、循環(huán)操作]: 包...

    iamyoung001 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<