2010-01-09 4 views
0

File 오브젝트를 출력하는 Iterator를 구성한다고 가정 해 봅시다. 그런 반복자의 생성자에 보통 어떤 유형의 데이터를 제공합니까?Iterator를 구축하십시오.

  • 사전 구성된 파일 오브젝트의 배열 또는
  • 단순히 원본 데이터 (예를 들면 다차원 배열)과 반복되어 때 반복자 즉시 파일 객체를 생성 할 수?

편집 :
내 질문이 실제로 가능한 일반적으로, 표준했지만, 내 예는 다양한에 약간 일반적으로 해결하는 것, 그래서 좀 더 정교한 수 있습니다. 내가 말하는 File 객체는 실제로 데이터베이스의 파일 참조입니다. 이 두 테이블을 참조하십시오

folder 
| id | folderId | name    | 
------------------------------------ 
| 1 |  null | downloads  | 

file 
| id | folderId | name    | 
------------------------------------ 
| 1 |  1 | instructions.pdf | 

그들은 파일 시스템에 실제 폴더와 파일을 참조합니다.

이제 FileManager 객체를 만들었습니다. 이렇게하면 폴더 및 파일 목록을 반환 할 수 있습니다. 예를 들어 :

FileManager::listFiles(Folder $folder); 

는 ... 데이터베이스에서 (FileReference 객체 오히려 그것을 생각 해 보 니, 나) File 객체의 반복자를 반환합니다.

그래서 내 질문에 귀결 것은 : 파일 관리자 객체가 때 listFiles의 Iterator를 (구축하는 경우)이 같은 (의사 코드) 뭔가를 할 것이다 :

listFiles(Folder $folder) 
{ 
    // let's assume the following returns an multidimensional array of rows 
    $filesData = $db->fetch($sqlForFetchingFilesFromFolder); 
    // let the Iterator take care of constructing the FileReference objects with each iteration 
    return FileIterator($filesData); 

} 

또는 (의사 코드) :

listFiles(Folder $folder) 
{ 
    // let's assume the following returns an multidimensional array of rows 
    $filesData = $db->fetch($sqlForFetchingFilesFromFolder); 
    $files = array(); 
    for each($filesData as $fileData) 
    { 
     $files.push (new FileReference($fileData)); 
    } 
    // provide the Iterator with precomposed FileReference objects 
    return FileIterator($files); 

} 

희망 사항은 약간 명확합니다.

답변

1

"파일"개체 란 무엇입니까? 파일에 대한 열린 핸들 또는 차례로 열 수있는 파일 시스템 경로 표현?

모든 파일을 한꺼번에 열어 보는 것은 일반적으로 좋지 않습니다. 결국 반복기 사용의 한 부분은 한 번에 하나의 객체에만 액세스한다는 것입니다. 반복기는 한 번에 하나의 열린 파일을 생성 할 수 있으며 호출자가 닫는 것에 대한 책임을지게 할 수 있습니다. 단, 다시 사용하는 것은 약간 이상 할 수도 있습니다.

귀하의 요구 사항이 명확하지 않습니다. 제 경험상 일련의 파일을 생성하는 대부분의 반복자는 Directory.GetFiles(pattern)과 같은 것을 사용합니다. 원시 데이터를 전혀 전달하지 않고, 당신을 위해 데이터를 찾을 수 있습니다.

당신이 무엇을 얻으려고하는지 명확하지 않습니다 - 당신이 일반적인 질문을하려는 것처럼 느껴지지만 우리가 당신에게 조언을 해줄 충분한 정보를 제공하지 못했습니다.그것은 "문자열이나 정수를 사용하고 싶습니까?"라고 묻는 것과 같습니다. 어떤 문맥도주지 않고.

편집 : 개인적으로 에 해당 논리의 모든을 푸시 할 것입니다. 그렇지 않으면 실제로 어떤 가치를 제공하는지 알기가 어렵습니다. C# 또는 Python과 같은 언어에서는 처음에는 별도의 클래스가 필요하지 않습니다. 일부 설명이있는 생성기 만 사용하면됩니다. 그런 의미에서이 질문은 당신이 필요로 달려 불가지론 언어 :(

+0

File 객체는 실제로 파일 시스템 경로를 나타냅니다. 한 번에 실제 파일을 여는 것이 좋지 않을 것입니다. 그건 내 의도가 아니 었어. 내 질문을 업데이트했습니다. 자세한 내용은 내 확장 질문을 참조하십시오. 감사. –

