본문 바로가기

클린코드

[클린코드 독서] 5장 - 형식 맞추기

EFUB에서 맛집전공을 개발하면서 절실하게 느꼈던 부분이다. 나는 항상 그전까지는 팀프로젝트를 진행하더라도 별다른 코드컨밴션 없이 진행하곤했는데, EFUB에서 처음으로 팀끼리 코드컨벤션(코드 짜는 형식맞추기)를 진행했었다. 이런 부분을 미리 합의하고 들어가니까 서로의 코드를 이해하기도 쉽고, 한사람은 카멜체로 한사람은 팟홀체로 적는 불상사가 없었다  ^0^/

하지만 코드컨벤션을 맞춰보는게 처음이라 어떤 형식이 좋은형식인지에 대해 무지했었는데, 클린코드를 통해서 좀더 감을 잡을 수 있었다


1. 적절한 행 길이

  • 소스 코드는 얼마나 길어야 적당할까? - 프로젝트마다 다르지만, 가능하다면 적게 유지하는것이 좋음.(200줄)

  • 소스 코드 순서는 어떻게 해야할까?
    - 고차원에서 저차원 함수로 자연스럽게 읽히도록 구성 (신문처럼: 표지 -> 부제 -> 내용 -> 각주)

  • 빈 행으로 개념을 분리시키기 - 패키지문 / import문 / 함수 이런 개념들을 빈 행으로 분리하라는것
    /*빈 행 예시코드*/
    package fitnesse.wikitext.widgets;
    //빈 행
    import java.util.regex.*;
    //빈 행
    public calss BoldWidget extends ParentWidget {
    	public static final String REGEXP = "'''.+?'''";
    	private static final Pattern pattern = pattern.compile("'''(.+?)'''",
    		pattern.MULTILINE + Pattern.DOTALL
    	);
    	//빈 행
    	public BoldWidget (ParentWidget parent, String text) throws Exception {
        	super(parent);
            Matcher match = pattern.matcher(text);
            match.find();
            addChildWidgets(match.group(1));
    	}
        //빈 행
        public String render() throws Exception {
        	StringBuffer html = new StringBuffer("<b>");
            html.append(childHtml()).append("<b>");
            return html.toString();
        }
    }
     
  • 서로 밀접한 코드행은 세로로 가까이 놓아야한다 - 줄바꿈이 개념의 분리라면, 세로 밀집도는 연관성을 의미

    • 서로 밀접한 개념은 세로 거리가 가까워야한다
      - 위와 비슷한 내용이지만, 위의 경우에는 코드 한줄한줄을 의미한거라면, 지금은 함수단위를 얘기하는것이다! 
      - 게임 시작시 데이터를 불러오는 loadGameData()라는 함수안에 loadPlayerData()와 loadShopData()가 있다면    두 함수를 loadGameData 함수 밑에 적어놔야 보기가 편하다는뜻!

    • 서로 밀접한 개념은 같은 파일에 존재해야한다
      - 위 규칙과 비슷한 개념! 비슷한 개념이라면 같은 파일에 있는게 타당함

    • 변수는 사용 위치와 최대한 가까운곳에 선언한다
      - 짧은 함수들같은 경우는 변수를 함수 맨처음에 선언
      - 인스턴스 변수는 클래스 맨 처음에 선언한다. 그리고 변수간에 세로로 거리를 두지 !!않는다!!
        흔히 C++을 클래스 마지막에, JAVA는 클래스 처음에 선언한다고한다(인스턴스 변수를)
      - 상수를 적절한 수준에 두는 좋은예가 105pg에 있음. 일부로 잘알려진 함수가 저차원 함수에 묻히지 않도록      저차원 함수에서 직접 쓰지않고 고차원에서 저차원으로 해당 상수를 넘겨주는 방식을 택함
    • 종속 함수끼리 세로로 가까이 두기 - 호출하는 함수가 호출되는 함수보다 위에 있도록 배치하면 더 깔끔
    • 종속함수처럼 서로 연관된 것이 아니여도 개념적으로 유사하다면 가까이에 배치하기
      비슷한 동작을 수행하는 함수들
      public class Assert {
      	
          static public void assertTrue(String message, boolean condition) {
          	if(!condition)
              	fail(message);
          }
          
          static public void assertTrue(boolean condition) {
          	assertTrue(null, condition);
          }
          
          static public void assertFalse(String message, boolean condition) {
          	assertTrue(message, !condition);
          }
          
          static public void assertFalse(boolean condition) {
          	assertFalse(null, condition);
          }
          ...
      }

 

2. 가로 형식 맞추기

  • 행 길이는 짧은게 바람직하다 - 80자 정도가 바람직하긴하지만, 너무 일률적이므로 120자 제한이 좋다고 생각.
  • 가로로는 공백을 이용해 개념간 밀접성을 표현 
    예를들어 할당 연산자를 강조하기 위해 앞뒤로 공백을 주는것 ex) int answer = a+b;
    - 함수이름과 함수괄호 사이는 공백을 넣지 않음. ( 함수와 파라미터는 서로 밀접하니까)
    - 파라미터 안의 인수끼리는 공백으로 구분함
    - 연산자 우선순위를 강조하기 위해 공백도 사용할 수 있음 (곱셈처럼 높은 우선순위는 공백없이, +-는 공백)
  • 쓸데없이 가로정렬하지말기 - 오히려 중요한 정보를 안읽게된다.
    /*bad example*/
    public class FitNesseExpediter implements ResponseSender {
    	//원래 붙여서 쓰는데 티스토리가 안띄우면 헛짓하길래 띄움
        //이런식으로 하면 private같은 중요한 정보 떼먹고 이름부터 보게돼버림
        private 	Socket		socket;
        private 	InputStream	input;
        private 	OutputStream	output;
        private 	Request		request;
        ...
    }
    
    /*good example*/
    public class FitNesseExpediter implements ResponseSender {
    	
        private Socket socket;
        private InputStream input;
        private OutputStream output;
        private Request request;
        ...
    }
  • 들여쓰기하기 - 좀 당연한 규칙인데, 이제 짧은 if문같은경우 한줄에 쓰고싶은경우가 있음. 그럴때도 들여쓰기로하기
  • 빈 while/for문 세미콜론 들여써서 적어주기 - 사실 생전 처음 들어본거다. 빈 while문???
    - 글쓴이는 이런 구조를 좋아하지 않아서 피하려고 애쓴다고한다.
    - 빈부분을 확실히 줄바꿈해서 들여쓰고 세미콜론 붙이기(한마디로 줄바꿈하고 세미콜론 들여쓰기)
    public class someClass() {	
        
        while (dis.read(buf, 0, readBufferSize != -1)
        ; //요렇게 들여써주기
        
    }

3. 팀규칙

  • 팀끼리 한가직 규칙으로 합의해서 그 규칙을 따르기.
  • 헐 IDE 코드 형식기를 내가 원하는 규칙으로 설정하는게 가능해??? 그러면 괜히 수동으로 형식 맞추려고 노력한거네 헐...

4. 글쓴이가 자주쓰는 규칙

  • 114페이지부터 참조

 

나중에 코드짤때마다 이글보면서 해야겠다