ELSE 문을 사용하지 않고 더 좋은 코드를 작성하고 더 좋은 프로그래머가 되도록

지난 몇 년 동안 나는 줄곧 전문 프로그래머였다.이 기간 동안 나는 대오에서 신속하게 일어났다.나는 처음에는 인턴이었지만 지금은 수석 엔지니어로 제품 한 세트를 책임지고 140여 개국의 16만여 명을 서비스하고 있다.
최근에 나는 몇 년 동안 내가 쓴 모든 코드를 되돌아보았다. (나는 여전히 이 코드에 접근할 수 있다.)나는 Haskell, Scala, Go, Python, 자바, 자바스크립트를 포함한 다양한 언어로 생산 코드를 작성했다.위에서 말한 바와 같이, 나는 ELSE 문장을 거의 사용하지 않는다는 중요한 추세를 알아차렸다.
그러나 나는 다른 언론을 싫어하는 뒤에 명확한 이유가 있다는 것을 깨달았다.나는 그것들이 사용되어서는 안 되고 코드 냄새로 여겨져야 한다고 생각한다.나는 두 가지 이유가 있다고 생각한다.else 문장은 시선의 규칙을 깨뜨렸고, 그것들은 항상 상하문이 부족하다.else 문장을 어떻게 사용하지 않는지 보여주기 전에, 나는 이 두 가지를 상세하게 설명할 것이다.

시선 규칙 #


나는 코드가 미래의 사람들이 읽을 수 있도록 최적화되어야지 기계가 실행할 수 있도록 최적화되어서는 안 된다고 굳게 믿는다.이 점에서 나는 탕나드 크누트의 관점에 찬성한다.

“Programs are meant to be read by humans and only incidentally for computers to execute.” - Donald Knuth, The Art of Computer Programming.


문제는 코드를 읽는 능력이 주관적이라는 점이다. 코드의 가독성을 정확하게 정의하기 어렵다.그러나 이 점을 분명히 하려는 규칙이 있다. 바로 시선의 규칙이다.이것은 바둑계의 유행 규칙이다.Mat Ryer 그의 강연과 문장에서 그에 대해 간결한 정의를 내렸다.간단하게 말하자면, 코드 중의 '즐거움 경로' 는 가능한 한 적게 줄여야 한다.

반대로 어떤 오류 처리나 특수 상황 코드도 한층 더 축소해야 한다.

이 점을 따르는 모든 코드는 독특한 특성을 가지고 있다. 최소한의 코드를 스캔하면 모든 코드 세그먼트가 무엇을 하는지 이해할 수 있다.스캔 들여쓰기 정도가 높은 코드는 발생할 수 있는 모든 특수한 상황과 오류를 보여 줍니다.이것은 그것으로 하여금 한눈에 이해하기 쉽게 한다.
그렇다면 다른 성명은 이와 어떤 연관이 있는가?
Else 문은 코드의 들여쓰기 수준을 낮추도록 하기 때문에 문제가 있습니다.우리는 갑자기 어떤 코드가 즐거움의 길과 관련이 있는지, 그리고 어떤 특례가 있는지 잘 알지 못했다.

이런 선명도가 부족한 상황은 코드를 더욱 스캔하기 어렵게 하고 가독성을 손상시켰다.

배경 부족 #


코드를 신속하고 효율적으로 스캔하는 능력은 매우 중요하다.코드의 일부분을 고립적으로 소화하는 것이 그 중의 관건적인 부분이다.우리는 항상 모든 줄의 코드를 읽어야만 코드 라이브러리의 일부분을 이해할 수 있기를 원하지 않는다.
Else 문은 if 조건과 그 영향을 받은 코드를 분리해서 이 점을 더욱 어렵게 한다.이것은 두 가지 예를 통해 해석하는 것이 가장 좋다.우선, 당신은 나에게 이 세 줄 코드가 실행될 때 무슨 일이 일어날지 알려줄 수 있습니까?
if myVariable == nil { 
    return “”
}
그게 뻔했으면 좋겠어요.예를 들어 살펴보겠습니다.
} else { 
    return “”
}
우리는 if 성명이 없으면 무엇을 의미하는지 확신할 수 없다.왜 빈 문자열을 되돌려줍니까?이것은 잘못입니까 아니면 정상적인 행위입니까?반대로 이 코드는 우리가 앞의 상하문을 기억하고 읽는 데 의존한다.문장이 매우 어렸을 때, 이것은 중요하지 않지만, if { … } 블록에 복잡한 논리가 있거나, 우리가 빠르게 스캔하고 있다면, 상하문과 코드의 분리는 가독성을 심각하게 손상시킬 수 있다.만약if/else 문장이 끼워져 있거나 함수에 여러 개의if/else 문장이 있다면 (이것은 어느 if 문장의else입니까?)

