1. 추상화
불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업을 추상화라고 한다. 가장 일반적인 추상화 방법은 한 번에 다뤄야 하는 문제의 크기를 줄이는 것이다.
프로그래밍 패러다임은 프로그래밍을 구성하기 위해 사용하는 추상화의 종류와 이 추상화를 이용해 소프트웨어를 분해하는 방법의 두 가지 요소로 결정된다. 따라서 모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명할 수 있다. 현대적인 프로그래밍 언어를 특징짓는 추상화 메커니즘으로 두 가지가 있다.
- 프로시저 추상화 : 소프트웨어가 무엇을 해야 하는지를 추상화
- 기능분해, 알고리즘 분해
- 데이터 추상화 : 소프트웨어가 무엇을 알아야 하는지를 추상화
- 데이터를 중심으로 타입을 추상화 - 추상 데이터 타입
- 데이터를 중심으로 프로시저를 추상화 - 객체지향
1.1 프로시저 추상화
기능 분해의 관점에서 추상화의 단위는 프로시저이며 시스템은 프로시저를 단위로 분해된다.
* 프로시저 : 정해진 절차에 따라 내부의 상태를 변경하는 루틴의 한 종류
프로시저는 반복적으로 실행되거나 유사하게 실행되는 작업들을 하나의 장소에 모아 놓음으로써 로직을 재사용하고 중복을 제거할 수 있는 추상화 방법이다. 전통적인 기능 분해 방법은 하향식 접근법을 따른다. 하향식 접근법이란 시스템을 구성하는 최상위 기능을 정의하고 이 기능을 좀 더 작은 단계의 하위 기능으로 분해해 나가는 방법이다.
하지만 하향식 기능 분해의 가장 큰 문제점은 데이터 변경으로 인한 파급효과다. 어떤 데이터를 어떤 함수가 사용하고 있는지 추적하기 어렵다. 따라서 데이터 변경에 어떤 함수가 영향을 받는지 예상하기가 어렵다.
데이터 변경으로 인한 영향을 최소화하려면 데이터와 함께 변경되는 부분과 그렇지 않은 부분을 명확히 분리해야 한다. 변경되는 부분을 하나의 구현 단위로 묶고 외부에서는 제공되는 함수만 이용해 데이터에 접근해야 한다. 즉, 잘 정의된 퍼블릭 인터페이스를 통해 데이터에 대한 접근을 통제해야 하는 것이다. 이것이 바로 의존성 관리의 핵심이다. 기능을 기반으로 시스템을 분해하는 것이 아니라 변경의 방향에 맞춰 시스템을 분해하라.
2. 정보 은닉과 모듈
정보 은닉은 시스템을 모듈 단위로 분해하기 위한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감춰야 한다는 것이 핵심이다.
모듈은 변경될 가능성이 있는 비밀을 내부로 감추고, 퍼블릭 인터페이스를 외부에 제공해서 내부의 데이터에 대한 접근을 하지 못하게 한다. 모듈은 두 가지 비밀을 감춰야 한다.
- 복잡성 : 외부에 모듈을 추상화할 수 있는 간단한 인터페이스를 제공해서 모듈의 복잡도를 낮춘다.
- 변경 가능성 : 데이터 변경시 하나의 모듈만 수정하면 되도록 변경 가능한 설계 결정을 모듈 내부로 감추고 외부에는 쉽게 변경되지 않는 인터페이스를 제공한다.
'Study > 오프젝트' 카테고리의 다른 글
09) 유연한 설계 (1) | 2024.01.06 |
---|---|
08) 의존성 관리하기 (0) | 2024.01.02 |
06) 메시지와 인터페이스 (0) | 2023.12.15 |
05) 책임 할당하기 (0) | 2023.12.11 |
04) 설계 품질과 트레이드오프 (1) | 2023.12.07 |