더 논리적 인 코드보다 더 자세한 코드가 더 간결한 코드보다 더 깨끗한 경우가 있습니까?
더 논리적 인 코드보다 더 자세한 코드가 더 간결한 코드보다 더 깨끗한 경우가 있습니까?
답변:
그에 대한 답을 찾기 위해 나에게 일어난 실제 사례를 살펴 보겠습니다. C #에서 유지 관리하는 라이브러리에는 다음 코드가 있습니다.
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
이를 동료들과 논의하면서 만장일치의 평결은 중첩 된 삼항식이 "영리한"사용과 함께 is var
간결하지만 읽기 어려운 코드라는 결과였다.
그래서 나는 그것을 다음과 같이 리팩토링했다.
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
원래 버전에는 암시 적으로 하나의 복합 표현식 만 포함되었습니다 return
. 새 버전에는 이제 명시 적 변수 선언, if
명령문 및 두 개의 explicit이 포함 returns
됩니다. 더 많은 문장과 더 많은 코드 줄이 포함되어 있습니다. 그러나 내가 상담 한 모든 사람들은 "깨끗한 코드"의 핵심 측면 인 읽기 쉽고 추론하기가 쉽다고 생각했습니다.
따라서 귀하의 질문에 대한 답변은 강조되는 "예"이며 간결한 코드보다 더 자세한 정보가 더 명확 할 수 있으므로 유효한 리팩토링입니다.
!
조건에서 제거하는 것이 좋습니다 . 또한 두 번째 수익을에 제안하는 것이 좋습니다 else
. 그러나 그것이 서있는 것처럼, 그것은 큰 개선입니다.
if (!foo.HasValue)
코드의 관용구라면 훨씬 더 강력합니다. 그러나 이것은 실제로 출구 초기 if
가 아닙니다 . "이것 또는 저것에 의존하십시오."
1. LOC와 코드 품질 간의 상관 관계가 없습니다.
리팩토링의 목표는 코드의 품질을 향상시키는 것입니다.
LOC는 코드의 품질과 관련이있는 매우 기본적인 측정 항목입니다. 예를 들어, 수천 개의 LOC가있는 방법은 품질 문제가있을 수 있습니다. 그러나 LOC가 유일한 메트릭 이 아니며 많은 경우 품질과의 상관 관계가 부족합니다. 예를 들어, 4 LOC 방법이 6 LOC 방법보다 더 읽기 쉽고 유지 보수가 필요한 것은 아닙니다.
2. 일부 리팩토링 기술은 LOC 추가로 구성됩니다.
당신이 먹는 경우 리팩토링 기법의 목록을 쉽게 intentionnally으로 구성 사람 자리 수 있습니다 추가 LOCS을. 예 :
두 가지 모두 매우 유용한 리팩토링 기술이며 LOC에 미치는 영향은 사용 여부를 고려할 때 전혀 관련이 없습니다.
LOC를 사용하지 마십시오.
LOC는 위험한 측정 항목입니다. 측정하기가 매우 쉽고 올바르게 해석하기가 매우 어렵습니다.
코드 품질 측정 기술에 익숙해 질 때까지 먼저 LOC 측정을 피하십시오. 대부분의 경우 관련성이 없으며 코드의 품질이 저하되는 경우가 있습니다.
소스 코드의 바이트 수 또는 LoC 수를 최소화 한 최종 결과를 보려면 Stack Exchange Code Golf 사이트에 제출 한 내용을 살펴보십시오 .
이러한 방식으로 소스 코드가 줄어든다면 곧 유지 관리 할 수없는 혼란이 생길 것입니다. 그러한 코드를 작성한 사람이 당시에 완전히 이해했다고해도 6 개월 후에 다시 돌아 오면 얼마나 효율적일까요? 이러한 최소 코드가 실제로 더 빨리 실행된다는 증거는 없습니다.
팀의 모든 구성원이 코드를보고 바로 수행하는 방식을 이해할 수 있도록 코드를 작성해야합니다.
그렇습니다. 리팩토링은 더 많은 코드 줄을 만들 수 있습니다.
가장 일반적인 경우 IMO는 일반적이지 않은 코드를 사용하여보다 일반적이고 유연하게 만드는 경우 입니다. 코드를 일반화하면 코드 줄이 크게 증가하기도합니다 (때로는 두 개 이상).
새로 일반 코드를 내부 소프트웨어 구성 요소 대신 다른 라이브러리에서 라이브러리로 사용하려면 일반적으로 단위 테스트 코드와 코드 내 문서 마크 업을 추가하여 코드 줄을 다시 늘립니다.
예를 들어 다음은 모든 소프트웨어 개발자에게 발생하는 매우 일반적인 시나리오입니다.
내 머리 꼭대기에서 나에게 오는 몇 가지 구체적인 예 :