设计理念
- 不可变数据:使用
Object.freeze
、Object.assign
或展开运算符...
来创建不可变数据结构,确保数据在传递和处理过程中不会被意外修改,提高代码的可预测性。
- 函数组合:将复杂业务逻辑拆分成多个小的纯函数,然后通过函数组合的方式将这些函数组合起来,实现复杂功能,提高代码的可维护性和可测试性。
架构设计
- 订单创建:创建一个纯函数
createOrder
,该函数接收订单相关数据,返回一个不可变的订单对象。
- 支付:创建一个纯函数
processPayment
,该函数接收订单对象和支付信息,处理支付逻辑,并返回支付结果。
- 物流跟踪:创建一个纯函数
trackShipping
,该函数接收订单对象,返回物流跟踪信息。
- 组合函数:创建一个主函数
handleOrder
,通过函数组合的方式将上述函数组合起来,处理整个订单流程。
关键代码示例
// 创建订单
const createOrder = (orderData) => {
return Object.freeze({
...orderData,
orderId: Math.random().toString(36).substr(2, 9),
status: 'created'
});
};
// 处理支付
const processPayment = (order, paymentInfo) => {
// 模拟支付逻辑
if (paymentInfo.amount >= order.totalPrice) {
return Object.freeze({
...order,
status: 'paid'
});
} else {
throw new Error('Insufficient funds');
}
};
// 物流跟踪
const trackShipping = (order) => {
// 模拟物流跟踪逻辑
return `Shipping status for order ${order.orderId}: In transit`;
};
// 组合函数
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
const handleOrder = compose(
trackShipping,
processPayment,
createOrder
);
// 使用示例
const orderData = {
customer: 'John Doe',
totalPrice: 100
};
const paymentInfo = {
amount: 100
};
try {
const result = handleOrder(orderData, paymentInfo);
console.log(result);
} catch (error) {
console.error(error.message);
}
代码解释
- createOrder:接收订单数据,使用展开运算符
...
创建一个新的对象,并添加orderId
和status
字段,最后使用Object.freeze
冻结对象,确保其不可变。
- processPayment:接收订单对象和支付信息,检查支付金额是否足够,若足够则更新订单状态为
paid
,并返回新的不可变订单对象;否则抛出错误。
- trackShipping:接收订单对象,模拟物流跟踪逻辑并返回物流信息。
- compose:一个函数组合工具,将多个函数从右到左组合起来,实现复杂业务逻辑的组合。
- handleOrder:通过
compose
函数将trackShipping
、processPayment
和createOrder
组合起来,形成完整的订单处理流程。
- 使用示例:创建订单数据和支付信息,调用
handleOrder
函数处理订单,并根据结果进行相应处理。