728x90
이 문제는 마린이 스팀팩을 쓰면 자신의 체력이 10 깎이고, 메딕이 힐을 써주면 마린의 체력이 10 올라가게 하는 프로그램을 구성하는 것이다.
딱 봤을 때는 유치해 보일지는 모르겠지만 이 문제에서 클린 코드를 만들기 위한
- 메소드 분리 + 클래스를 분리하는 리팩토링 경험
을 간단히 진행할 수 있었다.
클린코드를 위한 가이드
1) 작게 만들어라.
- 함수를 만드는 첫 번째 규칙은 '작게'다. 함수를 만드는 두 번째 규칙은 '더 작게'다.
2) 한 가지만 해라.
- 함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만 해야 한다.
3) 함수 당 추상화 수준은 하나로
- 함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문장이 동일한 추상화 수준에 있어야 한다.
- 코드는 위에서 아래로 이야기처럼 일해야 좋다.
4) 서술적인 이름을 사용하라
- 이름이 길어도 괜찮다.
- 이름을 정하느라 시간을 들여도 괜찮다.
- 이름을 붙일 때는 일관성이 있어야 한다.
다음과 같다.
(출저 - 박재성(자바지기) 의 클린코드)
우선 나의 첫번째 코드는 이러했다.
public class StarCraft {
String name;
int hp;
public StarCraft(String name, int hp) {
this.name = name;
this.hp = hp;
}
void stimpack(){
System.out.printf("[%s]의 스팀팩! HP: %d -> ", name, hp);
hp -= 10;
System.out.printf("%d\n", hp);
}
void heal(StarCraft hero){
System.out.printf("[%s]의 치유! => [%s] HP(%d -> ",this.name , hero.name, hero.hp );
hero.hp += 10;
System.out.printf("%d)", hero.hp);
}
public static void main(String[] args) {
// 객체 생성
StarCraft marine = new StarCraft("레이너",80);
StarCraft medic = new StarCraft("모랄레스",60);
// 마린의 스팀팩!
marine.stimpack();
// 메딕의 힐!
medic.heal(marine);
}
}
물론 정상적으로 잘 실행된다.
하지만 StarCraft 라는 클래스 안에 서로 반대되는 일을 하는 메소드가 2개 들어가 있다.
이 문제는 간단해서 크게 어려움은 없지만 만약 코드가 복잡해 진다면 이러한 방식의 코드 작성은
누가 봐도 한눈에 이해할 수 있는 깔끔한 코드 즉 Clean Code라고 하기에는 거리가 있어 보인다.
이때 한 클래스에 들어있는 메소드들을 각각의 클래스로 분리시켜 준다면 어떨까?
public class StarCraft {
public static void main(String[] args) {
// 객체 생성
marine marine = new marine("레이너",80);
medic medic = new medic("모랄레스",60);
// 마린의 스팀팩!
marine.stimpack();
// 메딕의 힐!
medic.heal(marine);
}
}
//마린 클래스 (스팀팩 메소드가 포함)
class marine{
String name;
int hp;
public marine(String name, int hp) {
this.name = name;
this.hp = hp;
}
void stimpack(){
System.out.printf("[%s]의 스팀팩! HP: %d -> ", this.name, this.hp);
hp -= 10;
System.out.printf("%d\n", this.hp);
}
}
//메딕 클래스 (힐 메소드가 포함)
class medic{
String name;
int hp;
public medic(String name, int hp) {
this.name = name;
this.hp = hp;
}
void heal(marine hero){
System.out.printf("[%s]의 치유! => [%s] HP(%d -> ",this.name , hero.name, hero.hp );
hero.hp += 10;
System.out.printf("%d)",hero.hp);
}
}
한눈에 보아도 코드의 가독성이 좋아진 것을 알 수 있다.
객체를 생성할 때부터 각각은 어떠한 타입의 객체인지 쉽게 알 수 있고 그 객체가 어떠한 메소드를 가지고 있는지 한눈에 알기 쉽다.
아까 말했다시피 이 문제는 매우 간단한 문제이기 때문에 첫 번째 방법으로도 문제를 풀기에 크게 무리는 없지만
코드가 점점 더 복잡해진다면 Clean Code의 효과가 더욱 커질 것이다.
'JAVA with TDD, Clean Code' 카테고리의 다른 글
JAVA(자바) 단위 테스트 실습 - 숫자야구게임 구현 (0) | 2021.09.17 |
---|---|
JAVA(자바) 단위 테스트 실습 - 문자열 계산기 (0) | 2021.09.03 |
JUnit, AssertJ, 단위테스트 개념 및 다양한 활용법 (0) | 2021.08.04 |
Set Collection에 대한 학습 테스트 (0) | 2021.07.30 |
String 클래스에 대한 학습 테스트 (0) | 2021.07.29 |