Imaginons que vous souhaitiez construire un Iterator qui crache des objets File. Quel type de données fournissez-vous habituellement au constructeur d'un tel itérateur?Construire un Iterator
- un tableau d'objets de fichiers pré-construits, ou
- simplement données brutes (tableau multidimensionnel, par exemple), et que les Iterator créer des objets de fichiers à la volée lorsque itérés?
Edit:
Bien que ma question était en fait d'être ment en général un possible, il semble que mon exemple est un peu à large pour aborder général, donc je vais élaborer un peu plus. Les objets File dont je parle sont en fait des références de fichiers provenant d'une base de données. Voir ces deux tableaux:
folder
| id | folderId | name |
------------------------------------
| 1 | null | downloads |
file
| id | folderId | name |
------------------------------------
| 1 | 1 | instructions.pdf |
Ils référencent les dossiers et fichiers réels sur un système de fichiers.
Maintenant, j'ai créé un objet FileManager. Cela sera en mesure de retourner une liste de dossiers et de fichiers. Par exemple:
FileManager::listFiles(Folder $folder);
... retourneraient un itérateur d'objets de fichier (ou, venez y penser, plutôt des objets FileReference) de la base de données.
Alors ma question se résume à: Si l'objet FileManager construit le Iterator dans ListFiles() voulez-vous faire quelque chose comme ça (code de pseudo):
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);
}
ou (pseudo code):
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);
}
Espérons que cela clarifie un peu les choses.
L'objet File est en fait un représentant d'un chemin de système de fichiers. Vous avez raison de dire que l'ouverture des fichiers physiques en une fois serait une mauvaise idée. Ce n'était en effet pas mon intention. J'ai mis à jour ma question. S'il vous plaît voir ma question étendue pour plus d'informations. Merci. –