Բիզնեսի սահմանափակումները կարևոր դեր են խաղում մոդելի ձևավորման մեջ: Նրանք հաճախ հայտնվում են անուղղակիորեն, և դրանց բացահայտ արտահայտումը կարող է զգալիորեն բարելավել դիզայնը:

Դոմենների վրա հիմնված նախագծման մեջ (DDD) սովորական է բիզնեսի սահմանափակումները դասավորել մեթոդների մեջ՝ ապահովելու համար, որ դրանք հետևողականորեն կիրառվեն հավելվածի ողջ ընթացքում:

Օրինակ

Ահա մի օրինակ, թե ինչպես կարող եք հաշվի առնել բիզնեսի սահմանափակումը Գոլանգի մեթոդի մեջ.

Նախքան գործոնը՝

type Order struct {
    ID          int
    CustomerID  int
    TotalAmount float64
}

func (o *Order) AddItem(item Item) error {
    if o.TotalAmount+item.Price > 1000 {
        return fmt.Errorf("order total amount cannot exceed 1000")
    }
    // add item to order
    o.TotalAmount += item.Price
    return nil
}

Այս օրինակում մենք ունենք Order struct, որն ունի AddItem մեթոդ: AddItem մեթոդը վերցնում է Item-ը որպես պարամետր և ավելացնում այն ​​պատվերին: Այնուամենայնիվ, նախքան տարրը ավելացնելը, մեթոդը ստուգում է, թե արդյոք ապրանքը ավելացնելու դեպքում պատվերի ընդհանուր գումարը կգերազանցի 1000-ը: Եթե այդպես լինի, մեթոդը վերադարձնում է սխալ:

Հիմա եկեք վերամշակենք այն:

Հետո գործոն՝

type Order struct {
    ID          int
    CustomerID  int
    TotalAmount float64
}

func (o *Order) AddItem(item Item) error {
    if err := o.checkTotalAmount(item.Price); err != nil {
        return err
    }

    // add item to order
    o.TotalAmount += item.Price
    return nil
}

func (o *Order) checkTotalAmount(price float64) error {
    if o.TotalAmount+price > 1000 {
        return fmt.Errorf("order total amount cannot exceed 1000")
    }
    return nil
}

Այս թարմացված տարբերակում մենք ունենք նոր մեթոդ, որը կոչվում է checkTotalAmount, որը ստուգում է, թե արդյոք պատվերին որևէ ապրանք ավելացնելու դեպքում ընդհանուր գումարը կգերազանցի 1000-ը:

Սահմանափակումների ստուգումն իր սեփական մեթոդով բաժանելը կոդն ավելի մոդուլային է դարձնում և ավելի հեշտ է պահպանել: Եթե ​​ապագայում մեզ անհրաժեշտ է փոխել սահմանափակումը, մենք միայն պետք է փոփոխենք checkTotalAmount մեթոդը: