발행-구독 패턴은 gotos와 어떻게 다릅니 까?


11

내 이해는 Goto 진술이 일반적으로 눈살을 찌푸리게한다는 것 입니다. 그러나 publish-subscribe 패턴 은 코드 조각이 메시지를 발행 할 때 단방향 제어 전송을 수행한다는 점에서 개념적으로 유사 해 보입니다. 프로그래머는 프로그램의 어떤 부분이이 메시지를 구독하고 있는지 전혀 모를 수 있습니다.

모듈을 통해 편리하게 "홉"하는 이벤트를 사용하는 많은 JavaScript 프로그램에서 비슷한 것을 보았습니다. 발행-구독 또는 이벤트 중심 패턴에 대한 정보가 누락 되었습니까?


5
return, try/catch, break, continue, switch- 그는 모든 goto . 고토 내장 제한의 다양한 수준의 유해가 어떻게 코드를 작품에 대한 생각에 유해한 것으로 간주.

@MichaelT : 압도적 인 대다수의 경우 코드를 쉽게 추론 할 수있는 대안이 있습니다. 그 사실을 이해하는 데 아무런 해가 없습니다. 보증은 보증 된 경우 goto를 사용하지 않거나 (보통 그렇지 않은 경우) goto를 부주의하게 사용하는 경우에만 수행됩니다. 나는 애플이 우리에게 좋은 예 를 보여 주었다고 생각한다 .
back2dos

... 프로그램의 부분이 가입하는 것을 전혀 생각 ... :에 첫 번째 큰 차이 goto에서 거짓말 의 끝 부분 . 두 번째 주요 차이점은 전혀 모른다 . 세 번째 주요 차이점은 개념적으로 a gosub가 아니라입니다 goto.
mouviciel

1
INTERCAL의 "come from"에 더 가깝습니다.
코드 InChaos

@ back2dos 그것은 또한 한 줄의 코드 블록에도 사용자 중괄호를 선호하는 이유의 좋은 예입니다.
MetaFight

답변:


19

그렇습니다, 당신은 확실히 무언가를 놓치고 있습니다 . 일반적으로 Gotos는 단방향 제어 전송을 수행하는 데 사용됩니다.

그러나 이벤트는 그렇게하지 않습니다. 코드가 이벤트를 발생 시키면 이벤트가 게시 (또는 처리, 대기, 실행 등)되면 코드 실행이 이벤트를 생성 한 코드의 다음 줄에서 다시 시작된다는 것을 잘 알고 있습니다.

goto를 사용하면 해당 명령문을 호출하는 코드와 수신 측의 코드를 매우 밀접하게 결합 할 수 있습니다. 개발자는 goto를 사용하기 위해 두 곳을 모두 잘 알고 있어야합니다.

반면, 이벤트를 발생시키는 코드는 일반적으로 해당 이벤트에 관심이있는 사람을 알거나 신경 쓰지 않습니다. 청취자 가 있을 수 있습니다. 또는 100 개의 리스너 또는 0이있을 수 있습니다. 해당 리스너는 이벤트가 발생한 동일한 프로그램에 있거나 완전히 다른 응용 프로그램에 있거나 다른 시스템에있을 수 있습니다. 출판사에 관한 한, 그가 일을 마치는 사건을 발생시키는 즉시.

지금까지 나와 함께 있다면, 위에서 설명한 것은 펍 / 서브 패턴의 이상적인 경우입니다. 불행히도 현실 세계는 항상 이상적이지는 않으며 게시자가 이벤트를 생성하고, 구독자가 호출되고, 상태가 전체적으로 변경되며, 코드 실행이 게시자에게 다시 반환되는 경우가 있습니다. 거꾸로 설정되었습니다. pub / sub 패턴이 매우 간단한 방식으로 구현 될 때 (예 : C #에서 델리게이트 또는 이벤트 사용, C에서 함수 / 인터페이스 포인터 사용) 이러한 조건이 자주 발생하기 때문에 과거에이 문제가 발생했다고 확신합니다. / C ++).

그러나이 문제는 반드시 펍 / 서브 패턴이 아니라 구현입니다. 그렇기 때문에 많은 시스템이 큐에 의존하여 이벤트가 게시 될 때 이벤트가 큐에 대기되어 나중에 호출되어 월드가 여전히 그대로있는 동안 실행을 완료 할 수있는 기회를 제공합니다. 게시자가 작업을 완료하면 이벤트 루프 (일명 디스패치 루프)가 이벤트를 발생시키고 구독자를 호출합니다.


+1 발행 / 구독은 느슨한 결합을 허용합니다. goto does
Fuhrmanator

6

몇 가지 차이점이 있습니다. 첫째, 코드가 GOTO를 실행할 때 제어권을 포기하며 제어권을 다시 확보 할 것이라는 보장은 없습니다. 그러나 pub / sub의 게시자는 계속 실행하고 논리를 수행하여 적절한 메시지를 보냅니다. 그 행동은 이해 가능하고 예측 가능합니다.

둘째, 가입자는 메시지를 수신하고 GOTO와 달리 메시지 자체가 컨텍스트를 전달합니다. 메시지 유형과 메시지가 전달하는 특성은 가입자에게 역할을 수행하는 데 도움이됩니다. 그리고 메시지를 처리 ​​한 후에도 가입자는 여전히 새 메시지를받을 수 있습니다. 따라서 행동도 이해할 수 있고 예측 가능합니다.

가장 큰 차이점은 게시자와 가입자가 잘 정의 된 실행 흐름을 가지고 있으며 본질적으로 메시지를 보내고받는 동안 루핑하고 작업을 계속 수행한다는 것입니다. GOTO 가 포함 된 코드는 잘 작성되고 질서 정연 할 수 있지만 성능이 저하 될 수 있으며 명확하게 이해 된 동작을 보장하지는 않습니다.

그래도 맞아. 누군가가 많은 메시지와 너무 작은 점프로 펍 / 서브 시스템을 작성하여 처리 흐름을 추적하는 것은 악몽이 될 수 있습니다. 다른 한편으로, 당신은 매우 질서있게 행동하고 쉽게 이해할 수있는 GOTO로 시스템을 작성할 수 있습니다. (심볼 언어가 인수되기 전에 매우 복잡한 시스템의 어셈블리 코드를 생각하고 있습니다.)

그러나 일반적으로 펍 / 서브에서 얻는 분리는 분산 처리 문제를 단순화하고 시스템 내 논리를 분리합니다. 또한 일반적으로 일직선 GOTO는 제어 흐름을 이해하는 데 문제가되는 복잡한 시스템을 만드는 경향이 있습니다.

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