개발 , 컴퓨터, IT지식

[객체지향 생활체조 원칙] 1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.(1/9)

김먼저 2022. 12. 1. 10:44

"잘 알아서 책을 쓰는 게 아니라 책을 쓰면서 알아간다" 라는 말처럼

 

 

객체지향언어의 프로그래밍 훈련에 대해 포스팅하며 배우고자 합니다.

 

 

(구글링하다가 우연히 호돌님 블로그에서 감명깊게 읽고 가져왔습니다.)

 

 

 

Object Calisthenics(객체지향 생활체조)는 Jeff Bay가 그의 저서
The ThoughtWorks Anthology에서 발명한 9가지 규칙의 집합으로 공식화 된
프로그래밍 훈련이다. Object라는 단어는 Object Oriented Programming
(객체지향 프로그래밍)의 Object를 의미하며, Calisthenics라는 단어는 체조의 맥락에서
운동을 의미한다. 규칙을 지키면 자연스럽게 코드 작성 방식이 변경된다.
항상 모든 규칙을 따라야한다는 의미는 아니며, 이 규칙과 균형을 이루고, 그 규칙에 익숙하다고 느끼는 경우에 한해 일부를 사용해야 한다.

규칙들은 코드의
유지보수 가능한, 가독성 좋은, 테스트 가능한, 이해하기 쉬운 코드
만드는 것에 중점을 둔다.

 

 

 

 

목차

1. 한 메서드에 오직 한 단계의 들여쓰기
2. else 키워드를 사용하지마라
3. 모든 원시값과 문자열을 포장하라
4. 일급 콜렉션을 사용하라
5. 한 줄에 점은 오직 하나만 사용하라
6. 축약하지 말라
7. 클래스는 50줄 이하로 유지하라
8. 인스턴스 변수는 2개 이하로 유지하라
9. Getter,Setter를 사용하지 마라

 

 

 

 

 

 

1. 한 메서드에 오직 한 단계의 들여쓰기

 

코드 작성 시 if, for문 등에서 들여쓰기(indent)를 쓰게 된다. 들여쓰기가 많아질수록 가독성과 유지 보수의 용이함을 저해하는 경우가 생긴다. 여러 분기나 반복문이 중첩되는 경우 코드를 보고 이해하기 위해 머릿속에서 그 과정을 실행해봐야 하기 마련이다. 다음 코드를 확인해보자.

 

public class NumberBoard{

	int boardNumber[][] ={
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15}
	};
	// 들여쓰기 1
	public int sumBoardNumbers(){
		int sum = 0;
		//들여쓰기 2
		for(int row[] : boardNumbers){
		//들여쓰기 3
		 for(int column : row){
		 //들여쓰기 4
		 	sum += column;
		 }//inner for
		}//outer for
		return sum;
	}// sumBoardNumbers
}//class NumberBoard

 

이렇게 들여쓰기가 깊어지면, 이를 메소드(함수)들도 나눌 필요가 생긴다. 마틴 파울러는

 

리팩토링에서 메소드 추출(Extract Method) 패턴을 제시한다. 전체 코드량은 늘어나겠지만

 

메소드에 적당한 이름을 붙이고 들여쓰기 단계를 줄임에 따라 가독성을 높일 수 있다.

 

Transpile과 Uglify(난독화)를 거치면 결과적으로 코드량도 크게 차이나지 않을 것이다.

 

 

 

 

 

 

 메서드 추출/구조 분리 후 코드

 

 public class NumberBoard {

        int [][] boardNumbers = {
                {1, 2, 3, 4, 5},
                {6, 7, 8, 9, 10},
                {11, 12, 13, 14, 15}
        };

        public int sumBoardNumbers() {
            return sumRows();
        }

        private int sumRows() {
            int sum = 0;
            for (int[] row : boardNumbers) {
                sum += sumColumns(row);
            }
            return sum;
        }

        private int sumColumns(int[] row) {
            int sum = 0;
            for (int column : row) {
                sum += column;
            }
            return sum;
        }
}//class NumberBoard

 

 

숨은 의미

이 원칙의 제시 의도는 메서드 구조를 분리함으로써 한 단락은 하나의 일만 하도록 설계하자는 것이다. 로직이 잘개 쪼개질수록 메서드간의 로직적 결합도는 낮아지고, 응집도는 높아진다. 이러한 코드는 재사용성이 높고, 메서드명을 기반으로 작성되기 때문에 가독성도 좋다.
 프로그래밍은 글을 쓰는 행위와의 접점이 많다. 우리가 자기소개서와 같이 남에게 보여주기 위한 글을 쓸 때에는, 문장을 쪼개서 짧고 간결하게 만들려고 노력한다. 또 문단을 나누고 소제목을 붙이기도 하는데, 이러한 노력들이 객체지향 생활체조 원칙의 규칙 1과 비슷하다.