Packhouse

在Serverless的可行性被確認後,人們便開始嘗試使用AWS Lambda作為API的邏輯處理層,我在工作中也得到了同樣的挑戰,我天真的開始建構物件,封裝所有的程式碼,但很快問題就來了,在以微服務為主的Serverless,呼叫服務的行為早就是封裝後的結果了,我們更需要的是更彈性的處理這些資料。

安裝

npm

npm i packhouse

web

<script src="https://khc-zhihao.github.io/Packhouse/dist/index.js"></script>
<script>
    let factory = Packhouse.createFactory()
</script>

webpack

import Packhouse from 'packhouse'
let factory = Packhouse.createFactory()

nodejs

let Packhouse = require('packhouse')
let factory = Packhouse.createFactory()

為何使用 Packhouse ?

Packhouse能夠統一IO模式

JS回傳條件狀態不明卻長期被詬病,是同步?非同步?還是promise

別想這麼多了,一次滿足不就行了。

更細微的調用

如果每個行為都能獨立呼叫,就可以更深入地去測試錯誤訊息。

通用模組設計

Group可以獨立的使用,可以在各專案模組化移動。


第一支Function

以下分別是標準實踐總和與使用Packhouse實踐的差異:

基本方法

function sum(n1, n2) {
    return n1 + n2
}

Packhouse

let factory = Packhouse.createFactory()
let math = Packhouse.createGroup()
math.addTool({
    name: 'sum',
    action(n1, n2, system, error, success) {
        success(n1 + n2)
    }
})

factory.addGroup('math', math)
let sum = factory.tool('math', 'sum').direct
console.log(sum(10, 10)) // 20

使用Packhouse複雜的跟鬼一樣,效能和建立成本都被基本方法打成白癡,但Packhouse默默地對函數做了封裝,從以下方法看見差異:

基本方法

function sum(n1, n2) {
    if (typeof n1 === 'number' && typeof n2 === 'number') {
        return n1 + n2
    } else {
        throw new Error('param not a number.')
    }
}
sum(10, '10') // throw 'param not a number.'

Packhouse

let fact = Packhouse.createFactory()
let math = Packhouse.createGroup()
math.addTool({
    name: 'sum',
    molds: ['number', 'number'],
    action(n1, n2, system, error, success) {
        success(n1 + n2)
    }
})
fact.addGroup('math', math)
let sum = fact.tool('math', 'sum').ng(e => console.error(e)).direct
sum(10, '10') // param 1 not a number.

是的,基本方法除了throw error之外沒有其他方法,除非你賦予一個callback讓人們混淆這支function是否為非同步的,但Packhouse卻提供了可視的參數型別和錯誤乘載,在沒有宣告ng()的形況下sum會擲出error,但宣告後即呼叫callback。

Functional Programming

Packhouse能夠幫助建立高細粒度的程式架構,但也因此充斥著陷阱,如果能夠遵照函數式程式設計的法則,將能夠協助避開地雷。

JS函數式編程指南或許可以提供幫助。