Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 겨울 부산
- PytestPluginManager
- JanusWebRTC
- PersistenceContext
- table not found
- Spring Batch
- tolerated
- 개성국밥
- mp4fpsmod
- python
- JanusWebRTCGateway
- 코루틴 컨텍스트
- Value too long for column
- JanusWebRTCServer
- 자원부족
- 오블완
- VARCHAR (1)
- pytest
- JanusGateway
- terminal
- taint
- vfr video
- 티스토리챌린지
- preemption #
- k8s #kubernetes #쿠버네티스
- kotlin
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 깡돼후
- 달인막창
- 코루틴 빌더
Archives
너와 나의 스토리
[리팩터링] 11.8 생성자를 팩터리 함수로 바꾸기 Replace Constructor with Factory Function 본문
개발/Refactoring
[리팩터링] 11.8 생성자를 팩터리 함수로 바꾸기 Replace Constructor with Factory Function
노는게제일좋아! 2022. 1. 25. 13:40반응형
배경
- 생성자에는 일반 함수에는 없는 제약이 따라붙기도 한다.
- 가령 자바 생성자는 반드시 그 생성자를 정의한 클래스의 인스턴스를 반환해야 한다.
- 서브클래스의 인스턴스나 프락시를 반환할 수는 없다.
- 기본 이름(생성자 이름)보다 적절한 이름이 있어도 사용할 수가 없다.
- 생성자를 호출하려면 특별한 연산자(보통 new)를 사용해야 해서 일반 함수가 오길 기대하는 자리에는 쓰기 어렵다.
- 팩토리 함수에는 이런 제약이 없다.
Before | After |
leadEngineer = new Employee(document.leadEngineer, 'E'); | leadEngineer = createEngineer(document.leadEngineer); |
절차
- 팩터리팩토리 함수를 만든다. 팩토리 함수의 본문에서는 원래의 생성자를 호출한다.
- 생성자를 호출하던 코드를 팩터리 함수 호출로 바꾼다.
- 하나씩 수정할 때마다 테스트한다.
- 생성자의 가시 범위가 최소가 되도록 제한한다.
예시
- 직원(Employee) 클래스
-
class Employee { constructor(name, typeCode){ this._name = name; this._typeCode = typeCode; } get name() {return this._naame;} get type() { return Employee.legalTypeCodes[this._typeCode]; } static get legalTypeCodes() { return {"E": "Engineer", "M": "Manager", "S": "Salesperson"}; } }
-
- Employee 클래스를 사용하는 코드
-
// 호출자 1 candidate = new Employee(document.name, document.empType); // 호출자 2 const leadEngineer = new Employee(document.leadEngineer, 'E');
-
- [Step 1] 팩터리 함수 만들기
- 팩토리 본문은 단순히 생성자에 위임하는 방식으로 구현한다.
-
function createEmployee(name, typeCode) { return new Employee(name, typeCode); }
- [Step 2] 생성자를 호출하는 곳을 찾아 수정한다.
-
// 호출자 1 candidate = createEmployee(document.name, document.empType); // 호출자 2 const leadEngineer = createEmployee(document.leadEngineer, 'E');
- 함수에 문자열 리터럴을 건네는 건 악취로 봐야 한다.
- 그 대신 직원 유형을 팩토리 함수의 이름에 녹이는 방식이 더 좋다.
-
function createEngineer(name) { return new Employee(name, 'E'); }
-
출처:
- [리팩터링 2판]
반응형
'개발 > Refactoring' 카테고리의 다른 글
[리팩터링] 슈퍼클래스 추출하기 Extract Superclass (0) | 2022.02.16 |
---|---|
[리팩터링] 오류 코드를 예외로 바꾸기 Replace Error Code with Exception (0) | 2022.02.09 |
[리팩터링] 11.5 매개변수를 질의 함수로 바꾸기 Replace parameter with Query (0) | 2022.01.18 |
[리팩터링] 특이 케이스 추가하기 Introduce Special Case (0) | 2022.01.02 |
[리팩토링] Replace Inline Code with Function Call 인라인 코드를 함수 호출로 바꾸기 (0) | 2021.11.20 |
Comments