1

반복자가 정확히 무엇을해야합니까? 파일에 데이터 쓰기? 그들을 만드시겠습니까?

이터레이터는들을 돌연변이되지 하는 uniformous 방법 순차 데이터를 제공하는 수단 데이터를 반복 위한 패턴이다.

+0

질문이 업데이트되었습니다. 자세한 내용은 내 확장 질문을 참조하십시오. 감사. –

0

되지 않습니다 예를 들어, 당신은 할 수 : 파일 이름의

  • 모음/목록을 반복하는,
  • 이름을. 디렉토리의 통해 당신은 반복 할;
  • 당신의 반복자는 반환하고자하는 어떤 파일 자체를 결정할 수,
  • ...

기본 클래스를 디자인 할 수 있습니다. FilenameCollection 또는 Directory에는 매개 변수를 반복자의 생성자에 전달해야하는 대신이 유형의 객체 (즉, 반복자 "팩토리 메소드")에 적합한 반복자를 반환하는 메소드가 있습니다.

1

나는 명확하지 않은 질문을 찾습니다.

우리는 Iterator 또는 Factory를 말하고 있습니까?

은 나에게 반복자는 가지의 기존 컬렉션 운영하고 호출자가 차례로 각 에 작업 할 수있다.

"Spits Out"이라고 말하면 클라이언트가 기존 파일 세트에서 하나의 파일로 작업 할 수있게하거나 데이터를 반복하고 있음을 의미합니까? 생성. 우리가 유전자를 생성한다면 File factory를 얻게됩니다.

내 생각에 파일 sytstem에서 일부 파일을 처리하려고합니다. 나는 당신의 Iterator가 Directory와 비슷하다고 생각한다. 당신이 알고있는 다음 파일을 줄 수있다. 그래서 나는 당신이 어떤 파일을 의미 하는지를 알 수있는 충분한 데이터를 전달함으로써 "Driectory"를 구축합니다 (단지 OS 경로 일 수도 있고 "find"enxpression 일 수도 있고 ftp와 같은 참조 목록 일 수도 있습니다). 내가 반복 할 때 다음 파일을 줄 것을 기대하십시오.

---- 질문 해명 내가 개별 파일을 열 수 있어야 할 때 여기에 핵심 문제라고 생각

다음 업데이트되었습니다. Iterator 자체는 열린 파일 핸들에 해당하는 File 객체를 합리적으로 반환하므로 호출자는 파일을 사용하여 작업 할 수 있습니다. 그러나 반복적으로 iterator는 목록에 대해 미리 열어 놓은 파일 중 또는 목록의 파일 참조로에 대해 작업해야하며 iterator next()로 열리는 파일이 사용됩니다.

오픈 파일을 가지고있어서 오버 헤드가 있기 때문에 우리는 후자를해야한다고 생각합니다. 따라서 필요할 때만 파일을 열어야합니다.

그러면 다른 점이 하나 : 누가 파일을 닫습니까? 우리는 그들 모두를 열어 둘 수 없다. 아마도 iterator는 next()가 호출 될 때 각 파일을 닫아야한다. 이것은 현재 열려있는 파일을 정리할 수 있도록 iterator 자체에 close() 메서드가 필요하다는 것을 의미합니다.간결하게 고객의 책임임을 명시 적으로 문서화해야합니다.

+0

흠, 당신은 Directory 자체가 Iterator가 될 수 있다고 말하면서 매우 좋은 지적을하고 있습니다. 그렇게 생각하지 않았습니다. 감사! –

+0

당신이 유효한 포인트를 만들지 만, 실제 물리적 파일을 아직 열어 두지 않았다고 생각합니다. 반복기는 처음에는 MVC 응용 프로그램보기에서 파일 이름을 표시하는 데 사용됩니다. 나중에 File (Reference) 객체가 실제로 다운로드 할 실제 파일을 제공하기를 원합니다. 그러나 그것은 아직 나의 관심사가 아니었다. 필자의 걱정거리는 Iterator를 생성하는 방법이다. 하지만 Iterator에 대한 다른 시각을 주었기 때문에 제 디자인을 다시 생각할 것입니다. 나는 당신의 "디렉토리 자체를 반복자 (Iterator)"로 생각하게한다. –

관련 문제