가능할 때마다 개체 간 통신을 요청 및 응답 모델로 제한하려고합니다. 내 프로그램에서 두 객체 A와 B 사이에 A가 B의 메소드를 직접 또는 간접적으로 호출하거나 B가 A의 메소드를 직접 또는 간접적으로 호출하는 방법이있을 수 있도록 부분적 순서가 내재되어 있습니다. 그러나 A와 B가 서로의 방법을 상호 호출하는 것은 불가능합니다. 물론, 메소드의 호출자와 역방향 통신을 원할 수도 있습니다. 이 작업을 좋아하는 몇 가지 방법이 있으며 그중 어느 것도 콜백이 아닙니다.
한 가지 방법은 메소드 호출의 리턴 값에 추가 정보를 포함시키는 것입니다. 이는 클라이언트 코드가 프로 시저가 제어를 리턴 한 후 클라이언트 코드가 수행 할 작업을 결정 함을 의미 합니다.
다른 방법은 상호 자식 개체를 호출하는 것입니다. 즉, A가 B에서 메소드를 호출하고 B가 A와 일부 정보를 통신해야하는 경우 B는 C에서 메소드를 호출합니다. 여기서 A와 B는 모두 C를 호출 할 수 있지만 C는 A 또는 B를 호출 할 수 없습니다. B가 제어를 A로 되 돌린 후 C에서 정보를 가져 오는 책임 오브젝트 A는 여전히 리턴 값에서만 정보를 검색 할 수 있습니다. 오브젝트 A의 메소드 중 어느 것도 B 또는 C에 의해 호출되지 않습니다.이 트릭의 변형은 C를 메소드에 매개 변수로 전달하는 것이지만 C와 A와 B의 관계에 대한 제한은 여전히 적용됩니다.
이제 중요한 질문은 내가 이런 식으로 일을 주장하는 이유 입니다. 세 가지 주요 이유가 있습니다.
- 내 객체가 더 느슨하게 결합되어 있습니다. 내 객체는 다른 객체를 캡슐화 할 수 있지만 호출자의 컨텍스트에 의존하지 않으며 컨텍스트는 캡슐화 된 객체에 의존하지 않습니다.
- 제어 흐름을 쉽게 추론 할 수 있습니다.
self
메소드 실행 중 내부 상태를 변경할 수있는 유일한 코드 는 해당 메소드 중 하나이고 다른 메소드는 아니라고 가정 할 수 있습니다 . 이것은 같은 종류의 추론으로 동시 객체에 뮤텍스를 넣을 수 있습니다.
- 그것은 내 객체의 캡슐화 된 데이터의 불변을 보호합니다. 공용 메소드는 불변에 의존 할 수 있으며, 다른 메소드가 이미 실행중인 동안 한 메소드를 외부에서 호출 할 수있는 경우 이러한 불변은 위반 될 수 있습니다.
모든 콜백 사용에 반대하는 것은 아닙니다. "호출자 호출"에 대한 내 정책에 따라, 객체 A가 B에서 메소드를 호출하고 콜백을 전달하는 경우 콜백은 A의 내부 상태를 변경하지 않을 수 있으며 A와 A로 캡슐화 된 객체를 포함합니다. A의 맥락에서 객체. 다시 말해, 콜백은 B에 의해 주어진 객체에 대해서만 메소드를 호출 할 수 있습니다. 실제로 콜백은 B와 동일한 제한을받습니다.
마지막으로 느슨한 결말은 내가 말한이 부분 순서에 관계없이 순수한 기능을 호출 할 수 있다는 것입니다. 순수한 함수는 변경 가능한 상태 또는 부작용에 따라 변하거나 의존 할 수 없다는 점에서 메소드와 약간 다르므로 혼동되는 문제에 대해 걱정할 필요가 없습니다.