<자바로 배우는 리팩토링 입문> 4장~6장
by BFine4장. 널 객체
a. 일반 null
- Person이라는 클래스 안에는 Dog라는 클래스를 가지고 있다. Person은 Dog를 하나만 가질 경우에는
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를 만들어 분리하자
'개발서적 > 자바로 배우는 리팩토링 입문' 카테고리의 다른 글
<자바로 배우는 리팩토링 입문> 13장~15장 (0) | 2021.03.23 |
---|---|
<자바로 배우는 리팩토링 입문> 10장~12장 (0) | 2021.03.21 |
<자바로 배우는 리팩토링 입문> 7장~9장 (0) | 2021.03.20 |
<자바로 배우는 리팩토링 입문> 1장~3장 (0) | 2021.03.14 |
블로그의 정보
57개월 BackEnd
BFine