Reduce the number of non-empty switch cases

1.9k Views Asked by At

Is there a way to Reduce the number of non-empty switch cases as SonarQube tells? In the reducer file a have 37 cases in a switch, but SonarQube allow just 30.

Maybe it is possible to write my code differently, because it works perfectly, the problem is just that SonarQube returns it like a CodeSmell. I post my reducer code below.

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;
  }
}
1

There are 1 best solutions below

5
depperm On

I believe you can reduce it by finding common returns and creating a map. For example reducerUtils.requestListData is called 5 times, by creating a map for the differences you should be able to get rid of 4 switch cases.

Initial thought is to turn action.types that share return functions, into a new map (myMap) keys and list the specific different parameters here (I use option1 and option2 as I don't know the rest of your code). An alternative to using option1 is to change it to unknown or a list of possibilities with | (IEquipment[] | IEq....) inside <>

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);

Continuing the above thought it should be possible to move the function into option1 and remove switch case entirely. Related article or this one

const myMap = {
    [EquipmentActionTypes.REQUEST_EQUIPMENT]:{
        option1: reducerUtils.requestListData<IEquipmentState, IEquipment[] >(),
        option2: ['equipmentList']
    },
    ...
}
myMap[action.type].option1(lastState, myMap[action.type].option2, actionPayload)