javascript - 减少非空开关盒的数量
问题描述
有没有办法像 SonarQube 所说的那样减少非空开关盒的数量?在 reducer 文件中,一个 switch 中有 37 个 case,但 SonarQube 只允许 30 个。
也许可以以不同的方式编写我的代码,因为它运行良好,问题只是 SonarQube 像 CodeSmell 一样返回它。我在下面发布了我的减速器代码。
export function equipmentReducer(
lastState: IEquipmentState = new EquipmentState(),
action: GenericAction<EquipmentActionTypes, any>
): IEquipmentState {
switch (action.type) {
case EquipmentActionTypes.REQUEST_EQUIPMENT:
return reducerUtils.requestListData<IEquipmentState, IEquipment[]>(lastState, ['equipmentList']);
case EquipmentActionTypes.RECEIVE_EQUIPMENT:
return reducerUtils.receiveListData<IEquipmentState, IEquipment[]>(lastState, ['equipmentList'], action.payload);
case EquipmentActionTypes.ERROR_RECEIVE_EQUIPMENT:
return reducerUtils.errorListData<IEquipmentState, IEquipment[]>(lastState, ['equipmentList'], action.payload);
case EquipmentActionTypes.REQUEST_EQUIPMENT_BY_ID:
return reducerUtils.requestItemData<IEquipmentState, IEquipment>(lastState, ['selectedEquipment']);
case EquipmentActionTypes.RECEIVE_EQUIPMENT_BY_ID:
return reducerUtils.receiveItemData<IEquipmentState, IEquipment>(
lastState,
['selectedEquipment'],
action.payload as IEquipment
);
case EquipmentActionTypes.ERROR_RECEIVE_EQUIPMENT_BY_ID:
return reducerUtils.errorItemData<IEquipmentState, IEquipment>(lastState, ['selectedEquipment'], action.payload);
case EquipmentActionTypes.REQUEST_ADD_EQUIPMENT:
case EquipmentActionTypes.REQUEST_UPDATE_EQUIPMENT:
return reducerUtils.requestPostPutItemData<IEquipmentState, IEquipment>(
lastState,
['selectedEquipment'],
action.payload
);
case EquipmentActionTypes.RECEIVE_ADD_EQUIPMENT:
case EquipmentActionTypes.RECEIVE_UPDATE_EQUIPMENT:
return reducerUtils.receivePostPutItemData<IEquipmentState, IEquipment>(
lastState,
['selectedEquipment'],
action.payload
);
case EquipmentActionTypes.ERROR_ADD_EQUIPMENT:
case EquipmentActionTypes.ERROR_UPDATE_EQUIPMENT:
return reducerUtils.errorPostPutItemData<IEquipmentState, IEquipment>(
lastState,
['selectedEquipment'],
action.payload
);
case EquipmentActionTypes.REQUEST_INITIAL_SPECIFICATION:
return reducerUtils.requestListData<IEquipmentState, IEquipmentInitialSpecification[]>(lastState, [
'equipmentInitialSpecification',
]);
case EquipmentActionTypes.RECEIVE_INITIAL_SPECIFICATION:
return reducerUtils.receiveListData<IEquipmentState, IEquipmentInitialSpecification[]>(
lastState,
['equipmentInitialSpecification'],
action.payload
);
case EquipmentActionTypes.ERROR_INITIAL_SPECIFICATION:
return reducerUtils.errorListData<IEquipmentState, IEquipmentInitialSpecification[]>(
lastState,
['equipmentInitialSpecification'],
action.payload
);
case EquipmentActionTypes.REQUEST_MANUFACTURERS:
return reducerUtils.requestListData<IEquipmentState, IManufacturersListItem[]>(lastState, [
'manufacturers',
'manufacturerList',
]);
case EquipmentActionTypes.RECEIVE_MANUFACTURERS:
return reducerUtils.receiveListData<IEquipmentState, IManufacturersListItem[]>(
lastState,
['manufacturers', 'manufacturerList'],
action.payload
);
case EquipmentActionTypes.ERROR_RECEIVE_MANUFACTURERS:
return reducerUtils.errorListData<IEquipmentState, IManufacturersListItem[]>(
lastState,
['manufacturers', 'manufacturerList'],
action.payload
);
case EquipmentActionTypes.REQUEST_SUPPLIERS:
return reducerUtils.requestListData<IEquipmentState, ISuppliersListItem[]>(lastState, [
'suppliers',
'supplierList',
]);
case EquipmentActionTypes.RECEIVE_SUPPLIERS:
return reducerUtils.receiveListData<IEquipmentState, ISuppliersListItem[]>(
lastState,
['suppliers', 'supplierList'],
action.payload
);
case EquipmentActionTypes.ERROR_RECEIVE_SUPPLIERS:
return reducerUtils.errorListData<IEquipmentState, ISuppliersListItem[]>(
lastState,
['suppliers', 'supplierList'],
action.payload
);
case EquipmentActionTypes.REQUEST_ADD_MANUFACTURER:
return reducerUtils.requestPostPutItemData<IEquipmentState, IManufacturer>(
lastState,
['manufacturers', 'selectedManufacturer', 'manufacturerInfo'],
action.payload
);
case EquipmentActionTypes.RECEIVE_ADD_MANUFACTURER:
return reducerUtils.receivePostPutItemData<IEquipmentState, IManufacturer>(
lastState,
['manufacturers', 'selectedManufacturer', 'manufacturerInfo'],
action.payload
);
case EquipmentActionTypes.ERROR_ADD_MANUFACTURER:
return reducerUtils.errorPostPutItemData<IEquipmentState, IManufacturer>(
lastState,
['manufacturers', 'selectedManufacturer', 'manufacturerInfo'],
action.payload
);
case EquipmentActionTypes.REQUEST_ADD_SUPPLIER:
return reducerUtils.requestPostPutItemData<IEquipmentState, ISupplier>(
lastState,
['suppliers', 'selectedSupplier', 'supplierInfo'],
action.payload
);
case EquipmentActionTypes.RECEIVE_ADD_SUPPLIER:
return reducerUtils.receivePostPutItemData<IEquipmentState, ISupplier>(
lastState,
['suppliers', 'selectedSupplier', 'supplierInfo'],
action.payload
);
case EquipmentActionTypes.ERROR_ADD_SUPPLIER:
return reducerUtils.errorPostPutItemData<IEquipmentState, ISupplier>(
lastState,
['suppliers', 'selectedSupplier', 'supplierInfo'],
action.payload
);
case EquipmentActionTypes.REQUEST_ADD_MANUFACTURER_CONTACT:
return reducerUtils.requestPostPutItemData<IEquipmentState, IContact>(
lastState,
['manufacturers', 'selectedManufacturer', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.RECEIVE_ADD_MANUFACTURER_CONTACT:
return reducerUtils.receivePostPutItemData<IEquipmentState, IContact>(
lastState,
['manufacturers', 'selectedManufacturer', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.ERROR_ADD_MANUFACTURER_CONTACT:
return reducerUtils.errorPostPutItemData<IEquipmentState, IContact>(
lastState,
['manufacturers', 'selectedManufacturer', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.REQUEST_ADD_SUPPLIER_CONTACT:
return reducerUtils.requestPostPutItemData<IEquipmentState, IContact>(
lastState,
['suppliers', 'selectedSupplier', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.RECEIVE_ADD_SUPPLIER_CONTACT:
return reducerUtils.receivePostPutItemData<IEquipmentState, IContact>(
lastState,
['suppliers', 'selectedSupplier', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.ERROR_ADD_SUPPLIER_CONTACT:
return reducerUtils.errorPostPutItemData<IEquipmentState, IContact>(
lastState,
['suppliers', 'selectedSupplier', 'selectedContact'],
action.payload
);
case EquipmentActionTypes.REQUEST_EQUIPMENT_DELETE:
return reducerUtils.requestPostPutItemData<IEquipmentState, IEquipment>(lastState, ['deletedEquipment'], action.payload);
case EquipmentActionTypes.RECEIVE_EQUIPMENT_DELETE:
return reducerUtils.receivePostPutItemData<IEquipmentState, IEquipment>(lastState, ['deletedEquipment'], action.payload);
case EquipmentActionTypes.ERROR_RECEIVE_EQUIPMENT_DELETE:
return reducerUtils.errorPostPutItemData<IEquipmentState, IEquipment>(lastState, ['deletedEquipment'], action.payload);
case EquipmentActionTypes.REQUEST_EQUIPMENT_IS_DELETED:
return requestItemData<IEquipmentState, boolean>(lastState, ['equipmentIsDeleted']);
case EquipmentActionTypes.RECEIVE_EQUIPMENT_IS_DELETED:
return receiveItemData<IEquipmentState, boolean>(lastState, ['equipmentIsDeleted'], action.payload);
case EquipmentActionTypes.ERROR_RECEIVE_EQUIPMENT_IS_DELETED:
return errorItemData<IEquipmentState, boolean>(lastState, ['equipmentIsDeleted'], action.payload);
case EquipmentActionTypes.RESET_STATE:
return resetSelectedEquipmentState(lastState);
default:
return lastState;
}
}
解决方案
我相信你可以通过找到共同的回报和创建地图来减少它。例如reducerUtils.requestListData
被调用 5 次,通过为差异创建地图,您应该能够摆脱 4 个 switch 案例。
最初的想法是将action.types
共享返回函数转换为新的 map ( myMap
) 键并在此处列出特定的不同参数(我使用option1
并且option2
因为我不知道您的其余代码)。使用的替代方法option1
是将其更改为unknown
或带有|
( IEquipment[] | IEq....
)的可能性列表<>
const myMap = {
[EquipmentActionTypes.REQUEST_EQUIPMENT]: {
option1: IEquipment[],
option2: ['equipmentList']
},
[EquipmentActionTypes.REQUEST_INITIAL_SPECIFICATION]: {
option1: IEquipmentInitialSpecification[],
option2: ['equipmentInitialSpecification']
},
[EquipmentActionTypes.REQUEST_INITIAL_SPECIFICATION]: {
option1: IEquipmentInitialSpecification[],
option2: [
'equipmentInitialSpecification',
]
},
[EquipmentActionTypes.REQUEST_MANUFACTURERS]: {
option1: IManufacturersListItem[],
option2: [
'manufacturers',
'manufacturerList',
]
},
[EquipmentActionTypes.REQUEST_SUPPLIERS]: {
option1: ISuppliersListItem[],
option2: [
'suppliers',
'supplierList',
]
}
}
switch (action.type) {
case EquipmentActionTypes.REQUEST_INITIAL_SPECIFICATION:
case EquipmentActionTypes.REQUEST_MANUFACTURERS:
case EquipmentActionTypes.REQUEST_SUPPLIERS:
case EquipmentActionTypes.REQUEST_INITIAL_SPECIFICATION:
case EquipmentActionTypes.REQUEST_EQUIPMENT:
// alternatively instead of option1 ..... , unknown >
// alternatively instead of option1 ..... , IEquipment[] | IEq.... >
return reducerUtils.requestListData < IEquipmentState, myMap[action.type].option1 > (lastState, myMap[action.type].option2);
继续上述想法,应该可以将功能移入option1
并完全移除开关盒。相关文章或这篇文章
const myMap = {
[EquipmentActionTypes.REQUEST_EQUIPMENT]:{
option1: reducerUtils.requestListData<IEquipmentState, IEquipment[] >(),
option2: ['equipmentList']
},
...
}
myMap[action.type].option1(lastState, myMap[action.type].option2, actionPayload)
推荐阅读
- python - 在 DRF 中嵌套数据时的 RelatedObjectDoesNotExist
- excel - VBA /复制列的最大值和同一行和上一列中的日期并粘贴到新工作表中
- javascript - 想要减小 JSON 字符串的大小
- cookies - Next.js 不持久化 cookie
- mysql - 没有重复列时收到错误代码 1062
- javascript - 数据表不适用于实时更新数据
- javascript - 在点击功能已经存在的情况下,难以在 UL 中更改 IMG Src
- function - 当我追加函数调用时,为什么函数执行顺序似乎颠倒了?
- docker - 错误:合并到主分支后缺少绑定“binding.node”
- c# - 如何将字典值从控制器传递到视图?