중첩 코드 풀기

나는 코드를 쓰는 경직된 규정을 믿지 않는다.자주 들었어.방법 따위는 15줄을 넘으면 안 된다.방법은 단지 하나return문구만 있어야 한다.들여쓰기는 공백 4개여야 합니다.이런 규정은 너무 엄격하다.
현실 세계에서 코드의 유동성은 훨씬 크다.이런 딱딱한 규정을 준수하는 것은 우리로 하여금 진정으로 중요한 일에서 마음을 분산시킬 것이다. 바로 가독성이다.만약 나의 주의력이 줄 수나 return 문장에 엄격하게 집중된다면, 나는 몇 줄의 '너무 길다', 또는 여러 줄return 문장이 있기 때문에 더 읽을 수 있는 코드를 작성하는 것을 막을 것이다.
이 하드 규칙 중 많은 것들이 플러그인 코드를 처리하려고 시도한다.플러그인 코드는 이해하기 어렵다.물리적으로 눈으로 더 많은 시각 스캐닝을 한다.심리적으로 말하자면, 각 층의 삽입은 추적 기능을 추적하기 위해 더 많은 비용을 필요로 한다.이 모든 것들은 독자를 기진맥진하게 한다.
플러그인 코드는 주로 조건의 결과이다.조건은 모든 프로그래밍 논리의 기초이기 때문에, 우리는 그것들을 잘 삭제할 수 없다.우리는 그것들이 독자에게 미치는 영향을 인식하고 가능한 한 이런 영향을 줄이는 조치를 취해야 한다.

정상으로 되돌아오다.
가독성을 높이기 위해서, 우리는 코드를 맨 위로 되돌리고 싶다.순환과 조건문은 본질적으로 끼워 넣는 구조이다.이 구역 안에 둥지를 짓는 것을 피할 수 없다.그러나 우리는 이 구조 외에 둥지를 틀는 것을 피할 수 있다.
코드를 끼워 넣은 몇 가지 예와 읽을 수 있는 실천을 살펴봅시다.

빈 거리
너는 아마 나를 믿지 못할 것이다. 그러나 나는 다음 코드를 한 번도 본 적이 없다.
public function handle($request, Closure $next)
{
    if (env('APP_ENV') == 'development') {
        // do nothing...
    } else {
        if ($request->getScheme() != 'https') {
            URL::forceScheme('https');
            return redirect('https://www.example.com/' . $request->getPath());
        }
    }

    return $next($request);
}
맞아, 빈 if 구역이야.나도 반대로 빈 else 거리를 보았다.규정이 없다. if 적어도 내가 지난 20년 동안 사용한 프로그래밍 언어에는 없다.빈 블록은 죽은 코드입니다. 삭제하십시오.

조건 값
플러그인 코드 블록은 보통 값을 되돌려줍니다.이것들이 브리 값일 때, 코드 블록을 압축하고 조건을 직접 되돌릴 기회가 있다.else 클래스의 isEmpty 방법에 포함된 코드를 고려합니다.
public function isEmpty() {
    if ($this->size === 0) {
        return true;
    } else {
        return false;
    }
}
비록 이 방법 블록은 4줄 코드만 있지만, 그것은 여러 개의 하위 블록을 포함한다.이렇게 적은 줄에도 읽기 어려워 코드가 실제 상황보다 더 복잡해 보인다.
원시 브리 값을 식별하는 조건 반환을 통해, 우리는 직접 반환 조건을 통해 플러그인 코드를 완전히 삭제할 기회가 있다.
public function isEmpty() {
    return $this->size === 0;
}
이 명칭이 적당한 방법과 현재의 단선 블록이 결합된 상하문을 고려하여 우리는 그것의 감지 복잡성을 낮추었다.비록 이 줄은 매우 밀집되어 보이지만, 그것은 여전히 원문보다 더 읽을 만하다.
참고: 압축 조건은 원래 부울 값보다 더 많은 데이터 유형에 사용할 수 있습니다.예를 들어, 간단한 유형 변환을 통해 조건을 정수로 반환할 수 있습니다.그러나 이는 복잡성을 빠르게 증가시켰다.많은 프로그래머들이 삼원조를 사용하여 이 문제를 해결하려고 시도한다.그러나 삼원 압축 코드는 복잡성을 낮추지 않고 코드의 가독성을 떨어뜨린다.이러한 상황에서 보호 조항은 더욱 좋은 선택이다.

