Group

Group是ToolMoldLine的集合,目的是讓Packhouse可分類與套件化,是所有流程的第一步,並可以接收一些對外部的數據。

let coop = Packhouse.createGroup()
let math = Packhouse.createGroup({
    alias: 'math',
    module: false,
    secure: true,
    merger: {
        coop: coop,
        coop2: () => coop // 實現懶加載
    },
    create: function(options) {
        this.foo = 'bar'
    }
})

Options

Alias

  • string
  • optional

因為Group本身是沒有帶名字的,但在堆疊的追蹤上會以匿名函數出現,Alias就是為了有可視的Function Name而生。

AliasGroup,可以看見 Alias_ToolName_ActionName,例如:math_double_direct:

Uncaught TypeError: some error
    at [math_double_direct] (<anonymous>:1228:24)

沒有Alias則以no_alias_group取代:

Uncaught TypeError: some error
    at [no_alias_group_double_direct] (<anonymous>:1228:24)

Create

  • function
  • optional

在初始化Group的過程中會被呼叫,並以this建立自己的屬性,可被底下的Tool給讀取。

注意create不要使用箭頭函數,這會導致this指向錯誤。

math.addTool({
    name: 'getFoo',
    action(system, error, success) {
        console.log(system.group.foo) //bar
    }
})

Module

  • boolean
  • optional

宣告alonegroup仍然可以被factory使用,但需要注意的是當宣告alone或引用至factory都只會觸發一次create的行為,此時createoptions只會接受第一次被宣告的狀態,這樣會導致整個系統引用混亂。

Module的目的就是為了防止錯誤引用,宣告為true後該Group不能進入factory也不接受optnios

Secure

  • boolean
  • optional

建立安全模式,在安全模式下不會允許tool更改group的參數。

math.addTool({
    name: 'secure',
    action(system, error, success) {
        system.group.foo = 'foo' // 報錯
    }
})

Merger

  • object
  • optional

Merger是一個引用另一個Group的接口。

你可以直接傳入Group或是藉由一個function回傳Group,後者可以避免一些沒有使用到卻加載的情形。

coop.addTool({
    name: 'multiply',
    action(number, coefficient, system, error, success) {
        success(number * coefficient)
    }
})

math.addTool({
    name: 'double',
    action(number, system, error, success) {
        success(system.coop('coop').tool('multiply').direct(number, 2))
    }
})

Alone

基本上group是由factory驅動的,但group仍可以藉由alone獨立運行。

let alone = math.alone()
console.log(alone.tool('double').direct(10)) // 20

創造

大多數的功能都是由group所創建的,創建方法如下:

Tool

group.addTool(options)
group.addTool(name, () => { return options }) //lazy
group.addTools([options, options, ...])
group.addTools({name: optnios, name2: options, ...})

Mold

group.addMold(options)
group.addMolds([options, options, ...])
group.addMolds({name: optnios, name2: options, ...})
group.addMolds({name: () => { return optnios }, name2: () => { return optnios }, ...}) // lazy

Line

group.addLine(options)
group.addLine(name, () => { return options }) //lazy
group.addLines([options, options, ...])
group.addLines({name: optnios, name2: options, ...})
group.addLines({name: () => { return optnios }, name2: () => { return optnios }, ...}) // lazy

Profile 🔬

可以獲取Group的細節,或許用於建立測試與文件的接口。

目前為測試功能,內部狀態可能會改變。

group.getProfile()