본문 바로가기

Design Pattern

[디자인패턴] Core Concepts in SW Design (Design에서의 핵심개념)

  • 추상화 - 정보은닉 & 캡슐화
  • 정보은닉 & 캡슐화
  • 모듈성 (Modularity)
  • Cohesion & Coupling

 

  • 추상화

Abstraction

  • Hiding details : sw의 복잡한 디자인을 간소화시키고 관리하기 위해 자세하지 않는 건 감춘다.
  • 특정 문제로부터 카테고리(핵심) 과 concepts(해당문제의 디테일한 사항)을 나눈다. (For 재사용성)

        - 핵심을 분리함으로써 핵심을 해결하는 solution을 찾으면 detail이 조금 바뀐 다른 문제에도 적용가능하다.

        - 특정 문제 instance에 대한 solution을 찾는게 아닌 핵심을 분리하여 그 핵심에 대한 solution을 찾는 것이다.

추상화 in File읽기

이렇게 파일을 읽어야하는 문제에서 추상화시켜서 파일이 아닌 입력 buffer를 읽을 수 있는 solution을 찾는다.

 

 

 


 

  • 정보은닉 & 캡슐화

알고리즘과 자료구조 관련한 내부 디자인에서의 결정사항을 외부로부터 은닉시킴으로써 수정을 조금 더 자유롭게 하고 coupling을 줄인다.

        - 내부 디자인 결정사항은 자주 바뀐다.

        - 따라서 향후 설계 유지 관리 또는 수정으로 인한 부작용을 줄이고 설계에 다른 module들에 끼치는 영향을 최소화한다.

        - Information hiding은 module들 사이에 coupling을 줄이고 system을 더 유지하기 쉽게 해준다.

        - Information hiding은 software를 개발하는데 있어서 complexity를 관리하기 효과적인 방법이다.

 

Information hiding : Encapsulation = Principle : Technique (원칙, 방법 : 기술)

 

  • Encapsulation in Strategy Pattern

Strategy Pattern

알고리즘 군(인터페이스, Concrete class)을 정의한다.

각각 encapsulate시킨다.

이들을 interchangeable(교환가능)하게 만든다.

 

Strategy Pattern은 알고리즘을 client입장에서 독립적으로 이용할 수 있게 한다.

Encapsulation in Strategy Pattern

 

 

  • Separation of Concerns (SoC)

Concerns : 우리 코드에 영향을 주는 모든 것

컴퓨터 프로그램을 별개의 섹션으로 분리하여 각 섹션이 별도의 concern을 해결하기위한 Design principle이다.

SoC를 잘 구현한 것을 modular라고 부른다.

Modularity (Separation of Concerns)은 잘 정의된 인터페이스을 갖고 있는 코드 섹션에서 정보를 encapsulate함으로써 얻을 수 있다.

 

SoC를 잘 지키지 못한 예

 

  • Interfaces

인터페이스는 모듈 / 시스템에 통신하기 위한 access 포인트이다.

Abstraction에는 예상되는 input에 대한 output이 명확하게 설명되어 있는 인터페이스가 있어야 한다.

encapsulate가 아주 잘된 object는 interface가 접근하는 유일한 방법이다.

 

 

 


 

  • 모듈성 (Modularity)

지금까지 이걸 설명하기 위한 base들 이였다.

Goal of Design

모듈성의 목표는 시스템을 module로 분할하고 각 component에게 reponsibility를 할당하는 것이다.

 

모듈성은 특정 순간에 프로그래머가 해결해야할 complexity를 줄여준다.

        - 유사한 기능들이 그룹화되어 module로 할당된다. (SoC)

        - module들 사이에는 간단하고, 잘 정의된 인터페이스가 존재한다. (Information Hiding)

 

Measuring Modularity

        - Coupling은 module들 사이에 dependency를 측정하는 것이다.

        - Cohesion은 module안에 요소들이 얼마나 밀접하게 연관되어 있는지 측정하는 것이다.

 

 

 


 

  • Cohesion & Coupling
  • Coupling : Degree of Dependence between Modules