보호 조항
플러그인 코드는 일반적으로 논리 급수의 결과이다.프로그래머로서 우리는 안전하게 조작할 수 있는 수준에 도달할 때까지 모든 조건을 쓸 것이다.
이 절차는 집행에 적합할 수도 있지만 읽기에는 적합하지 않다.모든 플러그인 단계에 대해 독자는 반드시 끊임없이 증가하는 심지 모델을 유지해야 한다.Setadd방법의 다음과 같은 실현을 고려한다.
public function add($item) {
    if ($item !== null) {
        if (!$this->contains($item)) {
            $this->items[] = $item;
        }
    }
}
논리적으로 프로세스는 항목이 Set이 아니고null 항목이 포함되지 않으면 항목을 추가하는 것이다.
문제는 이런 간단한 동작의 복잡성 뿐만 아니라 이 코드의 주요 동작이 가장 깊은 곳에 묻혀 있다는 데 있다.
이상적인 상황에서 코드 블록의 주요 조작은 맨 위에 있다.우리는 조건문을guard자구로 재구성하여 플러그인 코드를 분해하고 주요 조작을 공개할 수 있다.
guard 자구는 단지 우리의 방법이 이상 경로의 영향을 받지 않도록 보호할 뿐이다.코드 블록의 맨 위에 나타나는 경우가 많지만 어디에나 나타날 수 있습니다.응용 De Morgan's Laws 을 통해 제어를 포기하면, 우리는 모든 끼워 넣은 조건 문장을 보호 서브문장으로 전환할 수 있습니다.코드에서 이것은 우리가 조건을 부정하고 Set 문장을 도입하는 것을 의미한다.
이를 return 방법에 적용함으로써 우리의 실현은 다음과 같다.
public function add($item) {
  if ($item === null || $this->contains($item)) {
      return;
  }

  $this->items[] = $item;
}
이렇게 하는 과정에서 우리는 주요 행동을 열거했을 뿐만 아니라 우리의 방법의 특수한 경로를 강조했다.이제 미래의 독자들에게 그것은 더 이상 그렇게 복잡하지 않다.이상 경로가 뚜렷하게 그려져 있기 때문에 그것도 테스트하기 쉽다.

if로 전환add 문장은 매우 상세한 코드 구조이다.switch 고유하게 4개의 키워드와 3개의 등급이 있다.포함된 코드 블록이 몇 줄만 있어도 많은 내용을 읽어야 한다.이것은 어떤 상황에서는 받아들일 수 있지만 다른 상황에서는 그렇지 않다.
일부 경우, switch 문구가 아닌 if 문구를 사용하면 더 읽을 수 있는 코드가 생길 수 있다.
  • 몇 개switch 블록만 있을 때case 문장의 고유 구조에서 발생하는 행수는 등가switch 문장보다 많다.
  • 블록에 끼워 넣은 코드가 포함될 때 복잡성이 증가하고 가독성이 임계 수준으로 떨어진다.보호 조항을 사용하거나 큰 모듈에서 실천을 하면 코드를 개선할 수 있다.
  • 값을 if의 제약에 유도하기 위해 유형 변환이나 계산이 필요할 때.이것은 더 복잡한case 비교를 지원하는 언어(Swift, Go 등)에는 적용되지 않는다.
  • switch 문장과 블록의 코드 줄 사이의 비율이 1:1일 때 case 문장이 가장 좋다.이 줄이 부치switch문구든 방법이 호출되든 비율이 1:1이면 가독성은 거의 변하지 않는다.
    switch ($command) {
        case 'action':
            startRecording();
            break;
        case 'cut':
            stopRecording();
            break;
        case 'lights':
            adjustLighting();
            break;
    }
    
    주의: case 문장이 간소화된 상황에서 많은 프로그래머들이 맵, 데이터베이스 테이블 또는 다중성으로 대체합니다.이 모든 것은 별도의 선택이다.모든 해결 방안에 균형이 있다는 것을 기억하기만 하면 된다.대부분의 코드에 대해 말하자면 return 문장은 통상적으로'충분하다'.

    복잡회로
    플러그인 코드의 또 다른 흔한 형식은 순환이다.순환은 본질적으로 복잡하다.프로그래머로서 우리는 실수로 증량 논리를 놓쳤다고 저주받았다.다시 한 번 말하지만, 우리는 컴퓨터가 아니라 인간이다.따라서 우리는 순환에 대항하는 전투에서 이길 수 없다.그들은 영원히 우리에게 도전할 것이다.이런 복잡성을 극복하는 유일한 방법은 가독성이다.
    나는 코드 개선에 도움이 될 수 있는 데이터 구조와 알고리즘을 토론하지 않을 것이다.이것은 너무 전문화되었다.그러나 일반적으로 대부분의 순환은 누적이나 호출을 처리한다.코드 라이브러리에 많은 순환이 포함된 것을 발견하면 switch/switch/filter 와 같은 고급 함수를 사용할 수 있는지 확인하십시오.이것은 모든 독자의 가독성을 높일 수는 없지만, 당신의 개인 기능을 향상시킬 것이다.
    팁을 더 원하십니까?이 연습은 매일 작성하는 코드를 개선하는 데 도움을 주는 10가지 실제 연습이 포함된 현장 안내서BaseCode에서 발췌한 것입니다.

    좋은 웹페이지 즐겨찾기