WebSocket模块API选型:静态方法 vs 实例方法哪个更优?
关于WebSocket管理模块的API设计选择
我需要开发一个模块,用于处理一个或多个URL硬编码的WebSocket连接与订阅。模块需提供与这些WebSocket及关联REST API交互的各类方法,核心要求是:仅在有请求时建立连接,无需求时自动关闭。应用的任意部分都可导入该模块并操作WebSocket/端点,但模块绝对不能暴露WebSocket实例。
当前我只关注模块的API设计(不涉及内部实现),考虑了两种接口方案:
- 方案一:通过静态方法(单独导出的函数)提供操作
- 方案二:通过实例化类提供方法
我认为创建引用静态WebSocket的类方法毫无意义,只会增加不必要的复杂度,本质就是静态方法的代理。实例化方案唯一的优势是能保证操作WebSocket前连接已建立(见下方代码示例)。
我已经完成了两种实现且均可正常运行,但仍不确定哪种方案更优,想听听大家的经验与看法。
静态方法方案示例
// 导入所有函数 import * as SpecificWebSocketManager from 'specific-websocket-manager.js'; // 订阅私有WebSocket需要认证token const token = await SpecificWebSocketManager.getWebSocketToken({ apikey: 'string', secret: 'string' }); // 任何私有订阅都需要该token及其他信息 // 同一WebSocket可使用不同的api密钥 const subscription = { token: 'string', apikey: 'string', name: 'subscriptionName', callback: subscriptionCallback, }; // 若连接未建立,管理器将建立WebSocket连接。这是异步调用 // 不保证订阅一定成功,连接可能失败 SpecificWebSocketManager.subscribe(subscription).catch(); // 当无剩余订阅时,管理器将关闭WebSocket SpecificWebSocketManager.unsubscribe(subscription);
实例化方案示例
// 导入默认导出 import SpecificWebSocketManager from 'specific-websocket-manager.js'; // 若连接未建立,管理器将建立WebSocket连接。这是异步调用 // 若token不存在,将在内部获取 // 若实例创建成功,则保证连接已建立 // 注意:仍需通过静态调用(工厂方法)创建实例 const privateInstance = await SpecificWebSocketManager.privateInstance({ apikey: 'string', secret: 'string' }).catch(); // Apikey已提供,token已获取 const subscription = { name: 'subscriptionName', callback: subscriptionCallback }; // 连接已建立,此处无需异步调用 privateInstance.subscribe(subscription); // 即使无剩余订阅,管理器仍保持连接,因为后续可能再次订阅 privateInstance.unsubscribe(subscription); // 仅当所有实例都关闭时,管理器才会关闭WebSocket // 调用此方法后无法再订阅 privateInstance.close(); // 调用此方法可重新订阅 privateInstance.connect().catch();
内容的提问来源于stack exchange,提问作者domizai
相关产品推荐
相关产品推荐

