null 객체 사용시 문제점
- 객체의 null 여부를 확인하는 코드가 너무 많은 경우
- null 체크 적다면 리팩토링 안 해도 됨
- 아무것도 안하는 객체를 만들어 사용함으로 null 확인 코드를 줄인다.
리펙토링 단계
- null 객체 클래스를 작성한다.
기존에 null을 체크하는 클래스의 하위 클래스로 생성
해당 클래스에 isNull() 이라는 null 체크하는 메서드 구현, 기존 클래스는 false, null 클래스는 true로 반환하게 한다. - null 치환하기
null 코드 부분을 isNull() 메서드로 치환한다. - null 객체 클래스를 재정의하여 조건 판단진행
isNull() 메서드를 사용하는 제어문을 찾아서 다음과 같이 수정
AS-IS
package introducenullobject.before;
public class Label {
private String label;
public Label(String label) {
this.label = label;
}
public void display() {
System.out.println("display: " + label);
}
public String toString() {
return "\"" + label + "\"";
}
}
package introducenullobject.before;
public class Person {
private Label name;
private Label mail;
public Person(Label name, Label mail) {
this.name = name;
this.mail = mail;
}
public Person(Label name) {
this(name, null);
}
public void display() {
if(name != null) {
name.display();
}
if(mail != null) {
mail.display();
}
}
public String toString() {
String result = "[ Person" ;
result += "name :";
if(name == null) {
result += " \" (none) \"";
}
else {
result += name;
}
result += "mail :";
if(mail == null) {
result += " \" (none) \"";
}
else {
result += mail;
}
result += " ]";
return result;
}
}
package introducenullobject.before;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person[] people = {
new Person(new Label("Alice"), new Label("alice@aaa.com")),
new Person(new Label("Tomas"), new Label("tomas@aaa.com")),
new Person(new Label("James") ),
};
for(Person person : people) {
System.out.println(person.toString());
person.display();
System.out.println();
}
}
}
TO-BE
package introducenullobject.after;
public class Label {
private String label;
public Label(String label) {
this.label = label;
}
public void display() {
System.out.println("display: " + label);
}
public String toString() {
return "\"" + label + "\"";
}
public boolean isNull() {
return false;
}
}
package introducenullobject.after;
public class Person {
private Label name;
private Label mail;
public Person(Label name, Label mail) {
this.name = name;
this.mail = mail;
}
public Person(Label name) {
this(name, new NullLabel());
}
public void display() {
name.display();
mail.display();
}
public String toString() {
String result = "[ Person + name =" + name + " mail =" + mail + "]" ;
return result;
}
}
package introducenullobject.after;
public class NullLabel extends Label{
public NullLabel() {
super(" (none) ");
}
public boolean isNull() {
return true;
}
@Override
public void display() {
}
}
package introducenullobject.after;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person[] people = {
new Person(new Label("Alice"), new Label("alice@aaa.com")),
new Person(new Label("Tomas"), new Label("tomas@aaa.com")),
new Person(new Label("James") ),
};
for(Person person : people) {
System.out.println(person.toString());
person.display();
System.out.println();
}
}
}
'java > java 리팩토링' 카테고리의 다른 글
05. if-else, if-switch 문의 분류 코드를 하위 클래스로 만들기 (0) | 2023.02.08 |
---|---|
04. 분류 코드를 클래스로 만들기 (0) | 2023.02.08 |
02. 제어를 위한 플래그 삭제 (0) | 2023.02.07 |
1. 매직넘버를 상수로 바꾸기 (0) | 2023.02.06 |
리팩토링이란 (0) | 2023.02.06 |
댓글