애플리케이션이 다루고 있는 도메인에 필요하 기본타입을 만들지 않고 프로그램 언어가 제공하는 기본타입을 사용하는 경우가 많다.
기본형으로 단위 또는 표기법을 표현하는데에 한계가 있다.
- 기본형을 객체로 바꾸기
- 타입 코드를 서브클래스로 바꾸기
- 조건부 로직을 다형성으로 바꾸기
- 클래스 추출
- 매개변수 객체 만들기
개발 초기에는 기본형으로 표현한 데이터가 나중에는 해당 데이터와 관련있는 다양한 기능을 필요로 하는 경우가 발생한다.
예) 숫자로 표현하던 온도의 단위 -> 화씨,섭씨로 변환하는 경우
기본형을 사용한 데이터를 감싸 줄 클래스를 만들면 해결 가능
타입의 안정성을 위해 리스트안에 존재하는 값만 들어올수 있도록 해준다.
Value index를 구해주는 메서드와 현재 객체의 value값과 매개변수로 들어오는 값의 index를 비교하는 메서드도 만들어준다.
=> 일반 문자열, 기본타입을 쓰던것을 객체타입으로 만들고 그 객체를 사용하도록 만들면 해당 데이터의 기능을 쓰기 쉽다.
크게 두가지가 있다. 첫번째는 아무것도 상속받지 않아 이 클래스를 상속을 통해 서브클래스로 뺴낼수 있는 클래스.
두번째는 이미 상속이 진행되있어서 간접적인 상속을 활용해야하는 클래스
일단 첫번쨰 클래스 타입이 추후에 각각의 타입마다 하는일이 많이 달라진다는 가정하에 타입을 서브클래스로 만들어보자
각각 Engineer , Salesman , Manager 클래스를 만든뒤 위와 같이 만들어 준다.
더 이상 Employee 에 type 이란 필드는 필요하지 않다. 그에따라 생성자 및 다른 코드들도 수정해주자.
각각 자식클래스에서 오버라이드한 메서드는 당연히 abstract로 바꿔준다.
기존에 사용하던 메서드 validate도 더이상 필요가 없으니 지워준다.
EmployeeType 를 적용시켜보자 . Emploee 에서는 참조를 하며 이전방법과 같이 메서드를 만들어준다.
Employee도 부모클래스이지만 다른 부모클래스 EmployeeType 도 참조중인 상황
필요가 없는 필드와 메서드를 지워서 코드를 정리 해준다.
capitalizedType() 는 다른부모 클래스에게 위임해준다.
- 복잡한 switch, if- else문의 반복은 상속이나 다형성을 활용해 해결할수 있다.
예) 이러한경우에는 이렇게 동작하고 , 저러한 경우에는 저렇게 동작
부모 클래스의 메서드들도 수정 해준다
type 필드는 지울 예정이다.
type 라는 필드는 더이상 필요가 없으므로 지워주고 그에 해당하는 생성자도 지워준다.
오버라이드를 당하는(?) 메서드들도 한눈에 보기좋게 abstract로 만들어준다
자식클래스 중에서 중복되는 메서드는 위로 (부모클래스로) 올려준다.
처음 switch 문에서 type에 따라 실행코드를 다르게 했다면 부모-자식 상속관계로 나눠줌으로써 type이라는 필드를 없애며 복잡한 switch 문을 정리
나중에 이런저런 기능이 생길것을 예상하여 여러 기능을 만들어 놨지만 결국에 쓰이지 않는 코드가 발생할 경우..
YAGNI(u r not gonna need it) 원칙을 따르자
사용하지 않는 코드가 애플리케이션 성능이나 기능에 영향을 끼치지는 않는다.
나중에 필요해질 코드라 하더라도 지금 쓰이지 않는 코드라면 (주석으로 감싸는게 아니라) 삭제 해야한다.
해당 변수 옮기기 => 클래스 추출하기
해당 변수를 사용하는 함수 옮기기 => 함수 옮기기
특정한 경우에 해당하는 클래스를 만들어 해당조건을 제거 => 특이 케이스 추가하기
매개변수 Site의 값에 따라 좌지우지 되야한다. Site 값을 설정해주자
unknown 이면 unkownCustomer 아니면 customer
캡슐화
기존 코드에서는 unknownCustomer 일때 특정한 값을 변수에 대입해서 반환한다. Customer 일때는 클래스의 필드 값반환.
unknownCustomer 클래스에 아예 고정값을 넣어 버려서 두번쨰 사진처럼 코드를 한줄로 줄일수 있다.