하위 설계

Posted by yunki kim on May 6, 2021

모듈 설계

  모듈화

   -SW개발에서 큰 문제를 작은 문제로 나누는것, 정해진 크기가 없어서 클래스, 함수 등이 모두 모듈이될 수 있다. 

  모듈: 하나 또는 몇개의 논리적인 기능을 수행하기 위한 명령어들의 집합

  모듈화 특징:

    -다른 것들과 구별될 수 있는 독립적인 기능을 갖는 단위

    -유일한 이름이 있어야 된다

    -독립적으로 컴파일이 가능해야 됨

    -모듈에서 또 다른 모듈을 호출할 수 있다

    -다른 프로그램에서도 모듈을 호출하 수 있다.

  좋은 모듈 설계을 위한 원칙

    -결합도: 모듈 간의 결합(coupling)은 느슨하게한다(6단계)

        -모듈과 모듈 사이의 관계에서 관련 정도

        -좋은 설계: loosel coupled. 상호 의존성이 줄어 모듈의 독립성이 높아지고 모듈 간에 영향이 적기 때문이다

    -응집도: 모듈 내 구성 요소들 간의 응집(cohesion)은 강하게(7단계)

        -모듈 내부에 존재하는 구성 요소들 사이의 밀접한 정도

        -하나의 모듈 안에서 구성 요소들 간에 뭉쳐있는 정도로 평가한다. 

  모듈와의 장점

    -분할과 정복의 원리가 적용되 복잡도 감소

    -문제를 이해하기 쉽게 만든다

    -변경하기 쉽고, 변경으로 인한 영향이 감소된다

    -유지보수가 용이

    -프로그램을 효율적으로 관리 가능

    -오류로 인한 파급효화 최소화

    -설계 및 코드의 재사용

   모듈 갯수와 비용의 상관관계

     -모듈 갯수가 늘어나면 모듈 별 개발비용은 줄지만 모듈간의 통합 비용은 증가한다.

     -모듈 갯수가 적으면 모듈간의 의존도 증가로 인해 모듈별 개발비용이 증가하지만 모듈통합 비용은 줄어든다.

응집도

   1. 기능적(함수적 응집, Functional Cohesion)

    응집도가 가장 높으며 단일 기능의 요소로 하나의 모듈을 구성한다.

  2. 순차적 응집(Sequential Cohesion)

    A요소의 출력을 B요소의 입력으로 사용하므로 두 요소가 하나의 모듈을 구성한 경우

    두 요소가 아주 밀접하므로 하나의 모듈로 묶을 만한 충분한 이유가 있다.

  3. 순차적(정보적) 응집(Communication Cohesion)

    같은 입력을 사용하는 구성 요소들을 하나의 모듈로 구성

    구성 요소들이 동일한 출력을 만들어낼 때도 교환적 응집

    요소들 간의 순서는 중요하지 않다

   4. 절자적 응집(Procedural Cohesion)

.    순서가 정해진 몇 개의 구성 요소를 하나의 모듈로 구서

     순차적 응집과 다른점: 어떤 구성 요소의 출력이 다음 구성 요소의 입력으로 사용되지 않고, 순서에 따라 수행만 된다

  5. 시간적 응집(Temporal Cohesion)

    모듈내 구성 요소들의 기능도 다르고, 한 요소의 출력을 입력으로 사용하는 것도 아니고, 요소들 간에 순서도 정해져 있지 않다.

    구성 요소들이 같은 시간대에 함께 실행된다는 이유 만으로 하나의 모듈로 구성

  6.논리적 응집(Logical Cohesion)

    요소들 간에 공통점이 있거나 관련된 임무가 존재하거나 기능이 비슷하다는 이유로 하나의 모듈로 구성

  7. 우연적 응집(Coincidental Cohesion)

    구성 요소들이 말 그대로 우연히 모여 구성

    특별한 이유 없이 모듈을 나누는 과정에서 남는 것들 끼리 묶은것

 

결합도

  1. 데이터 결합(Data Coupling)

    가장 좋은 모듈 간 결합, 모듈같의 독립성 보장

    모듈들이 매개변수를 통해 데이터만 주고 받음으로써 서로의 간섭을 최소화 하는 관계

    관계가 아주 단순해 하나의 모듈을 변결했을 때 다른 모듈에 미치는 영향이 아주 적다

  2. 스탬프 결합(Stamp Coupling)

    두 모듈 사이에서 정보를 교환할 때 필요한 데이터만 주고받을 수 없고 필요 없는 데이터 까지 전체를 주고받아야 하는 경우

    레코드나 배열같은 데이터 구조, C언어의 구조체

    해결책: 단일 데이터만 전송(getter등을 사용)

  3. 제어 결합(Control Coupling)

    제어 플래그를 매개변수로 사용해 간섭하는 관계

    호출하는 모듈이 호출되는 모듈의 내부 구조를 잘 알고 논리적 흐름을 변경하는 관계

    정보은닉을 크게 위배하는 결합으로, 다른 모듈의 내부에 관해 관계가 복잡해짐

    해결책: 다형성

  4. 공통 결합(Common Coupling)

    모듈들이 공통 변수(전역변수)를 같이 사용해 발생하는 관계

    문제점: 변수 값이 변하면 모든 모듈이 함께 영향을 받는다는것

  5. 외부 결합(External Coupling)

    외부 변수로 선언된 데이터를 여러 모듈에서 사용되는 것

  6. 내용 결합(Content Coupling)

     모듈간의 인터페이스를 사용하지 않고 직접 왔다 갔다 하는 경우의 관계

     상대 모듈의 데이터를 직접 변경할 수 있어 서로 간섭을 가장 많이 하는 관계

     C언어의 goto문

모듈의 바람직한 설계

  -모듈간에는 꼭 필요한 데이터만 주고 받도록 한다

  -인터페이스의 수가 적고 복잡하지 않아야 된다

  -매개변수로 제어 플래그보다 데이터를사용->유지보수 용이성 향상