Этот вопрос кодируется в псевдо-PHP, но я действительно не против того, на каком языке я получаю ответы (кроме Ruby: -P), поскольку это чисто гипотетично. На самом деле PHP, возможно, является наихудшим языком для этого типа логики. К сожалению, я никогда не делал этого раньше, поэтому я не могу представить пример в реальном мире. Поэтому гипотетические ответы вполне приемлемы.Juggling нескольких экземпляров объектов
В принципе, у меня есть много объектов, выполняющих задачу. Для этого примера предположим, что каждый объект является классом, который загружает файл из Интернета. Каждый объект будет загружать другой файл, а загрузка выполняется параллельно. Очевидно, что некоторые объекты могут завершить загрузку перед другими. Фактический захват данных может выполняться в потоках, но это не относится к этому вопросу.
Таким образом, мы можем определить объект как таковой:
class DownloaderObject() {
var $url = '';
var $downloading = false;
function DownloaderObject($v){ // constructor
$this->url = $v;
start_downloading_in_the_background(url=$this->$url, callback=$this->finished);
$this->downloading = true;
}
function finished() {
save_the_data_somewhere();
$this->downloading = false;
$this->destroy(); // actually destroys the object
}
}
Итак, у нас есть много таких объектов, запущенных:
$download1 = new DownloaderObject('http://somesite.com/latest_windows.iso');
$download2 = new DownloaderObject('http://somesite.com/kitchen_sink.iso');
$download3 = new DownloaderObject('http://somesite.com/heroes_part_1.rar');
И мы можем хранить их в массиве:
$downloads = array($download1, $download2, $download3);
Итак, у нас есть массив, полный загрузок:
array(
1 => $download1,
2 => $download2,
3 => $download3
)
И мы можем перебирать их, как это:
print('Here are the downloads that are running:');
foreach ($downloads as $d) {
print($d->url . "\n");
}
Хорошо, теперь предположим, что скачать 2 заканчивается, и объект будет уничтожен. Теперь у нас должно быть два объекта в массиве:
array(
1 => $download1,
3 => $download3
)
Но есть дыра в массиве! Ключ № 2 не используется. Кроме того, если бы я хотел начать новую загрузку, неясно, куда вставить загрузку в массив. Далее может работать:
$i = 0;
while ($i < count($downloads) - 1) {
if (!is_object($downloads[$i])) {
$downloads[$i] = new DownloaderObject('http://somesite.com/doctorwho.iso');
break;
}
$i++;
}
Однако, это ужасно неэффективно (и while $i++
петли nooby). Таким образом, другой подход заключается в том, чтобы держать счетчик.
function add_download($url) {
global $downloads;
static $download_counter;
$download_counter++;
$downloads[$download_counter] = new DownloaderObject($url);
}
Это будет работать, но мы до сих пор получить отверстия в массиве:
array(
1 => DownloaderObject,
3 => DownloaderObject,
7 => DownloaderObject,
13 => DownloaderObject
)
Это некрасиво. Однако это приемлемо? Должен ли массив быть «дефрагментированным», то есть ключи перегруппированы, чтобы исключить пробелы?
Или есть другая программная структура, о которой я должен знать? Я хочу структуру, в которую я могу добавить материал, удалить материал, обратиться к ключам в переменной, прокрутить и т. Д., Что не является массивом. Существует ли такая вещь?
Я кодировал в течение многих лет, но этот вопрос прослушивал меня очень многие из тех лет, и я до сих пор не знаю ответа. Это может быть очевидно для некоторых программистов, но для меня это совершенно нетривиально.
Сегодня я использовал связанный список в приложении C, которое я написал, и они очень классные. Благодаря! :) –