首页 > 解决方案 > 使用 map 去除复杂的 if 语句

问题描述

我正在写一个相当复杂的方法,遇到了复杂逻辑判断的情况。

一般我可以使用if/else或者switch来实现多个条件判断,但是会有一个问题:随着逻辑复杂度的增加,代码中的if/else和switch会越来越臃肿。

其次,我的分支机构覆盖率统计数据到处都是,因为伊斯坦布尔报告(我认为是错误的)它无法触及其他一些分支机构。

还有哪些其他方法可以提供帮助?到目前为止,我遇到的是使用地图,但我不确定如何在地图的上下文中执行代码块。

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

标签: javascriptangulartypescript

解决方案


也许是这样的(当然不完整)

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

推荐阅读