하루 건너 먹어야 하는 약이 있습니다. 하지만 '하루 건너 먹기'는 쉽지 않습니다. '매번 오늘은 먹었던가?'하며 확인하기도 하고 깜빡하기도 합니다.
그런 일이 없도록 '아무런 효과도 없는 가짜약'을 만들어 두고 진짜 약과 교대로 먹는 패키지가 있다면 편리할 것입니다.
널 객체 도입(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;
}
}
클래스 추출(Extract Class) 리팩토링 (0) | 2020.01.28 |
---|---|
메서드 추출(Extract Method) 리팩토링 (0) | 2020.01.20 |
어서션(assert) 리팩토링 (0) | 2020.01.18 |
제어 플래그 삭제 (0) | 2020.01.08 |
리팩토링 첫번째 시간 (0) | 2020.01.05 |
댓글 영역