やあ。Hackの深淵へようこそ。
君がこれまで書いてきたPHPコードの中に、`false`と`値`が混在する「あの忌まわしい戻り値」が潜んでいないだろうか?
`array_search`の結果をチェックし、`if ($result === false)`を書き連ねる……。あれは単なるコードの記述ではない。実行時に爆発する可能性を抱えた「時限爆弾」を、わざわざ自ら埋め込んでいるようなものなんだ。
今日は、HHVMの心臓部を司る我々が「なぜHSL(Hack Standard Library)の `C\firstx` や `C\findx` を使うことが、君のコードを救うのか」を、その本質から紐解いていくよ。
—
1. 撲滅すべき「曖昧な戻り値」の正体
PHPの標準関数は、往々にして「成功すれば値、失敗すればfalse」を返してくる。これは型システムにとっては悪夢だ。
// PHP的なアンチパターン
$items = [‘apple’, ‘banana’, ‘cherry’];
$result = array_search(‘dragonfruit’, $items); // falseが返ってくる
if ($result === false) {
// 悲しいかな、ここで「見つからなかった」というロジックを強制される
}
このコードの問題点は、「正常系」と「異常系」を呼び出し側が常に意識しなければならないことにある。プログラマの集中力は有限だ。このチェックを忘れた瞬間、型システムは崩壊し、実行時エラーの温床となる。
—
2. HSLの `C\firstx` と `C\findx`:例外駆動という「潔さ」
Hackの哲学は「型による安全」と「早期失敗(Fail-fast)」だ。
HSLの `C`(Collection)ネームスペースにある `x` がついた関数(`firstx`, `findx`, `idx`など)は、「要素が見つからなければ例外を投げる」という極めて潔い設計思想に基づいている。
C\firstx: 「最初の一つ」を確実に抜き取る
`firstx` は、コンテナの先頭要素を返す。もし空なら? 迷わず `OutOfBoundsException` を投げる。
use namespace HH\Lib\C;
$list = vec[‘apple’, ‘banana’];
// 確実に「apple」が手に入る。もし空なら例外が飛ぶため、
// 呼び出し側は「値が存在するはず」という前提で安全に実装できる。
$first = C\firstx($list);
C\findx: 条件に合致する「唯一の真実」を掴む
`findx` は、述語関数(predicate)に合致する要素を探索する。見つからなければ、やはり例外を投げる。
$users = vec[
shape(‘id’ => 1, ‘name’ => ‘Alice’),
shape(‘id’ => 2, ‘name’ => ‘Bob’),
];
// 「idが2のユーザーは必ず存在する」というビジネスロジックがあるなら、
// 戻り値のチェックを排してfindxを使うべきだ。
$user = C\findx($users, $u ==> $u[‘id’] === 2);
—
3. なぜ「例外」なのか?
ここで君はこう思うかもしれない。「例外を投げるのは怖くないか?」と。
答えは「No」だ。むしろ、「予期せぬ空(nullやfalse)をそのまま処理し続けて、プログラムのずっと後方で意図しない挙動になる」ことの方が遥かに危険だからだ。
- PHP流: 戻り値チェック漏れ → `null` が混入 → `null` を文字列として結合 → 「TypeError: Argument 1 must be string…」という不明瞭なエラー。
- Hack流: `C\findx` がその場で例外を投げる → どこでなぜ失敗したかがスタックトレースから一目瞭然。
「失敗する時は、最も近い場所で叫ぶ」。これが堅牢なシステムを作る鉄則だ。
—
4. 陥りやすい罠:型チェッカーとの対話
初心者がよくやる間違いは、`C\findx` が戻す型を無視することだ。
// ダメな例:例外を握りつぶして、結局if文で囲ってしまう
try {
$result = C\findx($items, $pred);
} catch (OutOfBoundsException $e) {
$result = null; // これでは元の木阿弥だ!
}
もし「見つからない可能性がある」のがビジネス要件なら、`C\findx` ではなく、例外を投げない `C\find` を使い、その戻り値は `?T` (Nullable) として型安全に扱う。これがHackの正しい作法だ。
- `C\findx`: 「必ずあるはず」という強気なロジックに。
- `C\find`: 「ないかもしれない」という現実的なロジックに。
—
まとめ:Hackを掌握するということ
Hackを習得するとは、単に構文を覚えることではない。「どの関数がどのようなエラーの責任を負うべきか」を設計レベルで理解することだ。
`C\firstx` や `C\findx` を使いこなせば、君のコードから `if ($result === false)` というノイズが消え去る。すると、コードには「本来やりたかったビジネスロジック」だけが純粋な形で残るようになるんだ。
どうだい? この清潔感こそが、Hackで開発する醍醐味だよ。
さあ、今すぐ君のコードベースから `false` を駆逐して、静的な安全を手に入れよう。ここをクリアすれば、もう君は立派なHackエンジニアだ。