2011-02-19 2 views
5

많은 반복자 또는 데이터 판독기가 DataReader, XmlReader, IEnumerator, 그 이상이 더 많다는 것을 알고 있습니다. (생각 해보니).대부분의 경우에만 순회가 전달되는 이유는 무엇입니까?

이유는 무엇입니까? forward-only 일반적으로 사용자 정의 요구에 맞는 데이터 반복자를 만들 때 일반적으로 양쪽 탐색에 대한 지원을 추가해보십시오. 대부분의 경우 역방향 이동이 필요하지 않지만 때로는 필요성이 있으므로 결국에는 데이터를 유지하는 데 temp 변수를 작성해야합니다.


그래서 제 질문은 다음과 같습니다

  • 왜 대부분의 데이터 반복자 앞으로 만 있습니다

  • 는 이전 버전에 이동 반복자/데이터 리더를 만드는 내가 잘못. 왜 프레임 워크가 내장 된 데이터 반복자 (Iterator)에 대한 지원을하지 않는가?
  • 은 우리가 어떤 심각한 성능 단점 또는 단지 하지 간주 좋은 디자인가 가지고 같은 기능을 가지고 있습니까.


이 질문은 나에게 처음부터 많이 도청하지만 이리와 많은 개발자들이 뒤로 이송 때때로 유용 할 수 있음을 나와 함께 동의 할 수있다 믿는다을 부탁 해요, 그래서 만족스러운 대답을 얻었다 적이있다 .

답변

9

"만 전달"입니다 :

  • 대부분의 소비자
  • 간단하게 구현할 수에 대한 가장 일반적인 사용, 그래서 가장 가능성이 대부분의 생산자
  • 있는 유일한 것은 우리에 의해 구현 될 메모리의 모든 데이터를 버퍼링하지 않으려는 것으로 가정하면 보장 할 수 있습니다.
  • 임의 액세스 (보통 크기 데이터 용)를 허용하기 위해 쉽게 버퍼 됨

예를 들어, 데이터베이스, 네트워크 스트림 등에서 데이터를 읽는 경우 "전달"만 보장 할 수 있습니다. 확실히 모든 데이터를 임의로 버퍼링하고 싶지는 않습니다. 거대한 일 수 있습니다.

클라이언트가 정상적인 데이터를 가지고 있다고 생각하면 항상 ToList() 등으로 메모리에 버퍼링하고 임의 액세스를 허용 할 수 있습니다.

예를 들어,이 완벽 유효 시퀀스 고려해

public static IEnumerable<int> LotsOfData() { 
    var random = new Random(); 
    while(true) yield return random.Next(); 
} 
  • 이 버퍼링없이 역전 될 수
  • 는 길이가 무한대이기 때문에, 버퍼링 될 수

분명히 그 예가 약간있을 것 같지 않지만 소켓, 데이터베이스 또는 큰 파일에서 읽는 것은 ess 일 수 있습니다. 동등하게 시나리오.

+0

당신은 분명히 그 시나리오에 맞습니다.하지만 큰 파일에서 데이터를 읽는 동안 문제가 될 수 있습니다. 우리가 조금 뒤로 읽는다면 .. 논리는 포인터를 몇 비트 뒤로 이동시키고 다시 읽는 것과 같습니다. 물론 조금 더 많은 코드를 작성해야 할 것입니다. 그래서이 디자인에서 무엇이 잘못 될 수 있습니까? –

+0

아이디어는 기본적으로 모든 것을 위해 작동하는 하나의 일반적인 기본 접근 방식을 갖는 것입니다. 특수 시나리오 (역방향 읽기 또는 무작위 액세스와 같은)에서 다른 액세스 구성표를 사용하지 못하도록 막는 것은 없습니다 – Foxfire

+0

기본 SRP :). 중요하지 않은 기능을 객체에 추가하지 마십시오. 또한 - 글 머리 기호 4가 마음에 든다. 필요할 경우 버퍼링을 추가하기가 쉽다. – Goran

관련 문제