High coupling이면 시스템의 일부를 수정하기가 어렵다. (어떤 component를 수정하면 연결된 component들도 수정필요)

Low coupling : Good

        - 하나의 모듈이 안정적인 인터페이스를 통해 다른 모듈과 상호작용하고 관계없는 모듈과는 관련될 필요가 없다.

High coupling : bad

        - 하나의 모듈을 변경하면 다른 모듈들도 변경해야 한다.

        - 모듈을 단독으로 이해하기 힘들다.

        - 다른 모듈들과의 dependency때문에 모듈들을 재사용하거나 테스트하기 어렵다.

 

Low Coupling은 불필요한 관계를 제거하고, 필요한 관계의 수를 줄임으로써 얻을 수 있다.

Least Knowledge Principle과 관련 높다. (서로 모르게 해라!)

 

Fan out = 다른 모듈로의 dependency 개수

Fan out

Fan in = 나에게 dependency 걸고있는 다른 모듈들 개수

Fan in

 

Coupling Metrics for Class

RFC(Reponse For Class) : 메소드단위 coupling 개수 = 같은 클래스내의 메소드개수 + 호출한 다른 메소드

CBO(Coupling Between Objects) : 클래스 단위 coupling = Fan out + Fan in

Fan-Out 11개 Why?..

 

  • Cohesion : Degree of Relatedness of the Elements in a Module

Cohesion

정의

        - 모듈의 모든 요소들이 단일 task를 지향하는 정도

        - task와 관련된 모든 요소들이 단일 모듈에 포함된 정도

Strong, high Cohesion : Good

        - Strong Cohesion은 모듈들 사이의 relation을 줄여준다.

weak, low Cohesion : Bad

 

Cohesion Metrics - LCOM

LCOM : 유사성이 0인 method 쌍의 수 = |P| - |Q|, (|P| > |Q|) / 0 (|P| <= |Q|)

Class A, B에 대한 LCOM

op1, op2, op3 = 메소드 / a1, a2..a5 = 인스턴스 변수

P = 서로 참조하는 인스턴스 변수 겹치는게 하나도 없는 메소드 쌍 (많을수록  Cohesion 안 좋음)

Q = 서로 참조하는 인스턴스 변수가 겹치는게 하나라도 있는 메소드 쌍 (많을수록 Cohesion 좋음)

 

LCOM의 또 다른 정의 : LCOM = 1 - (sum(MF) / M*F) / LCOM HS = [M - sum(MF) / F] / (M-1)

LCOM another Definition

(좌)

M : Class내의 method 개수 = 3

F : Class내의 instance 변수 개수 = 5

sum(MF) : edge 개수 = 8

LCOM = 1 - (8/15) = 0.47 / LCOM HS = (3-8/5) / 2 = 0.7

 

 

Introduction to DSM (Dependency Structure Matrix)

complexity를 matrix를 이용해서 간단한 방식으로 분석한다.

DSM

Column방향으로 읽는다.

Module A는 B, C, D로 dependency 있고, Module B는 없고, C는 A, B로 dependency ...

Matrix에서 dependency가 좌하단쪽으로 기울도록 rearrange해준다.

Row가 텅빔 : 아무도 나를 사용하지 않는다 (남에게 어떤 서비스도 제공 X)

Column가 텅빔 : 남에게 서비스는 제공하지만 내가 다른 서비스 이용 X

Structure Layered Architecture

Structure Layered Architecture : 바로 하위 layer만 사용가능

Relaxed Layered Architecture : 하위 layer는 다 사용가능

 

Partitioning Algorithm

1. row가 텅 비어있는 (남들로부터 dependency 안받는) 모듈을 left, top으로 이동한다.

2. column이 텅 비어있는 (다른 모듈로 dependency 안가는) 모듈을 right, bottom으로 이동한다.

3. Circle갖고있는 놈들을 하나의 모듈로 합친다. (ex. B->C & C->B 디펜던시 갖고있는 놈들)