Smalltalk 语言 类层次重构实战 重构电商类层次

Smalltalk阿木 发布于 2025-05-27 9 次阅读


Smalltalk【1】 语言类层次重构实战:电商类层次重构解析

在软件开发中,类层次结构【2】是软件设计的重要组成部分。良好的类层次结构能够提高代码的可读性、可维护性和可扩展性。本文将以电商系统【3】为例,使用 Smalltalk 语言进行类层次重构,探讨如何优化电商类层次结构,提高系统的整体质量。

电商系统类层次现状

在电商系统中,常见的类层次结构可能包括以下几类:

1. 商品类(Product):表示电商系统中的商品。
2. 订单类(Order):表示用户下单的订单信息。
3. 用户类(User):表示电商系统中的用户。
4. 购物车类(Cart):表示用户的购物车。
5. 支付类(Payment):表示支付相关的操作。

以下是一个简单的电商系统类层次结构示例:

smalltalk
Product subclass: Product
instanceVariableNames: 'name price quantity'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

name: 'Unnamed Product'.
price: 0.
quantity: 0.

initialize: aName
| price quantity |
name := aName.
price := 100.
quantity := 10.

Order subclass: Order
instanceVariableNames: 'user products'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

user: nil.
products: nil.

initialize: aUser
user := aUser.
products := OrderedCollection new.

User subclass: User
instanceVariableNames: 'name email'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

name: 'Unnamed User'.
email: 'unnamed@example.com'.

initialize: aName
name := aName.
email := aName asString append: '@example.com'.

Cart subclass: Cart
instanceVariableNames: 'user products'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

user: nil.
products: nil.

initialize: aUser
user := aUser.
products := OrderedCollection new.

Payment subclass: Payment
instanceVariableNames: 'order amount'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

order: nil.
amount: 0.

initialize: anOrder
order := anOrder.
amount := 0.

类层次重构实战

1. 避免过度继承

在上述类层次中,`Product`、`Order`、`User`、`Cart` 和 `Payment` 类都直接继承自 `Object` 类。这种结构可能导致过度继承,使得类之间的关系变得复杂。

重构方案:

将 `Object` 类作为基类,创建一个更通用的电商基类 `ECommerceEntity【4】`,然后让其他类继承自这个基类。

smalltalk
ECommerceEntity subclass: ECommerceEntity
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

initialize
super initialize.

2. 提高封装性【5】

在 `Product` 类中,`name`、`price` 和 `quantity` 是实例变量【6】,但它们没有提供足够的封装性。例如,没有提供修改这些属性的方法。

重构方案:

为 `Product` 类添加 `setName: aName`、`setPrice: aPrice` 和 `setQuantity: aQuantity` 等方法,以提供对实例变量的封装。

smalltalk
Product subclass: Product
instanceVariableNames: 'name price quantity'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

name: 'Unnamed Product'.
price: 0.
quantity: 0.

initialize: aName
| price quantity |
name := aName.
price := 100.
quantity := 10.

setName: aName
name := aName.

setPrice: aPrice
price := aPrice.

setQuantity: aQuantity
quantity := aQuantity.

3. 使用组合【7】而非继承

在 `Order` 类中,`products` 是一个 `OrderedCollection【8】`,它直接包含 `Product` 对象。这种设计可能导致 `Order` 类与 `Product` 类之间的耦合。

重构方案:

使用组合而非继承,将 `Product` 类作为 `Order` 类的成员变量,而不是直接包含在 `Order` 类的实例变量中。

smalltalk
Order subclass: Order
instanceVariableNames: 'user products'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

user: nil.
products: nil.

initialize: aUser
user := aUser.
products := Collection new.

addProduct: aProduct
products add: aProduct.

4. 引入接口【9】和抽象类【10】

为了提高代码的可扩展性和可维护性,可以引入接口和抽象类。

重构方案:

创建一个 `PaymentProcessor【11】` 接口,定义支付相关的操作,然后让 `Payment` 类实现这个接口。

smalltalk
PaymentProcessor interface: PaymentProcessor
paymentForOrder: anOrder.

Payment subclass: Payment
implements: PaymentProcessor
instanceVariableNames: 'order amount'
classVariableNames: ''
poolDictionaries: ''

category: 'E-commerce'

order: nil.
amount: 0.

initialize: anOrder
order := anOrder.
amount := 0.

paymentForOrder: anOrder
"Implement payment logic here."

总结

通过上述重构,我们优化了电商系统的类层次结构,提高了代码的可读性、可维护性和可扩展性。在实际开发中,类层次重构是一个持续的过程,需要根据项目的具体需求和变化不断进行调整和优化。