如何根据函数名(多个 ifs)进行重构?
How can I refactor based on the name of a function (multiple ifs)?
我在试图清理和精简的遗留项目中看到这段代码。
我有一个结构基本相同的多重 if 条件:
async function _validateRenderRequestById({
id: requestId,
user = null,
uploadToCampaign = false,
requestGroups = null,
}) {
const request = await getRequestTasksById(requestId);
if (!request) return null;
let validated = false;
const payload = { request, user, uploadToCampaign };
if (request.type === requestTypes.r && request.RequestTasks.length) {
validated = await _validateRequest({ ...payload, renderGroups });
}
if (request.type === requestTypes.a && request.ARequestTasks.length) {
validated = await _validateARequest({ ...payload, renderGroups });
}
if (request.type === requestTypes.e && request.ERequestTasks.length) {
validated = await _validateERequest(payload);
}
if (request.type === requestTypes.s && request.SRequestTasks.length) {
validated = await _validateSRequest(payload);
}
...
}
我不完全确定这是否值得改变,但如果你想改变它 table-driven,你可以通过定义一个 table 来这样做,你可以查找 requestType然后获取您正在检查 .length
的数组的 属性 名称以及匹配的验证函数参考:
const requestMap = {
[requestTypes.r]: {name: "RequestTasks", fn: _validateRequest},
[requestTypes.a]: {name: "ARequestTasks", fn: _validateARequest},
[requestTypes.e]: {name: "ERequestTasks", fn: _validateERequest},
[requestTypes.s]: {name: "SRequestTasks", fn: _validateSRequest},
};
async function _validateRenderRequestById({
id: requestId,
user = null,
uploadToCampaign = false,
requestGroups = null,
}) {
const request = await getRequestTasksById(requestId);
if (!request) return null;
let validated = false;
const payload = {
request,
user,
uploadToCampaign
};
let requestInfo = requestMap[request.type];
if (requestInfo && request[requestInfo.name].length) {
validated = await requestInfo.fn({
...payload,
renderGroups
});
}
...
}
我在试图清理和精简的遗留项目中看到这段代码。
我有一个结构基本相同的多重 if 条件:
async function _validateRenderRequestById({
id: requestId,
user = null,
uploadToCampaign = false,
requestGroups = null,
}) {
const request = await getRequestTasksById(requestId);
if (!request) return null;
let validated = false;
const payload = { request, user, uploadToCampaign };
if (request.type === requestTypes.r && request.RequestTasks.length) {
validated = await _validateRequest({ ...payload, renderGroups });
}
if (request.type === requestTypes.a && request.ARequestTasks.length) {
validated = await _validateARequest({ ...payload, renderGroups });
}
if (request.type === requestTypes.e && request.ERequestTasks.length) {
validated = await _validateERequest(payload);
}
if (request.type === requestTypes.s && request.SRequestTasks.length) {
validated = await _validateSRequest(payload);
}
...
}
我不完全确定这是否值得改变,但如果你想改变它 table-driven,你可以通过定义一个 table 来这样做,你可以查找 requestType然后获取您正在检查 .length
的数组的 属性 名称以及匹配的验证函数参考:
const requestMap = {
[requestTypes.r]: {name: "RequestTasks", fn: _validateRequest},
[requestTypes.a]: {name: "ARequestTasks", fn: _validateARequest},
[requestTypes.e]: {name: "ERequestTasks", fn: _validateERequest},
[requestTypes.s]: {name: "SRequestTasks", fn: _validateSRequest},
};
async function _validateRenderRequestById({
id: requestId,
user = null,
uploadToCampaign = false,
requestGroups = null,
}) {
const request = await getRequestTasksById(requestId);
if (!request) return null;
let validated = false;
const payload = {
request,
user,
uploadToCampaign
};
let requestInfo = requestMap[request.type];
if (requestInfo && request[requestInfo.name].length) {
validated = await requestInfo.fn({
...payload,
renderGroups
});
}
...
}