추상화 정리
서비스를 개발하면서 많은 코드를 작성한다. 그 코드들 속에 중복적인 요소 또는 로직은 항상 존재한다. 중복적인 요소 또는 로직은 추상화를 통해 반복적인 작업을 줄일 수 있다.
추상화를 하는 과정은 중복적인 요소 또는 로직을 공통화하고, 결과적으로 재사용성을 높인다. 추상화는 요구사항 수정 시, 수정 범위를 최소화하기 때문에 구조 설계에 있어서 필수적인 과정이라고 할 수 있다.
추상화는 일반화와 단순화로 설명된다. 아래에서 자세히 알아보자.
일반화
일반화는 우리가 작성하는 코드에서 중복적인 요소 또는 로직을 찾아 공통화하는 것을 의미한다.
이 말대로 하면 두가지 과정으로 일반화가 이뤄진다.
- 중복적인 요소 또는 로직을 파악한다.
- 중복적인 요소를 성격에 따라 공통화 한다.
공통화
여기서 공통화는 중복적인 요소의 성격에 따라 다르게 가져간다. 성격은 이렇게 분류할 수 있다.
- 중복된 숫자, 문자, 옵션값은 상수로 정의한다.
- 중복된 로직은 함수로 정의한다.
- 중복된 로직과 상태를 갖는 것은 클래스로 정의한다.
- 중복된 UI와 로직 또는 상태를 갖는 것은 컴포넌트로 정의한다.
단순화
공통된 요소를 분리하면 단순화 작업을 해야 한다. 공통된 요소를 분리했다는 것은 재사용을 하겠다는 의미이다. 재사용할 때는 쉽게 사용할 수 있어야 사용할 때도 부담이 적다.
상수
상수는 네이밍을 통해 단순화를 한다. 상수의 값을 의미할 수 있는 최소한의 단어를 조합해서 단순화를 한다. 네이밍 단순화는 함수, 클래스, 컴포넌트 모두 적용이 필요하다. 그러므로 이후에는 네이밍 설명은 생략한다.
함수
함수는 인자와 반환값을 단순화해야 한다.
인자는 개수가 적을 수록 좋다. 인자가 2개인 함수보다 인자가 1개인 함수가 이해하기 쉽다. 인자의 개수가 적을 수록 이해하기 쉬우므로 외부에서 전달받아야 하는 인자는 최소화해야 한다.
반환값은 항상 같은 타입을 반환하는 게 좋다. 다른 타입을 반환하면 사용측에서 타입 분기가 필요하다.
그리고 반환값은 항상 같은 인자에 대응해서 멱등성을 가지는 게 좋다. 그럼 인자에 따라 반환값이 항상 추측할 수 있다. 반대로 동일한 인자인데 반환값이 다르면 추측하기 힘든 함수가 된다.
클래스
클래스는 담당하는 책임이 단순할 수록 좋다. 클래스의 책임을 파악하려면 역할과 권한을 파악하면 된다. 클래스가 어떤 역할을 하고 권한이 있는지 파악하면 그에 따른 책임을 파악할 수 있다.
역할을 파악하기 위해서는 클래스가 무엇을 알고(knowing) 하는 가(doing)에 대한 파악하면 된다. 아는 것에는 클래스에서 다루는 상태와 자신과 관련된 클래스를 의미한다. 하는 것에는 객체를 생성하거나 계산하는 것과 다른 객체를 조작하는 것을 의미한다.
이러한 요소들이 많으면 많을 수록 역할과 권한이 많아지며 그에 따른 책임이 많아진다. 그러므로 단순하게 유지하도록 해야 한다.
컴포넌트
컴포넌트는 클래스와 마찬가지로 담당하는 책임이 단순할 수록 좋다. 컴포넌트는 조작하는 UI의 역할에 따라 책임이 달라진다.
대표적으로 이러한 UI들이 있다.
- 버튼과 입력 박스 등과 같은 UI
- 버튼과 입력 박스를 조합한 폼 영역 UI
- 폼 영역 UI와 타이틀 그리고 네비게이션을 조합한 페이지
이러한 UI에 따라 책임이 달라진다. 그렇기 때문에 각각 UI가 가져야 하는 상태와 로직을 규모에 따라 컴포넌트화해야 한다. 그리고 컴포넌트간의 통신 방법을 단순화하는 게 좋다.