文章目录
- 前言
- 🎯 经典的面向对象编程!
- 1. 🏗️ **封装 (Encapsulation)**
- 2. 🧬 **继承 (Inheritance)**
- 3. 🎭 **多态 (Polymorphism)**
- 4. 🎨 **抽象 (Abstraction)**
- 🏛️ 设计模式的应用
- 1. **工厂模式 (Factory Pattern)**
- 2. **单例模式 (Singleton Pattern)**
- 3. **模板方法模式 (Template Method Pattern)**
- 🆚 OOP vs 函数式编程对比
- 之前的函数式方法:
- 现在的面向对象方法:
- 🎯 OOP 在合约交互中的优势
- 1. **更好的代码组织**
- 2. **更强的类型安全**
- 3. **更好的可扩展性**
- 4. **更强的可测试性**
- 🏆 总结
前言
创建的合约服务架构,典型的**面向对象编程(Object-Oriented Programming, OOP)**的实现
🎯 经典的面向对象编程!
合约服务架构体现了面向对象编程的四大核心特性:
1. 🏗️ 封装 (Encapsulation)
export abstract class BaseContractService {protected config: ContractConfig // 受保护的属性// 私有方法,外部无法直接访问protected validateContractAddress(): boolean {// 内部实现细节被隐藏}// 公共接口,提供统一的访问方式public getContractInfo() {return this.config}
}
封装的好处:
- 隐藏复杂的合约调用细节
- 提供简洁的公共接口
- 保护内部状态不被外部直接修改
2. 🧬 继承 (Inheritance)
// 基类定义通用行为
export abstract class BaseContractService {protected async readContract<T>() { /* 通用逻辑 */ }protected async writeContract<T>() { /* 通用逻辑 */ }
}// 子类继承并扩展功能
export class GiftContractService extends BaseContractService {// 继承了父类的所有方法// 添加特定于礼品合约的方法async getAllTokenIds() { return this.readContract('getAllTokenIds', [...])}
}
继承的好处:
- 代码复用,避免重复实现
- 统一的基础架构
- 易于维护和扩展
3. 🎭 多态 (Polymorphism)
// 不同的服务类型,但统一的接口
const services: BaseContractService[] = [new GiftContractService(),new MemberContractService(),// 未来可能的其他合约服务...
]// 多态调用 - 同样的方法,不同的实现
services.forEach(service => {console.log(service.getContractInfo()) // 每个服务返回不同的信息
})
4. 🎨 抽象 (Abstraction)
// 抽象类定义规范,不能直接实例化
export abstract class BaseContractService {// 抽象了合约交互的通用概念
}// 接口定义规范
export interface ContractCallOptions {showNetworkCheck?: booleanexpectedChainId?: number// ...
}
🏛️ 设计模式的应用
架构使用了多种经典设计模式:
1. 工厂模式 (Factory Pattern)
class ContractServiceFactory {static register<T>(name: string, ServiceClass: new () => T): T {// 工厂负责创建和管理实例}
}
2. 单例模式 (Singleton Pattern)
// 确保每种服务只有一个实例
let giftContractService: GiftContractService | null = nullexport function getGiftContractService(): GiftContractService {if (!giftContractService) {giftContractService = new GiftContractService()}return giftContractService
}
3. 模板方法模式 (Template Method Pattern)
// 基类定义算法骨架
abstract class BaseContractService {protected async executeContract() {this.validateContractAddress() // 步骤1:验证await this.callContract() // 步骤2:调用(子类实现)this.handleResult() // 步骤3:处理结果}
}
🆚 OOP vs 函数式编程对比
之前的函数式方法:
// 分散的函数,难以管理
async function getAllTokenIds(address) { /* ... */ }
async function transferGift(address, tokenId) { /* ... */ }
async function getSuperior(address) { /* ... */ }// 使用时需要记住所有函数名和参数
const tokens = await getAllTokenIds(userAddress)
现在的面向对象方法:
// 组织良好的类结构
const giftService = new GiftContractService()
const memberService = new MemberContractService()// 直观的方法调用
const tokens = await giftService.getAllTokenIds(userAddress)
const superior = await memberService.getSuperior(userAddress)
🎯 OOP 在合约交互中的优势
1. 更好的代码组织
- 相关功能聚合在一个类中
- 清晰的职责分离
- 更容易定位和维护代码
2. 更强的类型安全
// TypeScript 提供完整的类型检查
class GiftContractService {async getAllTokenIds(address: string): Promise<bigint[]> {// 编译时类型检查}
}
3. 更好的可扩展性
// 添加新合约只需继承基类
class TokenContractService extends BaseContractService {// 自动获得所有基础功能async transfer() { return this.writeContract('transfer', [...]) }
}
4. 更强的可测试性
// 可以轻松模拟(Mock)服务
class MockGiftContractService extends BaseContractService {async getAllTokenIds() { return [1n, 2n, 3n] }
}
🏆 总结
纯正的面向对象编程的合约服务架构,它:
✅ 体现了 OOP 四大特性:封装、继承、多态、抽象
✅ 应用了多种设计模式:工厂、单例、模板方法
✅ 提供了更好的代码组织:清晰的类层次结构
✅ 增强了代码的可维护性:统一的接口和实现
✅ 提高了开发效率:复用基础功能,专注业务逻辑