PHPの遺産を捨てろ:HSL `vec` と関数型パラダイムで実現する「壊れないコード」の設計術
Hackのコードベースを眺めていると、時折、2010年代初頭のPHPの亡霊に出会うことがある。「`array_map` を使い、連想配列とインデックス付き配列が混在した `array` を回しているコード」だ。
断言しよう。あなたのコードにまだ `array` が蔓延っているなら、それはHackの静的型システムを殺しているのと同じだ。
今日は、PHP的な「場当たり的な配列操作」を、HHVMの最適化を最大限に引き出すHSL(Hack Standard Library)の `vec` へと昇華させ、バグを型レベルで封殺する極限の設計パターンを伝授する。
—
1. なぜ `array_map` はHackにおいて「罪」なのか
PHPの `array_map` は、型システムから見れば「ブラックボックス」だ。引数に渡される配列がリストなのか、マップなのか、あるいは混在しているのか、実行時まで分からない。
// 悪い例:PHP的なアプローチ
function get_user_names(array $users): array {
return array_map(fn($u) => $u[‘name’], $users);
}
このコードの問題点は明白だ。
1. 型の不透明性: `array` は `AnyArray` と同義であり、返り値の構造を型チェッカーが追跡できない。
2. ランタイムコスト: HHVMは `array` が連続した整数キーを持つのか、ハッシュテーブルなのかを推測するために余計な負荷をかける。
—
2. HSL `vec` による型安全なパイプライン
`vec` を使うということは、単なる「型指定」ではない。「このデータ構造はインデックスの連続であり、イミュータブルである」という契約(Contract)をHHVMのJITコンパイラに対して突きつけることだ。
リファクタリング:関数型パイプライン
複雑な配列操作は、メソッドチェーンで記述する。これにより、中間変数のミューテーションを排除し、テスト容易性を飛躍的に高める。
use namespace HH\Lib\Vec;
type User = shape(‘id’ => int, ‘name’ => string, ‘active’ => bool);
function get_active_user_names(vec
return $users
// 1. フィルタリングで型を維持
|> Vec\filter($$, $u ==> $u[‘active’])
// 2. マッピングで変換を宣言的に記述
|> Vec\map($$, $u ==> $u[‘name’]);
/
- ポイント:
- |> (パイプ演算子) を使うことで、データの流れを左から右へ明示する。
- Vec\mapは結果として vec
を保証するため、 - 次の処理で型チェッカーが迷うことはない。
/
}
—
3. パフォーマンスの裏側:HHVMの最適化を信じろ
「関数型っぽく書くと遅くなるのでは?」という懸念を持つ諸君へ。
HHVMのアーキテクチャにおいて、`Vec\map` や `Vec\filter` は、内部的に高度に最適化されたイテレータとして扱われる。
- メモリ効率: `vec` は、従来の `array` に比べてメモリフットプリントが小さい。キーのハッシュ値を保持する必要がなく、単なるポインタの連続としてメモリ上に展開されるからだ。
- JITの恩恵: 型が `vec` であると確定している場合、HHVMのJITコンパイラは配列アクセスのためのインラインキャッシュを極限まで最適化できる。PHPの `array_map` を使うより、むしろ高速に動作するケースが大半だ。
—
4. 実務で「即採用」すべき設計パターン
非同期API連携を行う際、外部からのレスポンスをそのまま扱うのは危険だ。必ず `vec` にキャストし、ドメインモデルへ変換する境界(Boundary)を作れ。
use namespace HH\Lib\Vec;
// APIレスポンスを安全に処理するパターン
function process_api_response(mixed $input): vec
// 1. 型のガード(JSONデコード直後の危険地帯)
if (!is_vec($input)) return vec[];
// 2. 変換と抽出
return Vec\map($input, ($item) ==> {
// 形状チェックを行い、不正なデータには例外を投げるかデフォルト値を返す
return ($item is shape(‘username’ => string)) ? $item[‘username’] : ‘unknown’;
});
}
—
結論:Hackの美学
リファクタリングとは、コードを短くすることではない。「型チェッカーに語らせる(Let the type checker speak)」ことだ。
`array_map` を使い続けている限り、あなたのコードは「実行してみるまで分からない」というPHPの呪縛から逃れられない。`Vec` モジュールを使い、データの変遷を型で記述せよ。そうすれば、深夜のデバッグで頭を抱える時間は劇的に減るはずだ。
Hackは、単なる言語ではない。あなたが書いたコードが、実行時に「何者であるか」を証明するための強力なフレームワークだ。その力を引き出す準備はできているか?
さあ、コードを開いて `use namespace HH\Lib\Vec;` から始めよう。それが、モダンなHack開発のスタートラインだ。