개발자 끄적끄적

결합도 본문

소프트웨어공학

결합도

햏치 2024. 4. 16. 02:16

<결합도(Coupling)>
- 모듈과 모듈사이에 관계를 어떻게 설계할 것인가 -> 결합도는 낮게 
- Minimise coupling, make routins as independent ad possible(low RE)
- Low coupling => well-partitioned
- No routine should have to worry about the internal details or another






<Class of Coupling>
Normal(low)
  - Data(데이터)
  - Stamp(스탬프)
  - Control(제어)
-------------------------------"Modularity Line"
Poor(high)
  - Common(공통)
  - Content(내용)





<Normal Coupling(데이터결합도, 스탬프 결합도, 제어 결합도)>
- To routines are normally coupled if :
  - A Calls B
  - B returns to A
  - All information passed between them is by means of parameters presented in the call itself
  - ex)구조도(structure chart) 
                                                 <-o Y //data couple
  A(함수 or 모듈)  -------->(호출관계) --------> B(함수 or 모듈)
                        X o-> //data couple
  - A모듈과 B모듈은 정상적(normally coupled)으로 결합이 되어 있다






<Data Coupling(데이터 결합도)>
- Two routines are data coupled if:
  - They communicated by parameters(두 모듈 간에는 parameters(인자)로써 호출)
  - Each parameter is as elementary piece of data(각 인자는 elementary piece(구조체x, 기본적인 data)로 전달해야 한다)
*구조체로 전달하면 응집도가 높아진다

  - ex) 데
  Access House Affordability(모듈)
  Sum Borrowed(입력 데이터(인자)), Interest Rate(이자, 입력 데이터), Term(기간, 입력 데이터)
   
  Calculate Mortage Repayment(모듈, 주택담보대출 상환률)
  Repayment Rate(상환률, 출력데이터)
  - 즉, 주택담보대출 상환률이 변하더라도 Access House Affordability모듈이 변하지는 않는다





<A Composity piece of Data...>
- 구조체
  Customer Rental Record:
    - Customer Name
    - Membership Number
    - Registration Number
    - Car Type
    - Miles Driven
    - Days Used
- Basic Charge depends on Car Type, Miles Driven
- Petrol Charge depens on Miles Driven





<Problem with Stamp Coupling>
- Any changes in //전혀 상관없는 데이터 field의 변화가
  - Customer Name
  - Membership Number
  - Registration number

- Will necessitate
  - recommpliation of "Calculate Basic Charge" and "Calculate Petrol Charge" //데이터 field를 사용하는 모듈들을 다시 컴파일해서 목적코드를 새로 만들어야한다
  - Even though the routines do not nedd those fields

*data couple : ○->
//일반적인 데이터

*control flag : ●-> 
//로직을 제어(if문, 실제 연산하는 데이터를 모델링 등)






<Stamp Coupling(스탬프 결합도)>
- Two normally coupled routines are stamp coupled if:
  - One passes the other a composite piece of data 
  - Data with meaningful internal structure

- May be necessary at times
  - Do not pass records containing many fields when only a few of those fileds are needed
*구조체로 보내면 필요없는 데이터까지 보내질 수 있다





<Sample Solution>
- 모듈에서 필요로 하는 정보만을 준다




<Control Coupling(제어 결합도)>
- Two routines are control coupled if one passes the other a piece of information intended to control to control the intemal logic of another





<Convert Distance Routine>
- 2개의 모듈을 가지고 있다
- ex)
declare convert_distance(in distance:real, in flag:real):real;
declare conv_distance = 0.0: real;

if(flag=1) then
  conv_distance <- distance*8/5; //첫 번째 기능
else if(flag=2) then
  conv_distance <- distance*5/8; //두 번째 기능
end if;
return conv_distance;
end convert_distance;
*flag 값은 연산이 아니라 로직을 결정하는데 사용된다 -> control flag
*control flag : ●-> : flag
*data couple : ○-> : distance






<Calling the Routine>
- kms <-- convert_distance(miles,1); //인자를 1을 주면 mils로 바꾸고
- miles <-- convert_distance(kms, 2); //인자를 2로 주면 kms로 바꾼다 -> 영향을 준다
  - These routines calls must know the intermal details of "convert_distnace"
  - Intermal changes may lead to changes in those routines that call "convert_distance"
  - The ripple effect

  - sol) miles을 kms로 바꾸는 m2k 라는 모듈을 만들고
         kms를 miles로 바꾸는 k2m 라는 모듈을 만든다
         A라는 모듈을 만들고 원하는 모듈에 원하는 distance을 준다
         return 값은 conver_distance






<Common Couple(공통 결합도)>
- Two(or more) routines are common couple if they refer to the same global data read
- 전역변수(모듈)이 존재하고, A(create),B(read), C(update)가 존재할 때 -> A, B, C사이에는 공통 결합이 되어있다
- 가능한 전역변수를 사용하지 않는다





<Content Coupling(내용 결합도)>
- Difficult to Implement in High Level Languages
- Low level Language에서 Content Coupling 발생

- ex) 모듈 A
Routine A 
...
JMP SRCH+35 //35 바이트만큼 떨어지게 점프
...
End Rouitne A

- ex) 모듈 B
Routine B
...
SRCH:
...
...
+35 LDA X, Y
End Routine A 
- 모듈B의 변경내용이 모듈A에 바로 연관이 된다









'소프트웨어공학' 카테고리의 다른 글

오픈소스 라이선스  (0) 2024.04.30
응집도  (0) 2024.04.16
순차 다이어그램  (0) 2024.04.12