2021年4月3日 星期六

Inversion of control 控制反轉

控制反轉:

也是降低物件間耦合度的一種原則。
當A class 中需要 B class 時,此時 B 是 A 的依賴。
一般方法是在 A 中 new B,
使用控制反轉原則時,則把獲得 B 的控制反轉給外部,
或某控制器。

即是在外部準備好 B,等需要時傳入,或再取得。

常見方法:

Dependency Injection 依賴注入
    基於介面:實現特定介面供外部容器注入依賴。    
    基於set方法:實現 set 方法供外部呼叫,傳入依賴。
    基於建構函式:在建構式傳入依賴。

Dependency Lookup   依賴搜尋
    使用框架提供的方法取的依賴。

Golang tag

 Golang struct 可使用 tag。

內建tag:

json:json.Marshal / json.Unmarsh 使用

type Item struct{

    Price int `json:"price"`    //field name will be marshal / unmarshal to price 

}


自訂tag:

可用來擴充 struct field 資料,設定預設值。

type Item struct{

    Price int `json:"price" default:"10"`

}

func (I *item) GetPrice() int {

v := reflect.ValueOf(*I)
        tag := v.Type().Field(0).Tag.Get("default")

        if tag != "" {

i,_:= strconv.Atoi(tag)
            return i
        }

        return -1

}

可用來判斷合法值。

type Item struct{

    Price int `json:"valid" :"10-100"`

}

func (I *Item)GetDefaultPrice()int{

      v:=reflect.ValueOf(I)

       tag:=v.Type().Field(0).Tag.Get("valid")

        if tag!=""{
            val,_:=strconv.Atoi(tag)
            result:=strings.Split(tag,"-")    
            min,_:=strconv.Atoi(result[0])
            max,_:=strconv.Atoi(result[1])

             if val>=min && val<=max{
                return true
            }
                return false

         }
         return false
}