You will be fine

<자바로 배우는 리팩토링 입문> 4장~6장

by BFine
반응형

4장. 널 객체 

 a. 일반 null 

  -  Person이라는 클래스 안에는 Dog라는 클래스를 가지고 있다. PersonDog를 하나만 가질 경우에는

      dog2 에는 null을 입력한다.

class Person{

    private final Dog dog1;
    private final Dog dog2;

    public Person(Dog dog1, Dog dog2){
        this.dog1 = dog1;
        this.dog2 = dog2;
    }
    public Person(Dog dog1){ 
        this(dog1, null);
    }
}

 

 b. 널객체 도입

  - 위의 코드에 널객체를 도입해보자. Dog 클래스에 isNull() 메서드를 추가한다.

  - 그리고 NullDog이라는 클래스를 생성하고 상속받아서 isNull() 메서드를 Override 하자

class Dog{
    private String name;

    public Dog(String name){
        this.name = name;
    }

    public boolean isNull(){
        return false;
    }
}

class NullDog extends Dog{

    public NullDog() {
        super("(none)");
    }

    @Override
    public boolean isNull() {
        return true;
    }
}

- 그리고 Person객체에서 null 대신 NullDog을 추가하자

class Person{

    private final Dog dog1;
    private final Dog dog2;

    public Person(Dog dog1, Dog dog2){
        this.dog1 = dog1;
        this.dog2 = dog2;
    }
    public Person(Dog dog1){ 
        //this(dog1, null);
        this(dog1, new NullDog());
    }
}

- 이렇게 하면 null 대신에 사용가능하다

public boolean hasDog2(){
     
     if(dog2.isNull()){
        return false;
      }
     
     // if(dog2 == null){
     //  return false;
     // }
     
     return true;
 }

 

 c. 조건 판단 삭제하기

  -  조건문 자체를 안쓰게 만들수도 있다. 널객체에 내용없는 메서드를 추가하자.

  -  이런식으로 하면 null 체크를 하지않아도 의미없는 실행을 통해 로직을 구현할 수 있다.

class Dog{
    private String name;
          .  . . 
    public void display(){
        System.out.println(name);
    }
}

class NullDog extends Dog{
    public NullDog() {
        super("(none)");
    }

    @Override
    public boolean isNull() {
        return true;
    }

    @Override
    public void display(){
    }
}

 

 d. 더나아가기

  -  인스턴스 생성에 직접 클래스명을 사용하는 걸 보면 팩토리 메서드 패턴을 검토하자

  public static Dog newNull(){
      return new NullDog();
  }

  -  이렇게 하면 new NullDog() 대신 Dog.newNull()로 대신 작성할 수 있다.

  -  그리고 널 객체가 필요할때마다 생성하는건 낭비이므로 싱글톤 패턴으로 작성하자! 

  -  추가로 널객체를 하면 클래스파일이 늘어나니 private 중첩 클래스로 만들자

class Dog{
    private String name;

    public static Dog newNull(){
        return NullDog.getInstance();
    }
                . . .

    private static class NullDog extends Dog{
        private static final NullDog singleton = new NullDog();
        
        private static NullDog getInstance(){
        	retrun singleton;
        }
        
        private NullDog() {
            super("(none)");
        }
    
        @Override
        public boolean isNull() {
            return true;
        }
    
        @Override
        public void display(){
        }
    }
}

 

e. 기타

  -  널객체는 꼭 필요한가?

       => null 확인이 많거나 실수할 것 같을 때 쓰는 것

 

개인적으로 이거는 쓸일이 있을까? 라는 생각이 좀 드는것 같다.

 

5장. 메서드 추출 

 a. 이름 짓기

  -  메서드 이름은 동사 + 명사 순서로 짓는게 보통이다.

  -  무엇을 하는가를 알수 있게 짓는 것이 중요

  -  알맞는 이름이 떠오르지 않는다는 건 그 코드가 무엇을 하는지 제대로 파악 못한 것이다.

       => 팩트로 맞은 기분이다;;

 

6장. 클래스 추출

 a. 클래스

  -  클래스 하나에 하나의 책임이지만 하다보면 덩치가 커지는 경우가 많다. 

  -  새로운 클래스를 만들어서 책임을 분리하자

 

 b. 나아가기

  -  클래스를 분리하면서 양방향 참조가 생기지 않도록 해야한다.

  -  민감정보가 있을경우 의존성을 읽기전용 interface를 만들어 분리하자

 

출처 : www.gilbut.co.kr/book/view?bookcode=BN001847  

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기