깨끗한 코드 작성

나는 최근에 새로운 일을 시작했다.모든 새로운 업무는 새로운 코드 라이브러리를 가져올 것이다.이것은 아마도 나의 스무 번째 일일 것이다.그래서 나는 많은 코드 라이브러리를 본 적이 있다.
불행하게도, 그것들은 모두 같은 근본적인 문제인 불일치에 직면해 있다.아마도 다년간의 코드 수리, 대형 팀, 이수 또는 이상의 모든 작업의 결과일 것이다.
우리가 코드를 읽는 것이 코드를 쓰는 것보다 훨씬 많기 때문에 문제가 생겼다.내가 새로운 코드 라이브러리를 읽을 때, 이 일치하지 않는 부분들은 내가 실제 코드에 대한 주의력을 분산시켰다.나의 중점은 중요한 업무 논리가 아니라 축소와 변수 추적의 일상적인 업무로 옮겨졌다.
여러 해 동안, 나는 나 boy scout 가 같은 방식으로 새로운 코드 라이브러리를 세웠다는 것을 발견했다.나는 코드를 정리하고 읽을 수 있도록 세 가지 간단한 실천을 응용했다.
시범을 보이기 위해서, 나는 이것들을 내가 며칠 전에 읽은 아래의 실제 코드에 적용할 것이다.
function check($scp, $uid){
  if (Auth::user()->hasRole('admin')){
    return true;
  }
  else {
  switch ($scp) {
    case 'public':
      return true;
      break;
    case 'private':
      if (Auth::user()->id === $uid)
        return true;
      break;
    default: return false;
  }
  return false;
  }
}

코드 스타일 적용


나는 내가 1647번째로 너의 코드를 포맷한다고 말하는 사람이라는 것을 안다.그러나 이것은 분명히 설명이 필요하다.내가 연구한 거의 모든 코드 라이브러리는 코드 스타일을 채택하지 않았다.강력한 IDE, 사전 제출 연결, CI 파이프의 가용성 때문에 거의 노력 없이 코드 라이브러리를 일치하게 포맷할 수 있다.
만약 목표가 코드의 가독성을 높이는 것이라면 코드 스타일을 사용하는 것이 이 목표를 실현하는 유일하고 가장 좋은 방법이다.마지막으로 어떤 코드 스타일을 채택하는지는 중요하지 않다.오직 너만이 시종일관 그것을 응용한다.코드 스타일에 동의하면 IDE를 구성하거나 코드를 자동으로 포맷할 수 있는 도구를 찾을 수 있습니다.
우리의 코드는 PHP이기 때문에 나는 채택PSR-2 code style을 선택했다.나는 PHPCodeSniffer에서 PHP 코드 미화기를 사용하여 코드 형식을 자동으로 복구한다.
다음은 코드 스타일을 사용한 동일한 코드입니다.축소는 우리로 하여금 코드의 구조를 더욱 쉽게 볼 수 있게 한다.
function check($scp, $uid)
{
    if (Auth::user()->hasRole('admin')) {
        return true;
    } else {
        switch ($scp) {
            case 'public':
                return true;
            break;
            case 'private':
                if (Auth::user()->id === $uid) {
                    return true;
                }
                break;
            default:
                return false;
        }
        return false;
    }
}

사물을 정확하고 명확하게 명명하다


그래, 너는 이미 충분히 들었다.알아naming things is hard.명명이 어려운 원인 중 하나는 명확한 명명 규칙이 없다는 것이다.이것은 모두 배경에 관한 것이다.코드 중의 상하문은 자주 변화가 발생한다.
이 상하문으로 이름을 그려라.일단 명확한 이름을 찾으면 모든 상하문에 적용하고 그것들을 연결시켜라.이것은 일치성을 만들고 코드 라이브러리에서 변수를 추적하기 쉽습니다.
전통적인 명명 약속을 엄격히 사용하는 것을 걱정하지 마라.나는 코드 라이브러리가 혼합되어 일치하는 것을 자주 발견한다.뚜렷한 이름은 snake_casecamelCase보다 훨씬 중요하다.현재 환경에서 시종일관 그것을 응용하기만 하면 된다.
만약 네가 끊겼다면, 임시 이름을 사용하고 인코딩을 계속해라.나는 곤경에 빠지지 않도록 사물의 이름$bob이나$whatever을 자주 붙인다.나머지 부분의 인코딩을 끝낸 후에 나는 변수를 되돌려 이름을 바꾸었다.그때가 되자 나는 더 많은 배경 지식을 얻었고, 항상 명확한 이름을 찾을 수 있었다.
명확한 명칭은 미래의 독자들이 이 코드를 더욱 빨리 이해할 수 있도록 도와줄 것이다.그들은 반드시 완벽해야만 하는 것은 아니다.미래 독자의 읽기 신호를 강화하는 것이 목적이다.아마도 그들은 그들이 제공할 수 있는 심지 능력으로 점차 이름을 높일 수 있을 것이다.
이 코드를 분석한 후에 나는 더 많은 상하문이 생겨서 더 뚜렷한 이름을 선택했다.명확한 명칭을 응용하면 가독성을 높일 뿐만 아니라 상하문도 강화하여 코드의 의도를 더욱 쉽게 이해할 수 있다.
function canView($scope, $owner_id)
{
    if (Auth::user()->hasRole('admin')) {
        return true;
    } else {
        switch ($scope) {
            case 'public':
                return true;
            break;
            case 'private':
                if (Auth::user()->id === $owner_id) {
                    return true;
                }
                break;
            default:
                return false;
        }
        return false;
    }
}

코드 중첩 방지


플러그인 코드에 관해서는 엄격한 규칙이 있다.많은 개발자들은 끼워 넣는 단계만 허용해야 한다고 생각한다.일반적으로 나는 하드 숫자 규칙을 무시하는 경향이 있다.그들은 코드의 유동성이 매우 강한 상황에서 매우 자유롭다고 생각한다.
더 중요한 것은 코드를 끼워 넣는 것은 통상적으로 불필요하다는 것이다.나는 함수의 전체 주체가 하나if에 둘러싸여 있는 것을 이미 보았다.나는 몇 층의 둥지를 짓는 것을 본 적이 있다.나는 확실히 빈 else 거리를 본 적이 있다.일반적으로 보호 서브문장, 반전 조건 논리를 추가하거나 이용return을 하면 플러그인 코드의 수요를 없앨 수 있다.
이 예에서, 나는 기존의 return 문장을 이용하여 switch 코드를 뒤집어서 대부분의 플러그인을 삭제할 것이다.
function canView($scope, $owner_id)
{
    if ($scope === 'public') {
        return true;
    }

    if (Auth::user()->hasRole('admin')) {
        return true;
    }

    if ($scope === 'private' && Auth::user()->id === $owner_id) {
        return true;
    }

    return false;
}
마지막으로 인코딩은 바로 쓰기다.작가로서 너는 독자에 대해 책임을 져야 한다.일치된 풍격, 어휘, 절차를 유지하는 것이 가독성을 확보하는 가장 간단한 방법이다.이 내용을 삭제하거나 변경하고 필요 없는 가독성을 유지합니다.
이 실천들을 실행에 옮기는 것을 보고 싶습니까?나는 이 실천과 더 많은 것을 실시간 인코딩을 통해 보여줄 무료, 1시간 동안의 세미나를 진행할 것이다.Sign up 당신의 위치를 보호하세요.

좋은 웹페이지 즐겨찾기