반응형
Replace Type Code with Class
– 어떤 field type(예를 들어, String 또는 int 등)이 부적합한 값의대입이나 유효하지 않은 동일성 검사(비교)를 방지하지 못한다면,field type 을 클래스로 바꿔 값의 대입과 동일성 검사에 제약조건을 부여한다
– 동기
• Type code를 리팩토링하는 주된 이유는 코드의 타입 안정성을 보장하려는 것이다.
– 장점
• 부적절한 값의 대입이나 유효하지 않은 동일성 검사로부터 코드를보호한다.
– 단점
• 타입 안정성이 결여된 경우보다 더 많은 코드가 필요하다.
기능에 영향을 주지않는 숫자형 type code가 있는 클래스가 있을 때 새 클래스로 바꾼다.
• type code를 사용하는 method들은 상징적인 이름이 아닌 숫자만을 인자로 받기 때문에 코드를 이해하기 어렵게 만든다.
before
public class ReplaceTypeCodeWithClass_before {
static public class Person {
public static final int O = 0;
public static final int A = 1;
public static final int B = 2;
public static final int AB = 3;
private int bloodGroup;
public Person (int bloodGroup) {
this.bloodGroup = bloodGroup;
}
public void setBloodGroup(int arg) {
bloodGroup = arg;
}
public int getBloodGroup() {
return bloodGroup;
}
}
public static void main(String[] args) {
Person thePerson = new Person(Person.A);
System.out.println("Blood group : " + thePerson.getBloodGroup());
thePerson.setBloodGroup(Person.AB);
System.out.println("Blood group : " + thePerson.getBloodGroup());
}
}
personA대신 5,6 이런거 넣었을때 체크가 안됨.
After
public class ReplaceTypeCodeWithClass_before {
static public class Person {
private BloodGroup _bloodGroup;
public int getBloodGroupCode(){
return _bloodGroup.getCode();
}
public BloodGroup getBloodGroup(){
return _bloodGroup;
}
public Person(BloodGroup bloodGroup){
_bloodGroup = bloodGroup;
}
public void setBloodGroup(BloodGroup arg){
_bloodGroup = arg;
}
}
public static class BloodGroup{
public static final BloodGroup O = new BloodGroup(0);
public static final BloodGroup A = new BloodGroup(1);
public static final BloodGroup B = new BloodGroup(2);
public static final BloodGroup AB = new BloodGroup(3);
private static final BloodGroup[] _values = {O, A, B, AB};
private final int _code;
private BloodGroup(int code){
_code = code;
}
public int getCode(){
return _code;
}
public static BloodGroup code(int arg){
return _values[arg];
}
}
public static void main(String[] args) {
Person thePerson = new Person(BloodGroup.A);
System.out.println("Blood group : " + thePerson.getBloodGroupCode());
thePerson.setBloodGroup(BloodGroup.AB);
System.out.println("Blood group : " + thePerson.getBloodGroupCode());
}
}
근데 이건 매개변수를 enum으로 받으면 처리되는거 아닌가??
http://wiki.gurubee.net/pages/viewpage.action?pageId=1507346
https://intrepidgeeks.com/tutorial/reconfigure-reading-notes-813-replace-type-code-with-class
반응형
'Design Architecture > Refactoring' 카테고리의 다른 글
Replace Nested Conditional With Guard Clauses (0) | 2022.04.20 |
---|---|
Decompose Conditional (0) | 2022.04.20 |
Replace Type Code with Subclass (0) | 2022.04.20 |
Encapsulate Collection (0) | 2022.04.20 |
Replace Data Value with Object (0) | 2022.04.20 |