1

현재 작업중인 코드베이스에서 체인에서 더 이상 전달 된 문자열을 가져 와서 다른 문자열을 찾기 위해 키로 사용하는 것이 일반적입니다. 현재 표준 관용구는 switch 문을 사용하는 것이지만, 더 큰 switch 문 (~ 20-30 가지를 생각하십시오)의 경우 sonarqube는 코드 냄새라고 말하며 순환 복잡성을 줄여야한다고 말합니다. 나의 현재 솔루션은 그러나이 실제로 청소기를 될 것 같지 않습니다 그래서큰 스위치 문의 복잡성 감소

private static final HashMap<String, String> sortMap; 
static { 
    sortMap = new HashMap<>(); 
    sortMap.put("foo1", "bar1"); 
    sortMap.put("foo2", "bar2"); 
    sortMap.put("foo3", "bar3"); 
    etc... 
} 

protected String mapSortKey(String key) { 

    return sortMap.get(key); 
} 

같은 정적의 HashMap을 사용하는 것입니다, 그리고 아무것도 테이너 더 많은 혼란을 보인다합니다. 이 문제를 해결할 더 좋은 방법이 있습니까? 아니면 이런 상황에서 음파 탐지기를 무시해야합니까? 나는 다형성, 즉 Ways to eliminate switch in code을 알고 있지만 스위치 문이 기본 다형성이 아닌 임시 변통 데이터 구조로 사용되고 있기 때문에이 문제는 과도한 것처럼 보입니다. 스위치 케이스의 순환 복잡도를 줄이는 것과 관련하여 제가 발견 한 다른 비슷한 질문은이 경우에는 실제로 적용 할 수 없습니다.

+1

파일에 매핑을 아웃소싱 할 수 없습니까? 이러한 접근 방식은 훨씬 더 동적입니다. 100 개의 switch-case 문이나 map-puts를 프로그램에 하드 코딩하는 것보다 낫습니다. 게다가지도 접근법이 훨씬 깨끗하다고 ​​생각합니다. 하지만 여기서 정적 블록 *을 사용해야하는 이유를 알지 못합니다. 나는 그들을 좋아하지 않습니다 ... – Zabuza

+0

https://blog.sonarsource.com/cognitive-complexity-because-testability-understandability "심지어 맥케이브 (McCabe)조차도 원래의 논문에서 스위치의 사례 진술이 순환 적 복잡성과 관련하여 아주 옳은 것처럼 보인 것은 아니라고 인정했다. 그래서 당신은 그것을 무시하기로 결정할 수 있습니다. – Kayaman

+0

@ zero298 다형성을 사용하는 것이이 문제를 해결하는 올바른 방법이 아니라고 생각합니다. 스위치 문을 현재 사용하는 방식은 무엇을 실행할지 결정하는 방법이 아니라 기본 데이터 구조입니다. – JCD

답변

0

예를 들어 키로 매핑 된 값을 선택하는 경우 테이블 또는 속성 파일이이를 처리하는보다 적합한 방법입니다.

다른 switch 문에서 논리에 대해 말하면 규칙 엔진이 더 적합 할 수 있습니다.

주요 요구 사항 : 유지 관리 가능성에 부딪혔습니다. 너무 많은 로직이나 너무 많은 데이터를 코딩하는 경우, 우리는 부서지기 쉬운 코드를 만들었습니다. 전환 된 정보의 유형에 적합한 디자인 패턴을 선택하고 나중에 변경해야하는 사람을 위해 유지할 수있는 장소로 기능을 내 보냅니다. 이렇게 긴 목록으로 인해 일부 빈도로 변경이 발생할 가능성이 높습니다.