읽기 좋은 코드가 좋은 코드다/2 - 미학

‘읽기 좋은 코드가 좋은 코드다’를 읽고 정리한 내용입니다. 문제가 될 시에는 삭제하겠습니다.

미학

좋은 소스코드는 눈을 편하게 해야 한다. 이러한 방법은 빈칸, 정렬, 변수명, 코드의 순서 등을 알맞게 수정하는 방법으로 이뤄낼 수 있다. 특히 아래의 세가지 원리가 이용된다.

  • 코드를 읽는 사람이 이미 친숙한, 일관성 있는 레이아웃을 사용하라.
  • 비슷한 코드는 서로 비슷해 보이게 만들어라.
  • 서로 연관된 코드는 하나의 블록으로 묶어라.

다음 아래의 두가지 코드를 보면 1)번 보다는 당연히 2)번이 이해하기 훨씬 쉬운 코드라는 것을 알 수 있다.

1)

1
2
3
4
5
6
7
8
9
10
11
12
13
class StatsKeeper {
public : 
// 일련의 더블 변수값을 저장하는 클래스
	void Add(double b); // 그리고 그런 값들에 대한 간단한 통계를 계산하는 메소드
    private: int count; /* 지금까지 몇 개가 저장되었는가
    */ public :
    		double Average();
            
    private : double minimum;
    list<double>
    	past_items
        	; double maximum;
}

2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 일련의 더블 변수값을 저장하는 클래스
// 그리고 그런 값들에 대한 간단한 통계를 계산하는 메소드
class StatsKeeper {
	public : 
		void Add(double b); 
        double Average();
            
    private : 
    	private: int count; // 지금까지 몇 개가 저장되었는가
    	list<double> past_items; 
        
    	double maximum;
        double minimum;
}


일관성과 간결성을 위해서 줄 바꿈을 재정렬하기

자신이 속해있는 조직에서 특정한 코딩 규칙, 즉 Convention을 가지고 있지 않다면 한 눈에 보기에도 편하게 보이도록 하는 것이 일반적인 사람들의 생각일 것이다. 따라서, 줄 바꿈을 하게되면 하나의 메소드나 클래스에만 줄 바꿈 규칙을 적용할 것이 아니라 같은 depth에 위치한 메소드나 클래스에도 같은 규칙을 적용해 주어야 한다.

또한, 주석을 달아서 메소드나 클래스, 그리고 파라미터에 대한 설명을 추가한다고 할 경우에는 세로로 너무 많은 공간을 차지하지 않도록 하는 방법을 사용할 수 있다.

1
2
3
4
5
6
7
public class PerfomanceTester {
	// TcpConnectionSimulator (처리량, 	지연속도,	흔들림,	패킷_손실)
    //									[Kbps]		 [ms]		   [ms]		  [percent]
    
    public static final TcpConnectionSimulator wifi = 
    	new TcpConnectionSimulator(500, 	80, 		200, 		1);
}


메소드를 활용하여 불규칙성을 정리하라

어떤 함수 내부에서 테스트를 하는 과정에서의 중복성이 발생한다면, 해당하는 부분을 특정 메소드로 빼서 사용하는 방법을 사용할 수 있다. 이러한 방법은 줄의 길이를 줄이고 가독성을 향상시키는 효과를 가져온다. 또한 추가적인 테스트를 진행하기에도 훨씬 간결하고, 에러가 발생할 경우에 어느부분에서 에러가 발생했는지 또한 쉽게 찾을 수 있다.


코드의 열을 맞춰라.
1
2
3
4
5
details		= request.Post.get('details');
locations	  = request.Post.get('locations');
phone	  	= requets.Post.get('phone');
email		  = equest.Post.get('email');
url			= request.Post.get('url');

위의 코드를 보면 한눈에 어느부분에서 오타가 났는지 알 수 있다. 이는 열을 정렬하였기 때문에 어느부분에서 차이가 발생하는지 쉽게 알 수 있기 때문이다.


선언문을 블록으로, 문단으로 쪼개서 구성하라

우리의 뇌는 계층구조로 따라서 동작하기 때문에 코드를 계층구조로 작성하는 것은 사용자가 코드를 이해하는데 좋은 효과를 준다. 따라서 선언문과 같이 전체의 구조를 한번에 가지고 있는 경우에는 주석으로 그룹을 나누고 선언문들을 줄 바꿈 등으로 나누어 주면 전체 구조를 이해하는데 도움을 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class FrontendServer {
	public :
    	FrontendServer();
        ~FrontendServer();
        
        //핸들러
        void ViewProfile(HttpRequest* request);
        void SaveProfile(HttpRequest* request);
        void FindFriends(HttpRequest* request);
        
        //질의/응답 유틸리티
        string ExtractQueryParam(HttpRequest* request, string param);
        void ReplyOK(HttpRequest* request, string html);
        void ReplyNotFound(HttpRequest* request, string error);
        
        //데이터베이스 헬퍼
        void OpenDataBase(string location, string user);
        void CloseDataBase(string location);
}