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의 효과가 더욱 커질 것이다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

복사했습니다!