상세 컨텐츠

본문 제목

널 객체 도입 리팩토링

자바강좌/리팩토링

by somiyuralove 2020. 1. 18. 16:58

본문

하루 건너 먹어야 하는 약이 있습니다. 하지만 '하루 건너 먹기'는 쉽지 않습니다. '매번 오늘은 먹었던가?'하며 확인하기도 하고 깜빡하기도 합니다.

그런 일이 없도록 '아무런 효과도 없는 가짜약'을 만들어 두고 진짜 약과 교대로 먹는 패키지가 있다면 편리할 것입니다.

널 객체 도입(Introduce Null Object) 리팩토링은 아무것도 하지 않는 널 객체를 도입합니다.

널객체를 사용하면 '이 변수는 현재 null인가'라는 확인을 생략할 수 있습니다.

 

아래코드는 리팩토링 하기전 코드를 보여줍니다.

 

* Person.java

package Person;

public class Person {
private final Label _name;
private final Label _mail;

public Person(Label name, Label mail) {
_name = name;
_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;
}
}

 

* Label.java

package Person;

public class Label {
private final String _label;

public Label(String label) {
_label = label;
}

public void display() {
System.out.println("display: " + _label);
}

public String toString() {
return "\"" + _label + "\"";
}

}

 

* Main.java

package Person;

public class Main {
public static void main(String[] args) {
Person[] people = {
new Person(new Label("Alice"), new Label("alice@example.com")),
new Person(new Label("Bobby"), new Label("bobby@example.com")),
new Person(new Label("Chris")),
};

for (Person p: people) {
System.out.println(p.toString());
p.display();
System.out.println("");
}
}
}

 

그럼 널 도입 리팩토링을 한 코드를 아래에서 살펴보도록 하겠습니다.

 

* Person.java

 

package Person;

public class Person {
private final Label _name;
private final Label _mail;

public Person(Label name, Label mail) {
_name = name;
_mail = mail;
}
public Person(Label name) {
this(name, new NullLabel());
}

public void display() {
_name.display();
_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;
}
}

 

* Label.java

 

package Person;

public class Label {
private final String _label;

public Label(String label) {
_label = label;
}

public void display() {
System.out.println("display: " + _label);
}

public String toString() {
return "\"" + _label + "\"";
}

public boolean isNull() {
return false;
}

}

 

* NullLabel.java

 

package Person;

public class NullLabel extends Label {
public NullLabel() {
super("(none)");
}

@Override
public void display() {

}

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

 

 

관련글 더보기

댓글 영역