else 문 # 삭제 방법


지금 우리는 일제히 else 문구가 쓰레기라고 생각한다.하지만 그 자체가 큰 도움이 되지는 않았다.진정한 비결은 그것을 피하는 것이다.고맙게도 두 가지 간단한 방법이 있다.
  • 조건 반전if 및 조기 반환
  • 조수 함수를 만듭니다.
  • 비틀림 상태 #


    이것은 내가 만난 가장 흔히 볼 수 있는 예다.그것도 두 가지 형식이 있는데 하나는 은식else이고 다른 하나는 현식이다.명시적인 버전은 다음과 같습니다.
    func doSomething() error {
      if something.OK() {
        err := something.Do()
        if err != nil {
          return err
        }
      } else {
        return nil, errors.New("something isn't ok")
      }
    }
    
    암시적 문은 유사하지만 else 문 자체는 포함되지 않습니다.반면else은 함수의 끝을 간단하게 삭제함으로써 나타난다(이 점은 파이톤이나 자바스크립트에서 더 흔히 볼 수 있으며 명확한 설명이 없으면 되돌아온다Noneundefined.
    function doSomething() {
      if (something.OK()) {
        return something.Do()
      }
    }
    
    마찬가지로 이 같은 행위의 전체 정도를 잘 알지 못한다.전체 함수를 읽지 않으면 반환 값이 명확하지 않습니다.
    간단한 반전if 조건을 통해 우리는 이 모든 문제를 해결할 수 있다.
    function doSomething() {
      if (!something.OK()) {
        // return or throw error
      }
      return something.Do()
    }
    
    우리는 이제 이 함수를 스캔해서 오류 조건과 정상적인 절차를 똑똑히 볼 수 있고 시선 규칙을 만족시킬 수 있다.이런 행위는 완전히 명확해서 우리는 상하 문장을 구분하지 않는다.많이 좋아졌어요.

    보조 함수 #


    우리는 또 다른 문장을 얻었는데, 그것들은 직접적으로 발생하지 않을 것이다. return이것은 통상적으로 정확하게 격리되지 않은 특수한 상황 논리를 통해 실현된 것이다.예컨대
      let charities
      if (country != "") {
        if (tier != "") {
          charities = getCharitiesByCampaignCountryAndTier(campaign, country, tier)
        } else {
          charities = getCharitiesByCampaignAndCountry(campaign, country)
        }
      } else {
        charities = getCharitiesByCampaign(campaign)
      }
    
      // do something with charities
    
    자선 획득 논리를 자신의 기능에 도입함으로써 가독성을 높일 수 있다.이렇게 하면 특수한 상황을 적절하게 처리하고 가능한 한 빨리 돌아올 수 있다.일부if문장을 반전함으로써 이 점을 더욱 개선할 수 있다.
    예를 들면 다음과 같습니다.
    function getCharities(campaign, country, tier) {
      if (country == "") {
        return getCharitiesByCampaign(campaign)
      }
    
      if (tier == "") {
        return getCharitiesByCampaignAndCountry(campaign, country)
      }
    
      return getCharitiesByCampaignCountryAndTier(campaign, country, tier)
    }
    
    이 helper 함수는 우리가 필요로 하는 모든 논리를 교묘하게 봉하여 다른 문장에 대한 수요를 없애고 즐거움 경로 코드의 왼쪽을 유지하는 데 더욱 잘한다.이것은 스캔하기 쉽기 때문에 가독성도 더욱 높다.

    결론 #


    Else 문은 이상한 코드 냄새입니다.그것들은 같은 단계의 축소를 강제로 실행함으로써 오류 처리와 경로를 최적화시켜 모든 코드의 가독성을 손상시켰다.그것들은 또한 코드와 코드에 영향을 주는 논리를 분리하는 독특한 능력을 가지고 있다.미리 되돌아오는 것과 논리를 보조 함수로 나누는 두 가지 기술을 통해 피하기 쉽다.그래서 그것들은 불필요하다.너는 그것들을 사용하지 않고 더 좋은 코드를 작성해서 더 좋은 프로그래머가 될 수 있다.
    약간의 경고.
  • SQL 상황에서...그렇지 않으면...정말 피할 수 없다.
  • Scala에서 스텔스 리턴 (투명하게 인용하기 위해 리턴 문장을 피하기 위해서) 은 스텔스 리턴을 사용해야 한다는 것을 의미합니다. 사실상 '미리 리턴' 능력이 없습니다.
  • 삼원 연산자는 가능합니다.
  • python에서 삼원 연산자는 else를 사용한다.그것도 좋아요.
  • 좋은 웹페이지 즐겨찾기