2012-02-15 5 views
18

나는 다른 스레드에서 mini-discussion on the topic을 가졌으며 피험자의 "나쁜"측면에 대한 사람들의 의견을 듣고 싶습니다.RX 피실험자 - 피할 수 있습니까?

RX 포럼을 자주 방문하는 사람은 E.Meijer does not like Subjects을 알고 있습니다. RX 제작자의 의견에 대해 가장 깊은 존경심을 가지고있는 동안, 나는 몇 년 동안 여러 프로젝트에서 매우 광범위하게 주제를 사용 해왔고, 그것 때문에 어떤 건축 학적 문제 나 버그도 없었습니다.

피할 수있는 피사체의 유일한 함정은 "재사용 할 수 없다"라는 것입니다. 피사체의 관찰 가능 항목을 완료 한 후에는 새 가입자가 이벤트를 수신하기 전에이를 다시 인스턴스화해야합니다.

"코드 냄새"와 "마음에 들지 않습니다"는 "실용적인"예에 의해 지원되어야합니다 - 제목을 사용하면 버그 나 문제가 발생할 수있는 상황에 대해주의를 환기시킬 수 있습니까? 아니면 그들이 쉽고 무해하다고 생각할 수도 있습니다. 그런 다음 사용 장소를 정의하십시오.

답변

22

Erik Meijer는 순수한 기능적 방식으로 생각하고 있습니다. - 주제는 Rx의 가변 변수입니다. 따라서 일반적으로 사용법이 옳다. 주제를 사용하면 기능적으로 Thinking에서 벗어날 수있는 방법이되고, 너무 많이 사용하면 상류로 향하게된다.

그러나! 제목은 .NET의 비 기능 세계와 인터페이스 할 때 매우 유용합니다. 이벤트 또는 콜백 메소드를 래핑 하시겠습니까? 주제가 그럴 수 있습니다. 기존 코드에 Rx "인터페이스"를 넣으려고합니까? 제목 사용!

+3

소리가 적당합니다. 나는 이미 이벤트를 감싸는 방법 즉, Observable.FromEvent (Pattern)을 다시 제안한다. –

+2

그는 단순히 이벤트와 비동기 호출을 래핑하는 것이 아니라 그로부터 데이터를 사용한다는 것을 의미한다고 생각합니다. 예를 들어,'BeginRead' /'EndRead' 비동기 호출을 래핑하면 -'EndRead'는'BeginRead'에 전달 된 가변 바이트 배열에 액세스해야하는 실제 데이터를 얻기 위해 읽은 바이트 수만 반환합니다. – Tyson

+0

좋은 설명. – axel22

2

지연 결합으로 인해 반응 연결자가 복제 될 때마다 Subject/Publish을 사용합니다.

그러나 일상적인 사용을 위해서는 피사체가 약간 무겁다는 느낌이 들었습니다. OnNext는 잠재적 인 병 목일 수 있습니다. 이는 동시성 검사로 인해 구독자에게 가치를 부여하기 때문에 프로파일 링 중에 핫스팟으로 표시됩니다.

나는 Observables가 정의에 의해 뜨겁다는 것을 알고 있기 때문에 더 깨끗하다고 ​​느낍니다.

6

댓글 작성자가 서로 지나치는 것처럼 보입니다.

마지막으로 피사체를 사용한 것은 초기화 호출에서 미들웨어에 대리인을 전달해야 할 때였습니다. 문제가 발생했을 때 다시 전화 할 수있었습니다. 위임자는 익숙한 이벤트 args 서명을 가지고 있지만 이벤트가 없기 때문에 FromEvent를 사용할 수 없습니다.

나는 그것에 대해 나쁘지 않았다. 나는 다른 선택의 여지가 없었다.

기본적으로 나는 어떤 이벤트를 발생시키고 Rx 월드에 넣을 때 또는 아직 도착하지 않은 미래의 구독자에 대한 핸들을 필요로 할 때만 주제를 사용했습니다. 피험자는 내가 지금 얻은 것을 나중에 가입자에게 연결시켜줍니다.

+0

'Observable.FromEvent' 메서드가 당시에는 일반 대리자에게 제공되지 않았다는 의견을 유추했습니다. 아니면 그들이 아직 돈을 쓰지 않을 수도 있고, 그 일이 단순한 대의원 이라기보다는'사건 '이라고 명령 할 수도 있습니다. 그걸 확인해야 해. 하지만 당신이 한 일을 보여주는 몇 가지 코드를 올리시겠습니까? 'Subject '을 사용하는 방식을 이해하는 것이 궁금합니다. –

1

공개 API의 일부로 Subject<T>을 사용하는 것을 조심해야하는 한 가지 이유는 우려 사항이 혼합되어 있다는 점입니다. 관찰자는 관찰 가능한 것과는 별개의 관심사이다.

무엇 일부 악당 관찰자가 단지 관찰자 있어야했다 Subject<T>OnNext 또는 OnCompleted 또는 OnError를 호출하는 경우?

API의 일부가 아니고 서버에서 개인용 백업 필드로 사용하지 않는 경우에도 이중 역할을 담당한다는 사실만으로 방해가됩니다. 뒷받침 필드로 사용하는 경우에도 관측자의 역할/관심사 중 하나만 수행하도록 기대할 수 있습니다. 그러나 그것은 두 가지 일을 할 잠재력이 있으며 그것은 단지 정신적으로 방해가됩니다.

관련 문제