文章目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95229.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95229.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95229.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 生成器模式(一个投资跟踪程序)

一个投资跟踪程序 我们考虑一个稍微简单一点的例子&#xff0c;在这个例子中&#xff0c;用一个类构造一个用户界面。假设我 们要编写一个程序来跟踪投资的效益。我们有股票、债券和基金等投资项目&#xff0c;对每一种投资项 目都要显示持有量的列表&#xff0c;这样就能够选择…

【DBCExcelConvent】CAN报文解析辅助工具之DBC与Excel互转

前言 CAN总线翻译文件DBC是整车解析过程中非常核心的一部分&#xff0c;因此为了能被各大CAN工具解析&#xff0c;它也有自己的一套编码规则。但并不是无时无刻都有条件打开该文件&#xff0c;对于工程师而言。其实比较直观和通用的大多数还是Excel表格。因此&#xff0c;为了打…

如何将iPhone日历传输到电脑

iPhone日历是i设备上一个非常出色的内置应用程序&#xff0c;可以帮助你创建、查看和管理日程或事件。对于所有iPhone用户来说&#xff0c;在iPhone日历上添加新事件非常容易。然而&#xff0c;当涉及到将日历从iPhone传输到电脑时&#xff0c;许多人可能会感到困惑&#xff0c…

TDengine 3.3.7.0 新增性能基准工具 taosgen

taosgen 工具参考手册 taosgen 是时序数据领域产品的性能基准测试工具&#xff0c;支持数据生成、写入性能测试等功能。taosgen 以“作业”为基础单元&#xff0c;作业是由用户定义&#xff0c;用于完成特定任务的一组操作集合。每个作业包含一个或多个步骤&#xff0c;并可通…

模式组合应用-组合模式

写在前面Hello&#xff0c;我是易元&#xff0c;这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误&#xff0c;欢迎大家留言指正&#xff01; 本文为设计模式间的组合使用&#xff0c;涉及代码较多&#xff0c;个人觉得熟能生巧&#xff0c;希望自己能从中学习到新…

在Ubuntu中安装配置MySql Server

1.安装MySql Server在命令行控制台执行安装命令&#xff1a;sudo apt install mysql-server安装完成后&#xff0c;因为没有root用户的密码&#xff0c;所以&#xff0c;登录不了mysql的cli。另外&#xff0c;MySql 8以上&#xff0c;lower-case-table-names默认值0&#xff0c…

Docker 40个自动化管理脚本-1 (20/40)

文章目录1. 自动化容器创建脚本2. 批量启动所有容器3. 批量停止运行中容器#!/bin/bash4. 批量删除停止的容器5. 运行容器并在退出后自动清理6. 自动重启关键容器7. 容器资源监控脚本8. 监控所有容器资源使用9. 检查所有容器日志10. 清理未使用资源脚本11. 删除悬空镜像12. 容器…

Go学习1:常量、变量的命名

golang 安装 | go-zero Documentation 在这个文档里&#xff0c;环境变量系统自动配好了&#xff08;自定义的一样&#xff09;不需要修改环境变量。 我下载的是1.25版本的。 目前使用go mod管理项目。 C的产出比太低&#xff0c;而Java和C#哲学又来源于C。 Go语言成功的项目…

2025_WSL2_Ubuntu20.04_C++20_concept 环境配置

需要使用 c20 新特性 concept 泛型约束 记录如何在 wsl2 里面配置环境&#xff0c;如果需要源工程&#xff0c;可以私发 背景&#xff1a;使用 CMakeLists.txt 配置整个工程 从官网 https://gcc.gnu.org/projects/cxx-status.html#cxx20 可以看到 concept 受 g10 支持这里注意虽…

Encoder编码器

