我正在开发一个大型内容管理系统,其中特定模块及其子模块利用相同的后端API。每个子模块的终端节点除了“文档类型”不同外,其余完全相同。
因此,遵循以下模式:
api/path/v1/{文档类型}
api/path/v1/{文档类型}/{id}
api/path/v1/{文档类型}/{id}/versions
随着时间的推移,使用此API的模块数量增加,我留下了许多冗余的API服务,实现了7种CRUD方法:
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会怎样?