この質問は疑似 PHP でコーディングされていますが、これは純粋に仮説であるため、どの言語で回答が得られるかは気にしません (Ruby :-P を除く)。実際、PHP は、この種のロジックを実行する言語としてはおそらく最悪です。残念ながら、私はこれまで一度も実行したことがないので、実際の例を提供することはできません。したがって、仮説的な答えは完全に受け入れられます。
基本的に、タスクを実行するオブジェクトがたくさんあります。この例では、各オブジェクトがインターネットからファイルをダウンロードするクラスであるとします。各オブジェクトは異なるファイルをダウンロードし、ダウンロードは並行して実行されます。明らかに、一部のオブジェクトは他のオブジェクトより先にダウンロードを終了する場合があります。データの実際の取得はスレッドで実行される場合がありますが、それはこの質問には関係ありません。
したがって、オブジェクトを次のように定義できます。
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 が終了し、オブジェクトが破棄されたとします。これで、配列に 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++
ループは面倒です)。したがって、別のアプローチは、カウンターを保持することです。
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
)
それは醜いです。しかし、それは受け入れられますか?配列を「最適化」する必要がありますか。つまり、空白を削除するためにキーを再配置しますか?
または、私が知っておくべき別のプログラム構造がありますか? 何かを追加したり、何かを削除したり、変数のキーを参照したり、反復処理したりできる構造が欲しいのですが、それは配列ではありません。そのようなものは存在しますか?
私は何年もコーディングを行ってきましたが、この質問は何年にもわたって私を悩ませてきました。私はまだ答えを知りません. これは一部のプログラマーにとっては明白かもしれませんが、私にとっては非常に些細なことではありません。