코드스멜 100 - GoTo

GOTO는 50년 전에 유해한 것으로 간주되었습니다.

TL;DR: Don't ever use GoTo.



문제


  • 가독성
  • 따라하기 어려운 코드

  • 솔루션


  • GOTO을 구조화된 코드
  • 로 교체
  • 예외 사용

  • 문맥



    Basic에서 프로그래밍을 시작했습니다.

    GOTO는 그곳에서 심하게 학대당했습니다.

    재활 모드에서 처음부터 구조화된 프로그래밍을 배워야 했습니다.

    샘플 코드



    잘못된




    for x < 0 {
        if x > -1e-09 {
          goto small
        }
        z = z / x
        x = x + 1
      }
      for x < 2 {
        if x < 1e-09 {
          goto small
        }
        z = z / x
        x = x + 1
      }
    
      if x == 2 {
        return z
      }
    
      x = x - 2
      p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
      q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
      return z * p / q
    
    small:
      if x == 0 {
        return Inf(1)
      }
      return z / ((1 + Euler*x) * x)
    }
    

    오른쪽



    for x < 0 {
        if x > -1e-09 {
          return small(x, z)
        }
        z = z / x
        x = x + 1
      }
      for x < 2 {
        if x < 1e-09 {
          return small(x, z)
        }
        z = z / x
        x = x + 1
      }
    
      if x == 2 {
        return z
      }
    
      x = x - 2
      p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
      q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
      return z * p / q
    
    small(x, z){
      if x == 0 {
         return Inf(1)
       }
       return z / ((1 + Euler*x) * x)
     }
    }
    

    발각



    [X] 자동

    GOTO를 지원하는 언어에서 린터는 사용에 대해 경고할 수 있습니다.

    태그


  • 가독성

  • 결론



    우리는 수십 년 전에 GOTO 문제를 인정했습니다.

    문제는 현대 언어에도 여전히 존재합니다.

    대부분의 프로그래머는 다행스럽게도 GOTO 문장을 피합니다. 다음 목표는 해로운 것으로 간주하는 것입니다.



    예의XKCD

    처지







    더 많은 정보


  • Goto Statement considered harmful
  • Wikipedia

  • 학점



    Jens JohnssonUnsplash의 사진


    이전에 BASIC에 노출된 적이 있는 학생들에게 좋은 프로그래밍을 가르치는 것은 사실상 불가능합니다. 잠재적인 프로그래머로서 그들은 재생의 희망을 넘어 정신적으로 절단됩니다.

    Edsger Dijkstra






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기