문제

내 애플리케이션에서는 실행이 끝날 때 세 가지 다른 상태가 될 수 있는 트랜잭션을 실행하고 있습니다.

  • 성공
  • 실패
  • 보류 중

상태에 따라 애플리케이션 클라이언트는 다른 작업을 수행하려고 합니다.성공할 경우 거래 결과(위젯)를 검색하려고 합니다.실패한 경우 오류 이유를 받고 싶어합니다.거래가 보류 중인 경우 재시도할 시간을 예약하려고 합니다.현재 다음 메소드를 사용하여 객체를 반환합니다.

public interface Result() {
     State getState();
     Widget getWidget(); // Success
     Reason getFailureReason(); // Failure
     Callable<Result> getTask(); // Pending
}

클라이언트가 결과 개체의 상태를 확인하고 해당 값에 따라 적절한 메서드를 호출한다는 아이디어입니다.

if (result.getState() == State.PENDING) {
    result.getTask();
}

대신 콜백을 사용하는 것이 더 나을 수도 있다고 생각했습니다.

public interface TransactionCallback() {
    void onFailure(Reason reason);
    void onSuccess(Widget widget);
    Delay onPending(Delay previous);
}

어디 Delay 을 나타내는 클래스입니다 시간단위 및 기간을 통해 애플리케이션이 트랜잭션 실행 일정을 다시 설정할 수 있습니다.또 다른 대안은 실패 이유를 포함하는 예외를 발생시키고(예외 조건에서만 실패해야 하기 때문에) onSuccess 그리고 onPending 행동 양식.

그래서 SO에 대한 내 질문은 다음과 같습니다.콜백을 사용하는 것이 이 특정 문제에 적합한 패턴입니까, 아니면 더 적합한 것을 제안할 수 있는 사람이 있습니까?

도움이 되었습니까?

해결책

나는 이것이 콜백 패턴을 잘 사용한다고 생각하지 않습니다.

콜백은 호출 수신자가(예:귀하의 경우 트랜잭션)은 콜백 메서드가 반환된 후에도 작업을 계속해야 합니다.그러나 호출 수신자가 항상 수행하는 다음 작업이 호출자에게 반환되는 경우 콜백은 어떤 값도 추가하지 않습니다.이는 코드 구조를 더 복잡하고 읽기 어렵게 만듭니다.IMO에서는 결과 객체를 반환하거나 (예외 실패의 경우) 예외를 발생시키는 것이 더 나을 것입니다.

편집하다 -OP의 의견입니다.

호출자에게 트랜잭션을 계속해야 하는지 묻는 콜백 메서드를 사용하는 것의 가치를 알 수 있지만 아마도 간단한 시간 제한 매개 변수를 사용했을 것입니다.그러나 결과를 반환하기 위해 콜백 메서드를 사용하는 것은 (IMO) 여전히 잘못된 것입니다.

다른 팁

나는 콜백을 선호합니다 여러 곳에서 사용하면 코드가 줄어들고 읽기 쉬워집니다. Call Back IF 문을 사용하여 IF 명령문을 사용하여 어떤 일이 발생할 것인지 결정 (전화해야 할 메소드)은 서비스에 거래를 수행하며 서비스를 사용하는 모든 코드는 더 깨끗해 보입니다.

콜백 인수에는 호출을 소싱하는 객체가 포함되어야합니다. 나에게는 좋지 않지만 콜백을 사용하려면 일부 동기화 문제가 필요할 수 있습니다. 어떤 상태에서 콜백을받을 수 있는지 확인할 수 없습니다. 불가능하지는 않지만 고려가 필요할 수 있습니다.

물론 결과를 폴링하면 다른쪽에 동기화가 필요합니다. 그러나 동기화하기가 더 간단하게 들립니다.

콜백 솔루션은 확장 가능하지만 한 시점에서 동작을 비동기 호출로 변경하려고 할 수도 있습니다.

단점은 특히 초보자 프로그래머에게 코드가 덜 읽기 쉬운 것입니다. 그것이 당신에게 문제가되지 않으면 확실히 가십시오 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top