[Fixed] Removing convoluted if statements by using map

Issue

I am writing a fairly convoluted method and encountered the situation of complex logic judgment.

Generally, I can use if/else or switch to implement multiple conditional judgments, but there will be a problem: with the increase of logic complexity, if/else and switch in the code will become more and more bloated.

Secondly, my branch coverage stats are all over the place, as Istanbul is reporting (I think erroneously) that it cannot hit some of the else branches.

What other approaches exist that could help? So far, I’ve come across is the use of a map, but I’m not sure how to execute code blocks within the context of one.

static filterCourseContentElementButtonEvents(
  courseContents: ICourseContent[],
  courseContentElementButtonEvent: {
    id: CourseContentElementButtonEventType;
    value: CourseContentElementButtonEventTypeValue;
  }[],
  selectedCourseContentUid: string
): {
  id: CourseContentElementButtonEventType;
  value: CourseContentElementButtonEventTypeValue;
}[] {
  if (!CourseContentElementButtonService.isPreviousButtonEventTypeAvailable(
      courseContents,
      selectedCourseContentUid
    )) {
    courseContentElementButtonEvent = CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
      courseContentElementButtonEvent,
      CourseContentElementButtonEventType.PREVIOUS
    );
  }
  if (!CourseContentElementButtonService.isNextButtonEventTypeAvailable(
      courseContents,
      selectedCourseContentUid
    )) {
    courseContentElementButtonEvent = CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
      courseContentElementButtonEvent,
      CourseContentElementButtonEventType.NEXT
    );
  }
  if (!CourseContentElementButtonService.isJumpButtonEventTypeAvailable(
      courseContents,
      selectedCourseContentUid
    )) {
    courseContentElementButtonEvent = CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
      courseContentElementButtonEvent,
      CourseContentElementButtonEventType.JUMP
    );
  }
  if (!CourseContentElementButtonService.isSubmitButtonEventTypeAvailable(
      courseContents,
      selectedCourseContentUid
    )) {
    courseContentElementButtonEvent = CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
      courseContentElementButtonEvent,
      CourseContentElementButtonEventType.SUBMIT_RESPONSE
    );
  }
  if (!CourseContentElementButtonService.isEndButtonEventTypeAvailable(
      courseContents,
      selectedCourseContentUid
    )) {
    courseContentElementButtonEvent = CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
      courseContentElementButtonEvent,
      CourseContentElementButtonEventType.END
    );
  }
  return courseContentElementButtonEvent;
}

Solution

Perhaps something like this (not complete of course)

const deleteEventIfNotAvaiable = (type, contents, contentUid, buttonEvent, buttonEventType) => {
  const isAvailable = CourseContentElementButtonService[`is${type}ButtonEventTypeAvailable`](
    contents, contentUid
  )
  return isAvailable ? null : CourseContentElementButtonService.deleteCourseContentElementButtonEvent(
    buttonEvent, buttonEventType[type.toUpperCase()]
  );
}

...

['Previous','Next'...].forEach(type => courseContentElementButtonEvent = deleteEventIfNotAvaiable(
    type,
    courseContents,
    selectedCourseContentUid,
    courseContentElementButtonEvent,
    CourseContentElementButtonEventType)
)

Leave a Reply

(*) Required, Your email will not be published