我正在开发一个大型 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 个方法。
我一直问自己的问题是:
最佳答案
你的问题让我想到了一个常见的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()
}
}
因为您特别询问这是否与反模式接壤。我建议阅读 SOLID和 DRY原则和 ORM一般的设计。您还会发现有关全局常量的代码异味,但这只有在您处于窗口上下文中时才会如此。我看到您已经走在正确的道路上,试图避免 code duplication smell和 shotgun surgery smell . :-)祝你好运,不要犹豫,提出更多问题并在评论中添加更多细节!
关于javascript - 我应该选择代码重复还是与 api 服务合并 - JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66372332/