설계 원리 4가지
: Step-wise Refinements, Abstraction, Modularization, SOLID
1. Step-wise Refinement
: 내가 작성할 모듈이 복잡할 때 한번에 상세내용까지 설계하지 않고
먼저 윗 단계에서 봤을 때 가장 대표적인 단계 찾는 것, 그리고 그 후에 다시 또 각 단계의 세부 단계 찾기.
ex) Tic-tac-toe
-> 상세화
2. Abstraction(추상화)
: 중요하지 않은 것은 생략하여 중요한 것만 보여주는 것.
ex) 지하철 노선도
두 역 사이의 거리는 전혀 보여주지 않고, 다음 역, 이전 역 이러한 정보들만 보여주고 있다.
1) Procedural abstractions(함수를 사용한 추상화)
: procedural interface는 보여주고, 내부 알고리즘은 숨긴다.
2) Data abstractions
: 데이터를 사용하기 위해 필요한 연산(operation), interface을 보여주고, 데이터 표현(ex. array, list, map, ...)은 숨긴다.
ex) 클래스
Data abstractions를 지징하는 또다른 용어들
: Information hiding(정보 은닉), Encapsulation(캡슐화), Abstract data types(추상 데이터 타입)
3. Modularizaiton(모듈화)
: 큰 소프트웨어를 만드는데 있어서 모듈을 잘 나누는 것은 중요하다.
잘 수행한 모듈화의 기준
1) Coupling(결합도)
: 두 모듈이 주어졌을 때, 한 모듈이 다른 모듈에 얼마나 의존하는가
의존성이 강함 = 한 모듈이 다른 모듈이 없으면 안된다 = 결합도 강함
의존성이 약함 = 한 모듈이 다른 모듈이 없어도 어느 정도 기능을 한다 = 결합도 약함
2개의 모듈에 대해서 이야기.
결합도가 높다 = 의존성이 강하다 = 의존성이 강할거였으면 애초에 하나의 모듈로 만드는 것이 좋다. 따라서 결합도가 높다 = Bad
결합도 좋음-> 안좋음
Data - Stamp - Control - Common - Content coupling
2) Cohesion(응집도)
: 한 모듈에 있는 여러 문장들이 모듈을 구성하는데 있어서 잘 모아진 것인가
한 모듈이 본연의, 하나의 기능만을 포함하는 문장들로만 구성 = 응집도 높음
불필요한 기능도 같이 포함하는 문장들로 구성 = 응집도 낮음
1개의 모듈에 대해서 이야기.
응집도 높다 = 한 목적을 위한 문장들로만 구성, 한가지 기능에 집중 = Good
응집도 낮다 = 여러 기능. 모듈을 여러개로 분리를 했어야 했는데 그렇지 않았다는 의미 = Bad
응집도 좋음 -> 안좋음
Function, Sequential, Communication, Temporal, Logical, Coincidental cohesion
a) Coupling
자료 결합 (data coupling) (가장 좋은 방식) |
모듈 간의 인터페이스가 매개 변수 전달 등의 자료 요소로만 구성된 경우 |
스탬프 결합 (stamp coupling) | 배열이나 레코드를 전달하되 그 중 일부만 전달하는 경우. 전역 변수 일부만을 사용하여 전달하는 경우 |
제어 결합 (control coupling) |
제어 흐름 관련 값을 전달하여 다른 모듈의 실행 순서를 제어하는 경우 |
공통 결합 (common coupling) | 여러 모듈이 공동 자료 영역(ex.전역변수)을 사용하는 경우 |
내용 결합 (content coupling) (가장 안좋은 방식) |
다른 모듈의 지역 변수나 명령어를 수정하는 경우 |
b) Cohesion
기능적 응집 (functional cohesion) (가장 높은 응집도) |
모듈이 하나의 기능을 구현하는 내용으로만 작성됨 |
순차적 응집 (sequential cohesion) |
모듈 안에서 하나의 소작업 결과가 다음 소작업의 입력으로 전달되는 형태 |
커뮤니케이션 응집 (communication cohesion) |
동일한 입출력 데이터에 대한 오퍼레이션을 모아놓은 형태 (수행 순서와는 무관) |
시간적 응집 (temporal cohesion) |
동일한 시점에 수행되는 오퍼레이션을 모아놓은 형태 (예: 초기화 코드를 모두 모아놓은 모듈) (초기화) |
논리적 응집 (logical cohesion) |
모듈의 요소들이 논리적으로 관련있어서 모아놓은 형태 (예: 수학함수 라이브러리) (math클래스 : sin, cos, 절댓값 함수, ...) |
이유없는 응집 (coincidental cohesion) (가장 낮은 응집도) |
관계가 없는 코드들이 하나의 모듈에 있는 형태 |
'소프트웨어공학론' 카테고리의 다른 글
Design patterns - Creational Pattern (1) | 2023.05.10 |
---|---|
Design Principles - Solid (0) | 2023.05.06 |
Pipe and Filter architecture (0) | 2023.04.28 |
Repository architecture (0) | 2023.04.28 |
Event-driven Control (0) | 2023.04.27 |
댓글