우테코 프리코스에 참가하면서 많은 참가자들이 객체지향 생활체조 9원칙을 지키려고 노력하는 것을 보았다. (본인 포함)
그중에서 아래 원칙을 지키는것이 생각보다 어려웠다.
한 메서드에서 한 단계 들여쓰기만 사용하자
Use only one level of indentation per method
한단계 들여쓰기는 Indent Depth가 1을 의미하는것이고 이는 코드로 치면 아래와 같이 메소드에 if문 하나를 의미한다.
void indentDepth(int n){ //해당 메서드의 indent depth는 1
if(n==1){
return 1;
}
return 0;
}
Indent depth를 2까지로 만드는 데에는 생각보다 간단할것이다. 어지간하면 depth가 3이상으로 가는일이 적기때문에.
하지만 2에서 1로 줄이는 과정이 상당히 어려울 것이라고 생각되고 본인도 상당히 어려웠다.
이 포스트에서는 indent를 줄이는 전략? 방법? 을 본인이 실제 구현하면서 얻은 경험을 기반으로 설명해보려고 한다.
1. 메서드 분리를 한다.
아래와 같은 코드가 있다고 가정해보자
boolean arrayInput(int[] arr,int size){ //size를 판단후 적합하면 배열에 값을 넣어줌
if(n>0){
for(int index=0;index<n;index++){
arr[index]=index;
}
return true;
}
return false;
}
이는 배열에 값을 넣어주는 기능을 가진다. 여기서 indent의 depth는 2이고, 우리는 이를 1로 줄여보고 싶다.
여러방법이 있지만 간단한것은 기능을 분리하여 메서드를 분리하는것이다.
해당 메서드는 size의 판단,값의 부여 이렇게 2가지의 일을 하고있다. 따라서 이를 분리해주면 indent가 줄어들수 있다.
boolean arrayInput(int[] arr,int size){ //size를 판단후 적합하면 배열에 값을 넣어줌
if(n>0){
arrayInput(arr,size);
return true;
}
return false;
}
void input(int[] arr,int size){
for(int index=0;index<n;index++){
arr[index]=index;
}
}
이와 같이 메서드를 분리하면 각각의 indent depth가 1이 됨으로서 줄어드는 것을 볼수 있다.
2. return의 순서를 잘 활용해보자.
위와 같은 코드에서 return의 순서만 적절하게 해주면 메서드의 분리없이 indent가 줄일수 있다.
boolean arrayInput(int[] arr,int size){ //size를 판단후 적합하면 배열에 값을 넣어줌
if(n<=0){
return false;
}
for(int index=0;index<n;index++){
arr[index]=index;
}
return true;
}
먼저 if의 조건 순서를 바꿔줌으로서 조건에 부적합것을 먼저 걸러내고 적합한값만 아래의 로직을 수행하도록 만들었다.
3. 무한루프의 break는 재귀로 바꿔보자.
사실 이 글을 쓰게 된 목적이자 가장 날 힘들게 했던 코드였다
void countNumber(int number){
while(True){
System.out.println("number: "+number);
number--;
if(number==0){
break;
}
}
}
이렇게 특정 조건을 만족해야 무한루프에서 탈출하게 되는 기능을 가진 메서드라고 보자. 이를 줄이자고 메서드를 분리하자니 어디서 분리해야할지도 모르겠고 순서를 바꿔도 의미가 없고 어떻게 해야할지 막막하다.
그럴때는 재귀함수를 떠올려보자! (마치 관점을 BFS에서 DFS로 바꾸는느낌으로!!)
void countNumber(int number){
if(n>0){
System.out.println("number: "+number);
countNumber(number-1);
}
}
이렇게 재귀로 바꿈으로서 indent를 줄일수 있게된다. 하지만 이는 문제가 있다.
작은 크기에 프로그램에서는 재귀함수가 큰 영향을 안미칠수 있지만 프로그램의 규모가 커지고 재귀함수를 상당히 많이 호출하게되면 Stack이 쌓이고 쌓여서 StackOverflowError가 생길수도 있다.
그러니 규모를 판단해서 방법을 사용하기로 하자.
결론, 무조건 depth를 1로 해야만 하는건 아니다!
객체지향 생활체조 9원칙은 지키면 좋다는거지 무조건 준수해야한다가 아니다.(must가 아니란 말이다!)
그러니 상황을 보고 아무리 생각해도 depth를 못줄일거 같으면 안줄이는 방향으로 가도 된다.
하지만 이를 줄일려고 시도하는 과정에서 새로운 코드가 탄생할수도 있다. 그러니 너무 쉽게 포기하지말고 계속 머리를 굴려보는거다!
P.S
현재 이 게시물은 작성자의 경험에 따라서 계속 케이스가 추가될 예정입니다.
혹시 예시에 도움을 주실수 있으면 언제든 댓글이나 연락바랍니다,
'우아한테크코스 6기' 카테고리의 다른 글
2주차 미션 [자동차 경주] 회고록 (1) | 2023.11.01 |
---|---|
싱글톤 패턴(Singleton Pattern) 처음부터 끝까지 (0) | 2023.10.27 |
1주차 미션 [숫자 야구 게임] 회고록 (0) | 2023.10.25 |
DTO와 VO에 관하여 (0) | 2023.10.25 |
객체지향 생활체조 원칙 (0) | 2023.10.25 |