개발자 끄적끄적
결합도 본문
<결합도(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에 바로 연관이 된다