javascript - 我应该选择代码重复还是与 api 服务合并 - JS

标签 javascript api design-patterns architecture redundancy

我正在开发一个大型 CMS 系统,其中特定模块及其子模块利用相同的后端 API。除了“文档类型”之外,每个子模块的端点完全相同。
所以遵循这样的模式:
api/path/v1/{document-type}
api/path/v1/{document-type}/{id}
api/path/v1/{document-type}/{id}/versions
随着时间的推移,使用此 API 的模块数量不断增加,我留下了许多实现 7 种 CRUD 方法的冗余 API 服务:

getAllXs() {...}
getX(id) {...}
getXVersion(id, versionId) {...}

etc...
使用看起来像这样的个人方法
getAllXs() {
    let endpoint = BASE.URL + ENDPOINTS.X;
    let config = ...
    return http.get(endpoint, config)
        .then(response => response.data);
        .catch(...);

}
其中 X 是特定文档类型的名称。
我到了一个地步,我决定做一个单一的服务并做这样的事情:
const BASE_URL = window.config.baseUrl + Const.API_ENDPOINT;
const ENDPOINTS = {
  "W": "/v1/W/",
  "X": "/v1/X/",
  "Y": "/v1/Y/",
  "Z": "/v1/Z/",
}

getAllDocuments(docType, config={}) {
  let endpoint = BASE_URL + ENDPOINTS[docType];
  return http.get(endpoint, config)
        .then(response => response.data);
        .catch(...);
}
...other methods
其中指定了类型并使用映射的端点来构建路径。
这将所有文档 api 服务减少到一个。现在这是更简洁的代码,但显然现在需要一个额外的参数并且术语更通用:
getAllXs() --> getAllDocuments()
而且它的“防白痴”有点少。让我对它当前的编写方式感到不安全的是,有 6 个模块使用此 API,并且每个服务中有相同的 7 个方法。
我一直问自己的问题是:
  • 我是否与动态功能接壤反模式?
  • 如果我有 10 多个模块使用相同的 API 会怎样?
  • 最佳答案

    你的问题让我想到了一个常见的Object Relational Mapping设计问题。
    在设计方面没有单一的事实来源,但如果你在你正在构建的东西中识别出一个 ORM 并重视 object oriented design principles ,我对你有一些启发。
    这是我在许多项目中使用的我自己的 Vanilla ES6 ORM 的过度简化(重用您的代码片段以获得相关性)。这个设计的灵感来自于我在其他语言中使用的重型 ORM 框架。

    class ORM {
       constructor() {
          this.BASEURL = window.config.baseUrl + Const.API_ENDPOINT
          this.config = {foo:bar} // default config
       }
    
       getAll() {
          let endpoint = this.BASEURL + this.ENDPOINT
          return http.get(endpoint, this.config)
           .then(response => response.data)
           .catch(...)
       }
    
       get(id) {
          // ...
       }
    }
    
    以及该类的扩展示例(注意具有特殊配置的类)
    class XDocuments extends ORM {
       static endpoint = '/XDocument/'
    
       constuctor() {
          super()
       }
    
       otherMethod() {
          return 123
       }
    }
    
    class YDocuments extends ORM {
       static endpoint = '/YDocument/'
    
       constuctor() {
          super()
       }
    
       getAll() {
          this.config = {foo:not_bar}
          super.getAll()
       }
    }
    
    因为您特别询问这是否与反模式接壤。我建议阅读 SOLIDDRY原则和 ORM一般的设计。您还会发现有关全局常量的代码异味,但这只有在您处于窗口上下文中时才会如此。我看到您已经走在正确的道路上,试图避免 code duplication smellshotgun surgery smell . :-)
    祝你好运,不要犹豫,提出更多问题并在评论中添加更多细节!

    关于javascript - 我应该选择代码重复还是与 api 服务合并 - JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66372332/

    相关文章:

    java - 在java中设计sql查询存储的最佳方法是什么?

    javascript - 如何在 Vert.x3 中编写自定义处理程序?

    javascript - 验证 JavaScript 中的数学表达式?

    python - django api 用于在数据库中创建数据

    javascript - Google Feed API 跳过文章?

    design-patterns - 在这个例子中装饰器模式真的有必要吗?

    java - 使用 Java 8 的模板方法设计模式

    javascript - 在 url 的请求参数中传递 "#"哈希符号在 Firefox 中不起作用

    javascript - jQuery 函数 - 防止返回 "for a while"

    javascript - 使用 html5 拖放上传上传后播放 mp3 文件