UI에 진행 상황을보고하기위한 최상의 전략-콜백은 어떻게 발생합니까?


11

때때로 사용자는 실행하는 데 시간이 걸리는 확장 된 기술 작업을 시작합니다. 이 경우 일반적으로 현재 진행중인 작업에 대한 정보와 함께 진행률 표시 줄을 표시하는 것이 좋습니다.

UI와 논리 계층을 밀접하게 연결하지 않으려면 일반적으로 일종의 프록시를 통해 통신하는 것이 가장 좋습니다. 즉, 백엔드는 자체 UI 요소를 조작하거나 중개 계층과 직접 상호 작용하지 않아야합니다.

분명히이 작업을 수행하려면 어딘가에 콜백이 있어야합니다. 일반적으로 두 가지 방법 중 하나로 구현했습니다.

  1. 변경 가능한 오브젝트를 백엔드로 전달하고 진행 중에 백엔드가 변경하도록하십시오. 개체는 변경이 발생할 때 프런트 엔드에 알립니다.

  2. 양식의 콜백 함수 void f(ProgressObject)또는 ProgressObject -> unit백엔드가 호출하는 콜백 함수를 전달하십시오 . 이 경우 백엔드는이를 구성하며 ProgressObject완전히 수동적입니다. 진행 상황을보고 싶을 때마다 새로운 객체를 구성해야한다고 가정합니다.

이 방법의 단점과 장점은 무엇입니까? 사용하기에 합의 된 최상의 방법이 있습니까? 사용 환경이 다른가?

내가 간과 한 진행 상황을보고하는 완전히 다른 기술이 있습니까?


1
변경 가능 대 불변에 관해서, 장점과 단점은 다른 곳과 동일합니다. 진행률 개체와 관련하여 이것은 매우 가벼울 수 있습니다. 단일 숫자 (백분율)만큼 간단 할 수 있습니다.
Robert Harvey

@RobertHarvey 진행률 개체의 크기는 일반적으로 UI 요구 사항에 따라 다릅니다. 예를 들어 Windows 복사 대화 상자를보십시오. 많은 정보가 필요하다고 생각합니다.
GregRos

1
@RobertHarvey 저에게 뉴스입니다. 무엇입니까?
GregRos

1
물어볼 게 우리는 BackgroundWorker그 RH 언급을 사용 합니다. BackgroundWorker설계 상 별도의 스레드에서 실행되는 것처럼 "진행 형식"등과 함께 예외를 전달하기위한 간단한 메커니즘과 함께 사용자 정의 클래스로 래핑됩니다 . 우리가 .Net에서 제안한 방식으로 그 기능을 사용하는 한, 그것은 관용적이라고 할 수 있습니다. 주어진 언어 / 프레임 워크 맥락에서 "아이디 오 매틱"이 가장 좋습니다.
radarbob

2
두 방법 사이에 큰 차이는 없습니다. 프론트 엔드에서 백엔드로 전달 된 객체는 프론트 엔드를 알리는 메소드를 제공하여 실제로 콜백 기능을합니다. 그리고 두 번째 접근 방식이 정보를 전달하기 위해 다소 복잡한 매개 변수 객체를 사용하거나 몇 가지 간단한 값을 사용하더라도 아키텍처 관점과 차이가 없습니다. 두 방법 모두 백엔드가 적극적으로 프론트 엔드에 알립니다. 차이점은 사소한 세부 사항이므로 여기에 설명 된 다른 개념은 없습니다.
Doc Brown

답변:


8

변경 가능한 오브젝트를 백엔드로 전달하고 진행 중에 백엔드가 변경하도록하십시오. 개체는 변경이 발생할 때 프런트 엔드에 알립니다.

백엔드가 이와 관련하여 알리면 효율성의 균형을 맞추기가 어렵습니다. 주의를 기울이지 않으면 진행률을 높이면 매우 부드러운 진행률 업데이트를 목표로 작업을 완료하는 데 걸리는 시간이 두 배가 걸리거나 세 배가되는 것을 알 수 있습니다.

백엔드가 호출하는 void f (ProgressObject) 또는 ProgressObject-> 단위 형식의 콜백 함수를 전달하십시오. 이 경우 백엔드는 ProgressObject를 구성하며 완전히 수동적입니다. 진행 상황을보고 싶을 때마다 새로운 객체를 구성해야한다고 가정합니다.

나는 여기서 큰 차이를 얻지 못합니다.

내가 간과 한 진행 상황을보고하는 완전히 다른 기술이 있습니까?

백엔드에서 원자 단위로 별도의 스레드에서 프론트 엔드에서 폴링하십시오. 폴링은 유한 한 기간 내에 완료되는 작업을위한 것이기 때문에 특히 의미가 있습니다. 특히 부드러운 부드러운 진행률 표시 줄을 목표로하는 경우 프런트 엔드 픽업 상태 변경 가능성이 높습니다. 프런트 엔드 스레드에서 폴링하는 아이디어가 마음에 들지 않으면 조건 변수를 고려할 수 있지만이 경우 모든 세분화 된 진행률 막대 증가에 대한 알림을 피할 수 있습니다.


2

이것은 푸시 알림 메커니즘 의 차이점 입니다.

