合约服务架构-OOP 方式

发布于:2025-09-01 ⋅ 阅读:(14) ⋅ 点赞:(0)


前言

创建的合约服务架构,典型的**面向对象编程(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?: boolean
  expectedChainId?: number
  // ...
}

🏛️ 设计模式的应用

架构使用了多种经典设计模式:

1. 工厂模式 (Factory Pattern)

class ContractServiceFactory {
  static register<T>(name: string, ServiceClass: new () => T): T {
    // 工厂负责创建和管理实例
  }
}

2. 单例模式 (Singleton Pattern)

// 确保每种服务只有一个实例
let giftContractService: GiftContractService | null = null

export 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 四大特性:封装、继承、多态、抽象
应用了多种设计模式:工厂、单例、模板方法
提供了更好的代码组织:清晰的类层次结构
增强了代码的可维护性:统一的接口和实现
提高了开发效率:复用基础功能,专注业务逻辑


网站公告

今日签到

点亮在社区的每一天
去签到