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

我已经受够无处不在的分支语句了!
长痛不如短痛,趁现在的底层交互代码还没有这么多,赶紧重构吧。毕竟不是 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.xdnf.cn/news/3508.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索:超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker,通过dockers镜像安装很方便,且很快;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像; docker search awvs…

大模型微调技术 --> P-Tuning v1和 P-Tuning v2

P-Tuning 是一种通过引入可学习的 提示 向量来增强预训练语言模型能力的技术,属于提示学习的一种。 1.背景 GPT 在 NLP 领域经过 finetuning 之后很难击败 BERT,主要是因为现在预训练模型的方法有很多种(主要是 MLM),但在 finetune 的时候&…

Angular引用控件类

说明: angular 在一个控件类里面,引入另外一个控件类,这样做的好处,就是代码分离,当你一个页面存在多少类似于独立的界面时,可以使用这种方式,分离代码 更好维护程序 效果图: step…

124.WEB渗透测试-信息收集-ARL(15)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:123.WEB渗透测试-信息收集-ARL(14) 点击fofa任务下发&#xff08…

Linux命令 - 关于命令及其使用

文章目录 1 什么是命令?2 识别命令3 命令帮助文档4 命令别名 1 什么是命令? 命令可以是以下四种形式之一: 可执行程序:就像我们所看到的位于/usr/bin目录中的文件一样,这一类程序可以是用诸如C和C语言编写的程序编译…

【万字详文介绍】:迭代扩张卷积神经网络(IDCNN)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

220V变5V300mA非隔离芯片WT5104

220V变5V300mA非隔离芯片WT5104 WT5104特点包括: - 宽输入电压:85VAC~265VAC,适应全球电网电压波动。 - 输出规格:稳定5V直流电,最大电流500mA,适用于轻功率电子设备。 - 工作模式灵活:支持CCM…

WonderWorld: Interactive 3D Scene Generation from a Single Image 论文解读

目录 一、概述 二、相关工作 1、新视图生成 2、单视图3D场景生成 3、视频生成 4、快速的3D场景表示 三、WonderWorld 1、FLAGS表示 2、引导深度扩散模块 3、单视角层次生成 4、基于几何的初始化 surfel表示 5、阶段一——生成3D场景部分 6、阶段二——用户交互控…

kkfileview4.2.1 LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz

问题 java.lang.IllegalStateException: officeHome doesnt exist or is not a directory: optlibreoffice7.1 安装 kkfileview4.2.1 LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz 测试 全过程脚本 [zengwenfenglocalhost Desktop]$ pwd /home/zengwenfeng/Desktop [zengwe…

可编辑71页PPT | 企业架构及典型设计方案

荐言分享:企业架构(Enterprise Architecture, EA)是战略与技术之间的桥梁,旨在确保企业的信息系统、业务流程、组织结构和技术基础设施能够协同工作,以支持企业的整体战略目标。它通过定义一套标准化的框架、原则、模型…

python代码获取zabbix上机器磁盘使用率

1.需要先给机器打上标记os_type: Linux或者os_type: Windows 2.代码请求获取数据: 先装一下相关的数据包 pip install pyzabbix from pyzabbix import ZabbixAPI import requests import urllib3 import concurrent.futuresclass ZabbixInfo():def __init__(self…

一个完整的crm系统都应该具备哪些功能?CRM系统功能盘点

前段时间我们去拜访一位企业老板,正好他们在开会,团队正在讨论如何与一位潜在的大客户达成交易。 客户对产品表现出浓厚的兴趣,也提出了一些具体的问题,例如上一次交易的详细信息、服务响应时间以及可能的折扣方案,但…

导师双选系统开发:Spring Boot技术详解

第一章 绪论 1.1 选题背景 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,尽管身边每时每刻都在产生大量信息,这些信息也都会在短时间内得到处理,并迅速传播。因为很多时候,管理层决策需要大量信…

CTF顶级工具与资源

《Web安全》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484238&idx1&snca66551c31e37b8d726f151265fc9211&chksmc0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene21#wechat_redirect 《网安面试指南》h…

数列分块入门

本期是数列分块入门。其中的大部分题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:here (其实是对之前分块的 blog 的整理补充) sto hzwer orz %%% [转载] ---------------------------------------------------------------------------------…

模型自动绑骨,在线生成动画,神奇的网站《Mixamo》

英文名mixamo 网站地址:Mixamohttps://www.mixamo.com/#/首先进入需要注册,国内的手机号就可以,但是会有一些慢,多试几次 1、进入界面如下 2、载入自己的模型 2、绑定骨骼 拖动这几个有颜色的圈圈分别对应右图位置,点…

2024 CSS保姆级教程四

CSS中的动画 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块​ 即指元素从一种样式逐渐过渡为另一种样式的过程​ 常见的动画效果有很多,如平移、旋转、缩放等等&#…

Docker安装anythingllm

拉镜像 docker pull mintplexlabs/anythingllm 启动 anythingllm docker run -d --name anythingllm --add-hosthost.docker.internal:host-gateway --env STORAGE_DIR/app/server/storage --health-cmd "/bin/bash/usr/local/bin/docker-healthcheck.sh || exit 1"…

格行:从新晋网红到国货之光,它究竟做对了什么?

作为一家迅速崛起的新消费品牌,近两年来,格行饱受质疑。 无论是商家还是消费者,都有人对其爱之恨之,喜欢它的人,认为它是正义的化身,价格的屠夫,国货的骄傲,原本需要花几百才能买到…

小菜家教平台(二):基于SpringBoot+Vue打造一站式学习管理系统

目录 前言 今日进度 详细过程 一、数据库重构 二、编写登录接口 相关知识点 前言 昨天我们重启了小菜家教平台的开发,创建了新项目并初步进行了配置,今天我们继续。大家要是有需要源码的话可以在评论区跟我说,博客中就不添加源码了~ 今…