백엔드 작업이 백그라운드 / 작업자 스레드에서 실행될 것으로 예상되는 경우 변경 가능한 객체 ( pull )를 UI에서 반복적으로 폴링하고 동기화해야합니다.

콜백 ( push )은 실제로 변경 될 때만 UI에 대한 작업을 생성합니다. 많은 UI 프레임 워크에는 워커 스레드에서 호출 할 수있는 invokeOnUIThread가있어 UI 스레드에서 코드 조각을 실행하므로 스레드 관련 위험을 유발하지 않고 실제로 변경할 수 있습니다. (pun 의도)

일반적으로 푸시 알림은 작업이 필요할 때만 작업을 수행하므로 바람직합니다.


1
나는 당신이 말하는 것이 일반적으로 옳다고 생각합니다. 그러나이 특정 진행률 표시 줄의 경우 변경이 빠르게 발생할 수 있습니다. "진보"가 1 초에 여러 번 변경 될 것으로 예상되는 경우 풀 모델을 사용하는 것이 더 합리적입니다. 그렇지 않으면 UI가 처리 할 알림이 너무 많아지는 것에 대해 걱정해야합니다.
로봇

진행률 개체를 콜백하는 중일 수 있으므로 진행률 개체를 보내면 백엔드에서 사용중인 알림 메커니즘이 모호해질 수 있습니다. 나는 실제로 내가 기억하는 한 풀 메커니즘을 사용한 적이 없으며 그것에 대해 잊어 버렸습니다. : P
GregRos

The mutable object (the pull) will need to be repeatably polled by the UI and synchronized if you expect the back-end task to be executed in a background/worker thread.-변경 가능한 객체가 대화 상자 자체이거나 작동하는 인터페이스가 아닌 경우. 물론, 그것은 어쨌든 콜백에 해당합니다.
Robert Harvey

1
응? OP는 두 가지 다른 형태의 푸시 메커니즘을 명확하게 설명하고 있으며 폴링은 필요하지 않습니다.
Doc Brown

0

AngularJS와 함께 웹 소켓을 사용하고 있습니다. 프런트 엔드에 메시지가 수신되면 지정된 메시지 영역에 메시지가 표시되고 몇 초 후에 공백으로 사라집니다. 백엔드에서 상태 메시지를 메시지 대기열에 게시합니다. 텍스트 만 보내지 만 완료율이나 전송 속도와 같은 값을 가진 상태 객체를 보낼 수있는 이유는 없습니다.


0

당신은 당신의 "두 가지 방법"을 마치 별도의 개념 인 것처럼 언급하지만 그 부분을 조금 뒤로 밀고 싶습니다.

  1. 변경 가능한 오브젝트를 백엔드로 전달하고 진행 중에 백엔드가 변경하도록하십시오. 개체는 변경이 발생할 때 프런트 엔드에 알립니다.

이미 UI와 로직의 근접 결합을 피하고 싶다고 말 했으므로 전달하는이 "변경 가능한 객체"는 실제로 로직 모듈에 정의 된 특정 인터페이스의 구현이라고 가정 할 수 있습니다. 따라서, 이것은 진행에 대한 정보를 주기적으로 호출하는 프로세스로 콜백을 전달하는 또 다른 방법 일뿐입니다.

장점과 단점은 ...

메소드 (1)의 단점은 인터페이스를 구현하는 클래스가 한 번만 수행 할 수 있다는 것입니다. (다른 호출로 다른 작업을 수행하려면 switch 문 또는 방문자 패턴이 필요합니다.) 방법 (2)를 사용하면 동일한 객체가 백엔드 코드를 호출 할 때마다 다른 콜백을 사용할 수 있습니다. 스위치.

메소드 (1)의 장점은 메소드 (2)의 다중 콜백 또는 다중 컨텍스트에 대한 switch 문으로 단일 콜백을 처리하는 것보다 인터페이스에 다중 메소드를 사용하는 것이 훨씬 쉽다는 것입니다.


-2

사용할 수있는 기술은 매우 다를 수 있습니다.

다른 시나리오로 알아 내려고 노력합니다.

  • DB 요청
  • 파일 다운로드

db에 대한 간단한 로그인 요청 (하나의 elemt로 db의 응답을 의미)은 보고서 진행이 필요하지 않지만 별도의 작업 ex에서 UI 스레드를 해제 할 수 있습니다. async 또는 backgroundworker, 결과에 대한 콜백이 하나만 필요합니다.

그러나 1mln 품목의 모든 재고를 조회하려면 어떻게해야합니까? 이 쿼리는 완료하는 데 몇 분이 걸리므로이 경우 양식 항목 / 항목의 비즈니스 로직에서 perport 진행 상황을 구현해야합니다. 그러면 UI를 업데이트하고 취소 취소 옵션을 제공 할 수 있습니다.

파일 다운로드와 같은 경우입니다. 바이트 단위로 진행 콜백을 항상 구현할 수 있으며 http에 대한 모든 통신 제어를 유지하는 것은 매우 일반적입니다.

개인적으로 접근 할 때 다른 객체를 엔드 포인트와 공유하지 않고 고객에게만 비즈니스 진행 논리를 구현합니다.


1
장점 / 단점에 대한 질문에는 실제로 대답하지 않습니다.
Benni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.