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

news/2024/11/5 20:58:16 标签: javascript

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

相关文章

python中的文本表示

出处:| 01_word_embedding/01_文本表示.ipynb | 文本向量表示 |Open In Colab | 文本表示 文本表示:将文本数据表示成计算机能够运算的数字或向量。 在自然语言处理(Natural Language Processing,NLP)领域&#xff…

软件测试面试八股文个人总结

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到开发成功投入使用,并在使用中不断地修改、增补和完善,直到停止该软件的使用的全过程(从酝酿到…

使用GraphQL构建高效API

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用GraphQL构建高效API 引言 GraphQL 简介 设置 GraphQL 服务器 安装依赖 创建 GraphQL 服务器 查询操作 变更操作 实际案例 博…

损失函数的分类

参考博客:【深度学习】损失函数详解-CSDN博客https://blog.csdn.net/LogosTR_/article/details/126366482?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-126366482-blog-122704657.235^v43^pc_blog_bottom_rele…

TypeScript中的类型注解、Interface接口、泛型

一、认识TypeScript 1.概述 TypeScript是具有类型语法的JavaScript,是一门强类型的编程语言。它是 JavaScript 的超集(js中的所有元素都属于ts),这意味着任何有效的 JavaScript 代码本身也是有效的 TypeScript 代码。 2.优点 静…

React 前端如何通过组件完成 “下载 Excel模板” 和 “上传 Excel 文件并读取内容生成可使用的对象数组”

文章目录 一、Excel 模板下载01、代码示例 二、Excel 文件上传01、文件展示02、示例代码03、前端样式展示04、数据结果展示 三、完整代码 本文的业务需求是建立在批量导入数据的情况下,普通组件只能少量导入,数据较多的情况都会选择 Excel 数据导入&…

区块链技术与应用-PKU 学习笔记

课程地址 资料: ETH-Security 区块链学习记录_比特币 BTC 密码学原理 比特币,又称加密货币(crypto-currency),它主要利用了密码学中的哈希函数(cryptographic hash function)的抗碰撞特性(collision resistance)和单向散列特性(hiding) …

北京交通大学机器学习实验

机器学习课程概要 🐧数学基础 🍬评估 🍕线性模型 🎂神经网络 🦞支持向量机 🐂贝叶斯分类 🐏决策树 👿集成学习 ❤️聚类 🍬降维与度量学习 🐸特征选择预稀疏表…