Encoder编码器 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out){int ret -1;ret avcodec_send_frame(ctx, frame);if(ret <…

微服务-ruoyi-cloud部署

微服务 阿里 阿里nacos 注册中心&#xff0c;配置中心 spring cloud gateway网关 公共服务 阿里sentinel 面向分布式、多语言异构化服务架构的流量治理组件 阿里seata 是一款开源的分布式事务解决方案 nginx 静态资源服器 反向代理 ruoyi-cloud部署架构 VM配置 网…

Win7能看到Win10打印机但连接不上

解决方案&#xff1a;方法1.修改注册表&#xff08;适用于错误代码0x0000011b&#xff09;修改注册表&#xff08;关键步骤&#xff09;&#xff1a;许多情况下&#xff0c;这是由于Win10的一项隐私设置导致的1。在Win10电脑上&#xff0c;按 Win R&#xff0c;输入 regedit 并…

如何构建灵活、可控、可扩展的多云网络底座

在 AI 和数字化的浪潮中&#xff0c;越来越多的企业不再满足于单一云环境&#xff0c;而是同时使用 多家公有云、自建IDC、甚至边缘节点。这种多云模式虽然灵活&#xff0c;但也带来了一个新的挑战&#xff1a;如何让跨云、跨地的数据流动变得高效、安全、可控&#xff1f;答案…

幂等性设计艺术:在分布式重试风暴中构筑坚不可摧的防线

幂等性设计艺术&#xff1a;在分布式重试风暴中构筑坚不可摧的防线​​2023年某支付平台凌晨故障​​&#xff1a;由于网络抖动导致支付指令重复发送&#xff0c;系统在2分钟内处理了​​17万笔重复交易​​&#xff0c;引发​​4.2亿资金风险​​。事故根本原因&#xff1a;​…

从零开始理解NDT算法的原理及应用

1. 概述 NDT&#xff0c;全称 Normal Distributions Transform&#xff08;正态分布变换&#xff09;&#xff0c;是一种广泛使用的点云配准算法&#xff0c;它的核心思想与ICP截然不同&#xff1a;NDT不直接计算点与点之间的对应关系&#xff0c;而是通过概率模型来描述和匹配…

艾体宝案例 | 数据驱动破局:DOMO 如何重塑宠物零售门店的生存法则

某连锁宠物店店长紧盯着电脑屏幕上的Excel表格&#xff0c;手指机械地在键盘上敲击出“CtrlC/V”的组合键——这是她第17次尝试将三个不同系统的数据拼凑到一起。门店POS机导出的销售记录、会员系统的消费偏好、库存管理的临期预警&#xff0c;这些本应串联起门店运营全貌的关键…

极飞科技AI智慧农业实践:3000亩棉田2人管理+产量提15%,精准灌溉与老农操作门槛引讨论

在新疆尉犁县的棉田里&#xff0c;两架农业无人机正沿着设定航线低空飞行&#xff0c;它们掠过之处&#xff0c;传感器实时传回土壤湿度和作物长势数据——这片3000亩的棉田&#xff0c;如今只需要两名90后新农人通过手机管理&#xff0c;产量却比传统种植模式提高了15%。这不是…

企业级-搭建CICD(持续集成持续交付)实验手册

搭建CI/CD(持续集成/持续交付)企业示例 为了让容器构建镜像并可以持续集成&#xff0c;可以自动上传到Harbor仓库&#xff1b;并且业务主机可以通过CD自动从仓库中下载镜像latest版本并实现业务更新。1.环境部署 1.1 环境搭建业务IP域名GitLab172.25.254.50gitlab.dhj.orgJenki…

吃透《数据结构》C 语言版:线性表的类型定义详解

作为数据结构的入门章节&#xff0c;线性表就像 “地基” 一样重要&#xff0c;而第二章 2.3 节的 “线性表的类型定义”&#xff0c;更是理解后续操作&#xff08;插入、删除、查找等&#xff09;的核心前提。今天就结合自己的学习笔记&#xff0c;用通俗的语言拆解这个知识点…

文件系统中的核心数据结构

宏观上文件系统在kernel的形态文件系统运作流程按照:vfs->磁盘缓存->实际磁盘文件系统->通用块设备层->io调度层->块设备驱动层->磁盘。具体流程的详细展现如下如如何理解文件系统中的数据结构&#xff1f;linux中文件系统还有几种核心数据结构分别是super_b…