Design Architecture/Refactoring

Replace type Code with Class

lipnus 2022. 4. 20. 09:16
반응형

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