오늘은 7장 객체 분해에 대해 이야기해보려고 한다.
일주일에 두 챕터씩 항상 꾸준히 읽고 정리를 진행하고 있는데 뒤로 갈수록 이해와 정리를 병행하여 두 챕터씩 진행하다 보니.... 양이 상당하다
7장의 예제 코드의 경우 RUBBY를 통해 예제가 나와있어 자바 개발자인 나로서는 해당 코드를 이해하기 위해 하나씩 쫓아가며 이해하려고 노력했다.. ㅠㅠ
아무튼 본론으로 한번 들어가 보자!
일반적으로 우리가 기억에 접근을 할 때 곧바로 장기 기억으로 접근하는 것이 아닌, 장기 기억을 단기 기억으로 옮긴 후에 해당 기억을 처리한다.
맞다. 이전, 경선식 영어 강의를 들었을 때, 해마 공부법을 이야기하시며 이와 비슷한 이야기를 해주셨었던 기억이 났었다.
지금까지 사람의 기억에 대한 이야기를 왜 했을까? 이는 이번 챕터의 분해와 연관이 있다.
해당 책을 읽고 요약을 하면 나는 다음과 같다고 판단했다.
프로시저 추상화
데이터 추상화
시스템을 분해하는 방법을 결정하기 위해선 먼저 프로시저 추상화를 중심으로 할 것인지, 데이터 추상화 중심으로 할 것인지를 결정해야 한다.
객체 지향은 데이터 추상화와 프로시저 추상화를 함께 포함한 클래스를 이용해 시스템 분해하는 개발 기법이다.
프로시저
전통적인 기능 분해 방법은 하향식 접근법 ( Top - Down Approach)를 따른다.
하향식 접근법
해당 부분을 생각했을 때 나는 이전에 내가 정리한 DI vs DIP 포스팅이 생각이 났다.
그중 이 접근법은 DI와 비슷한 느낌이지 않을까? 란 생각도 더불어 들었다.
다음 그림을 살펴보자
기능 분해 방법에서는 기능을 중심으로 필요한 데이터를 결정한다.
하향식 기능 분해 방식이 가지는 문제를 이해하는 것은 유지보수 관점에서 객체지향의 장점을 이해할 수 있는 좋은 출발점이다.
해당 파트는 하향식 기능 분해 방식의 문제점을 이야기하고 있었다.
해당 파트에서는 Rubby 코드를 이용해 설명을 이어갔고, 하향식 기능 분해 방식의 결론적인 분해 구조는 다음과 같다.
보이는 것과 같이 트리 구조로 하여 촘촘하고 세부적으로 구조 설계가 가능하다. 하지만, 이렇게 진행될 확률이 얼마나 될까?
책에서도 문제점으로 다음과 같이 이야기하고 있다.
공감한다. 어떠한 서비스를 제공할 시, 초기 서비스와 고도화 이후 더욱더 발전된 서비스를 업데이트한다 가정할 시 다음과 같이 촘촘하게 세부적으로 구현을 만들어 놓았을 때 이후 추가할 서비스가 들어갈 공간이 있을까 싶었다. 이는 유연성이 떨어지는 요인이라 생각했다.
업무를 진행하면서도 항상 말씀해주시는 이야기도 기억이 났다. "확장성을 고려해야 한다."
맞다. 추후 일어날 일에 대해서는 아무도 모른다. 하지만 이를 위해 항상 대비하고 열어두는 설계를 하는 것이 좋은 설계가 아닐까 싶었다.
책에서 이야기하는 유용한 경우는 다음과 같다.
해당 파트에서는 정보은닉에 대해 이야기를 하고 있다.
정보은닉
시스템을 모듈단위로 분리할 때 다음과 같은 원칙을 꼭 지켜야 한다라고 한다.
장점
한계
이러한 한계를 만족시키기 위해 등장한 개념이 바로 추상 데이터 타입이다.
타입
추상 데이터 타입을 구현하려면 다음과 같은 특성을 위한 프로그래밍 언어의 지원이 필요하다고 한다.
클래스는 추상 데이터 타입인가?
해당 챕터 중 초반엔 객체지향 프로그래밍과 객체 기반 프로그래밍에 대해 설명하고 있다.
객체지향 프로그래밍 ( Object-Oriented Programming )
객체 기반 프로그래밍 ( Object - Based Programming )
또한 클래스와 추상 데이터 타입의 공통점 및 차이점은 다음과 같다.
클래스를 이용한 다형성은 절차에 대한 차이점을 감춘다. 즉, 객체 지향은 절차 추상화라고도 이야기가 가능하다.
타입을 기준으로 절차를 추상화하지 않았다면 그것은 객체지향 분해가 아니다
객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체한다. 여기서 마틴 파울러는 다음과 같이 이야기한다.
인스턴스 변수에 저장된 값을 기반으로 메서드 내의 타입을 명시적으로 구분하는 방식은 객체지향에 위반된다라고 한다.
설계의 요구되는 입력이 '타입 추가' or '오퍼레이션 추가'에 따라 설계 방향이 달라진다.
변경의 축을 찾아 이에 맞는 설계를 이행해야 한다.
[BOOK: 오브젝트 11장] 합성과 유연한 설계 (0) | 2022.11.27 |
---|---|
[BOOK: 오브젝트 10장] 상속과 코드 재사용 (0) | 2022.11.18 |
[BOOK: 오브젝트 6장] 메시지와 인터페이스 (0) | 2022.11.07 |
[BOOK: 오브젝트 5장] 책임 할당하기 (0) | 2022.11.05 |
[BOOK : 오브젝트 4장] 설계 품질과 트레이드 오프 (0) | 2022.10.30 |