当前位置: 首页 > news >正文

跨平台开发对于不同平台调用接口的抽象层设计

我已经受够无处不在的分支语句了!
长痛不如短痛,趁现在的底层交互代码还没有这么多,赶紧重构吧。毕竟不是 demo 时期了,要讲究一些了

设计思路

刚开始的想法是整一个抽象类 AbstractAPIs 声明所有待实现的函数,然后让各个平台去具体的实现 PlatformAAPIs、PlatformBAPIs

突然想到 Js 好像没有抽象类,不好意思 TypeScript 写的有点多。。。

如果手动模拟抽象类,如果没被子类覆盖抛异常。这种方式代码量有点太多了,一百多个接口,每个都一样的代码,实在是不优雅

其实抽象类的作用就是起到一个注册的作用,注册存在这么一些方法可供使用。对于这样的注册,没必要真的将其结构化为类,只需要抛出一个对象即可

export default {methodName1: "methodName1",methodName2: "methodName2",methodName3: "methodName3",
}

使用时根据字符串来调用

apis.call(FUNCNAMES.methodName1)

结构框架

platform1.js

class Platform1 {methodName1() { // 实现 }methodName2() { // 实现 }methodName3() { // 实现 }
}
export default new Platform1();

platform2.js

class Platform1 {methodName1() { // 实现 }methodName2() { // 实现 }methodName3() { // 实现 }
}
export default new Platform2();

api.js

import platformA from "./platformA";
import platformB from "./platformB";class Apis {this.instance = window.isPlarformA() ? platformA : platformB;call = (funcName) => {return this.instance[funcName]();}
}export default new Apis();

添加参数支持

当然,调用时不仅有函数名,还有参数,这个要怎么处理呢
apis.call 完全可以仿照 js 的 call,就是 call、apply 那一套的 call,将 params 直接附在后边

apis.call(FUNCNAMES.methodName1, param1, param2, param3...)

在实现 call 的时候解构赋值即可

call = (funcName, ...args) => {return this.instance[funcName](...args);
};

最终实现

class APIs {constructor() {this.bInit = false;this.instance = null;}init = () => {this.bInit = true;this.instance = window.isPlarformA() ? platformA : platformB;};call = (funcName, ...args) => {if (!this.bInit) this.init();if (this.instance[funcName]) {return this.instance[funcName](...args);} else {throw new Error(`[APIs::call][${funcName}] no instance[funcName].`);}};
}

http://www.mrgr.cn/news/66369.html

相关文章:

  • Ansible基本使用
  • 力扣11.4
  • pdf文件预览和导出
  • 第100+31步 ChatGPT学习:概率校准 Quantile Calibration
  • 【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
  • Fish Agent:集成 ASR 和 TTS 的端到端语音处理模型,支持多语言转换
  • 项目管理基础认知
  • 轻松理解操作系统 - 轻松了解 inode 是如何管理文件的
  • 单臂路由技术,eNSP实验讲解
  • golang 实现比特币内核:处理椭圆曲线中的天文数字
  • 医院信息化与智能化系统(17)
  • 【Linux】简易版shell
  • 机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例
  • 问政浔川(1)—— 有了浔川社团官方联合会和社团官方,那么浔川总社部是干什么的呢?
  • 练习LabVIEW第三十九题
  • vue3如果ul的li太多展示不了,展示滑动scroll
  • 网络安全新前沿:防御策略与技术革新
  • 深度学习经典模型之LeNet-5
  • MATLAB实现人工免疫网络算法(Artificial Immune Network Algorithm, AINA)
  • stm32学习4
  • 聚合(Aggregate)
  • ADNI蛋白质数据集下载
  • 基于Python+Vue开发的口腔牙科预约管理系统
  • 十月末补充(?
  • 李沐Softmax回归从零开始实现代码中的关于y和y_hat
  • 牛客网剑指Offer-树篇-JZ36 二叉搜索树与双向链表