限界上下文:從多個方面細講

一、什麼是限界上下文

限界上下文即是在軟件開發過程中劃分出的一個邊界,用以確定各種角色的職責和權限範圍等。它定義了系統中各個子系統、模塊或對象之間的關係及其可訪問的數據量和範圍,減少了模塊之間的交互,使代碼更加可維護和可重用。

限界上下文常見的應用場景是DDD(領域驅動設計)中,在實現DDD中的聚合和實體時,我們需要為每個聚合和實體定義明確的限界上下文。

下面是一個使用DDD實現的購物車系統代碼示例:

class ShoppingCart {
    constructor() {
        this.cartItems = [];
    }

    addItem(item, user) {
        if(user.isVip) {//限制只有VIP才能購買該商品
            if(item.stock > 0) {//限制庫存不足
                let existItem = findItemInCart(item.id);
                if(existItem) {
                    existItem.amount ++;
                } else {
                    this.cartItems.push({
                        id: item.id,
                        name: item.name,
                        amount: 1,
                        price: item.price
                    })
                }
            }
        }
    }

    findItemInCart(id) {
        return this.cartItems.find(item => item.id === id);
    }

    getCartTotalPrice() {
        return this.cartItems.reduce((total, item) => {
            return total + item.price * item.amount;
        }, 0)
    }
}

class User {
    constructor(name, isVip) {
        this.name = name;
        this.isVip = isVip;
    }
}

class Item {
    constructor(id, name, price, stock) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
}

const cart = new ShoppingCart();
const user = new User('張三', true);
const item = new Item('001', '電視機', 2399, 20);
cart.addItem(item, user);

二、限界上下文的作用

限界上下文的作用在於劃分系統中各個子系統、模塊或對象之間的關係及其可訪問的數據量和範圍,從而減少了模塊之間的交互,使代碼更加可維護和可重用。

具體的,它能夠:

1、定義某個對象的作用範圍,以及在該範圍內對數據修改和讀取的限制,減少代碼中錯誤的發生,提升代碼的健壯性。

2、對於某些對象的訪問需要授權的情況,限定訪問特定的限界上下文,從而提供了更加嚴格和精確的安全控制手段。

3、能夠清晰地描述業務問題,並支持業務和技術分離,減少代碼之間的依賴關係。

三、限界上下文的實現

在實現限界上下文時,我們需要考慮以下幾點:

1、確定限界上下文的範圍,必須清楚地知道每個對象所屬性的上下文,避免對象的依賴混亂。

2、實現限界上下文必須符合領域驅動設計(DDD)的原則,即圍繞業務領域建模,而不是圍繞技術框架建模。

3、限界上下文的劃分必須有明確的目的,且必須與具體業務需求相符。

下面展示一個使用限界上下文來實現的數據訪問對象:

class UserDAO {
    constructor(client, ctx) {
        this.client = client;
        this.tableName = ctx + '_users';
    }

    getById(id) {
        return this.client.query(`SELECT * FROM ${this.tableName} WHERE id=${id}`);
    }

    create(user) {
        return this.client.query(`INSERT INTO ${this.tableName} VALUES ${user}`);
    }
}

const mysqlClient = new MysqlClient();

const userDao = new UserDAO(mysqlClient, 'blog'); //限制只能操作blog上下文的User對象

userDao.create({id:1, name:'張三', age: 18}); //MysqlClient寫法可以參考Mysql官方文檔

四、限界上下文的注意事項

在實際的開發中,我們需要注意以下幾個方面:

1、限界上下文的劃分應該盡量避免出現交叉依賴關係,否則將會導致限界上下文間的耦合性較高,使得系統的可維護性和可擴展性下降。

2、限界上下文的名稱應該清晰、簡潔,並且避免出現歧義,以避免在設計中出現與需求不符的問題。

3、在定義限界上下文時,必須避免過度約束對象的行為,防止出現對象行為不足或者行為過度的情況。

綜上,限界上下文可以為我們構建性能高、可維護性強的應用程序提供指南,並提供了設計領域對象的一種規範化的方法。在使用的過程中,我們需要結合 DDD 的原則,將限界上下文分配給正確的領域對象。只有合理地使用限界上下文,才能構建更加健壯和高效的系統。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/198210.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 07:30
下一篇 2024-12-04 07:31

相關推薦

發表回復

登錄後才能評論