"실제 세계"의 느슨하고 단단한 커플 링 이해


9

바이어스되지 않은 설명을 원하기 때문에 "커뮤니티"는 말하지 않지만 재사용 가능한 모듈을 작성 중이며 해당 모듈에 3 + 종속 모듈이 필요하고 그 중 하나를 제거하면 앱에서 깨짐 오류가 발생 한다고 가정 해 봅시다 . 이 모듈을 사용하지만 모듈 자체를 사용하는 전체.

내가 이해 한 것 (잘못)은 느슨하게 결합 된 모듈 식 시스템이 단순히 하나의 모듈 만 제거해도 깨지지 않을 것이다. 앱은 여전히 ​​실행되어야하지만 "기능"/ 모듈없이 실행되어야하며, 모듈 자체가 종속 모듈이 존재하지 않기 때문에 모든 것이 실행되지 않아야합니다.

이것이 잘못 되었습니까? 그렇다면 모듈이 여전히 작동하지 않는 모든 점에 의존한다면 타이트 / 루스 커플 링의 차이점은 무엇입니까?


2
이것은 자동차에서 타이어를 제거 할 수 있다고 주장하는 것과 비슷하며 여전히 잘 작동합니다.
Ryathal

1
@Ryathal-글쎄, 실제로 :) "자동차"는 잘 작동합니다. 타이어가 없지만 잘 작동합니다. 사실, 원한다면 바퀴를 망칠 수는 있지만 실제로 운전할 수도 있습니다. 조금 울퉁불퉁 할 수도 있습니다 :)
Rook

예, @ldigas가 말한 그대로. 자동차가 시작되고 라디오가 작동하고 모든 것이 작동하지만 운동 부분이 작동합니다. 그게 내가 말하려는 것입니다.
Oscar Godson

답변:


21

모듈을 제거하면 시스템이 제대로 작동하지 않을 수 있습니다. 느슨하게 연결된 시스템의 아이디어는 새 모듈이 이전 모듈과 동일한 인터페이스 요구 사항을 준수하는 한 완전히 다른 모듈로 교체해도 제대로 작동한다는 것입니다. 밀접하게 결합 된 경우, 주변 코드는 내부에 대해 추정하고 새 모듈이 도입되면 실패하기 시작합니다.


+1 : 정답입니다! 모듈은 다른 모듈에 의존해야하지만 내부 구현에는 의존하지 않아야합니다.
Giorgio

5

느슨한 결합 은 본질적으로 모듈이 어떻게 진화 할 수 있는지에 대한 간접적 인 종속성입니다.

일반적으로 밀접하게 결합 된 시스템이있는 경우 서로 다른 모듈 / 객체는 주변 객체의 행동을 가정하는 매우 특정한 행동을 갖습니다. 이러한 객체는 다른 모듈 비헤이비어에 연결 / 연결되어 있으며 단독으로 또는 다른 상황에서 재사용 할 수 없습니다.

개별 기능을 담당하지만 이러한 모듈은 독립적으로 발전 할 수 없거나 발전 할 수 없습니다


예를 들면 :

3 개의 객체 Shape(모델 객체)와 Canvas(UI 요소) 가 있다고 가정 해 봅시다 . 지금

메소드 shape.draw(Canvas)가 캔버스의 평면에서 제공하는 평면에 객체를 그릴 것이라고 가정합니다 .

이제는 때때로 창문이 부분적으로 덮히 고 크기가 조정됩니다. 이러한 경우 위의 방법은 이와 같은 작업을 수행 할 수 있습니다.

shape::draw(Canvas) {
   Rect.WindowLeft = Canvas.GetWindowRect.getLeftOffset(); 
   Rect.LeftPixel = Canvas.GetWindowRect.pixels() + Rect.WindowLeft; 
   ....  // like this get all co-ordinates. 

   draw_instance(Rect);  // This will draw the actual shape. 
}

기본적으로, draw 함수는 사물을 그릴 필요가있는 사각형을 선택합니다. 이것은 이해하기 쉽다 (사람들은이 간단한 코드 라고 부를 수있다 ). 그러나 이것은 매우 결합 된 코드입니다.

상황을 상상해보십시오.

  • 캔버스를 유지하는 캔버스의 메커니즘이 더 이상 사각형이 아닌 경우 어떻게해야합니까?
  • 추가 오프셋은 캔버스 인 유지하는 것이 무엇인지가있는 경우 개인 ?
  • 다른 응용 프로그램이 같은 모양을 원하지만 더 이상 GUI 창이없는 경우 (예 : 이미지를 만들고 파일로 저장하는 경우) 어떻게해야합니까?

문제의 근본 원인은 객체 shape 가를 알고 있으므로 밀접하게 연결 되어 있기 때문 입니다 Canvas.

픽셀 세트는 그것이 기록되는 곳의 형상에 제공되는 것이 바람직하다; 는 shape픽셀이 실제로 기록 된 위치에 대한 (심지어 암시 적) 지식이없는 것이다.


0

모듈로 지정한 내용에 따라 다릅니다. 시스템의 일부 부분은 밀접하게 연결되어 있어야하지만 (예 : 전체 앱에서 엔터티를 재사용해야 함) 일부 인터페이스는 인터페이스가 분리되어 있거나 모듈을 제거해도 응용 프로그램이 중단되지 않는 문제에 대해 느슨해야합니다 그런 다음 해당 모듈을 IoC 컨테이너 등을 통해 동적으로 연결해야합니다.

또한, 긴밀한 결합은 어떤 부분 이 모듈이나 다른 것의 정의가 아니라 특정 모듈 구현 에 의존한다는 것을 의미합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.