PHPのレガシーを捨て、Hackの「型」で未来を創る:Vecと関数型アプローチの極意
こんにちは。Hackの深淵を覗き込み、HHVMの心臓部を日々チューニングしているアーキテクトです。
PHPの「配列(`array`)」という、型も構造も曖昧なブラックボックスを触る時代は終わりました。Hackには、静的型付けによる絶対的な安全性と、それを支えるHSL(Hack Standard Library)があります。
今回は、PHP時代からの悪しき習慣である「`array_map`による力技」を卒業し、Hackの`Vec`でコードを洗練させる手法を伝授します。ここをクリアすれば、あなたの書くコードは「動く」だけのものから「壊れない」ものへと進化します。
—
1. なぜ「PHPの配列」はHackで罪なのか?
PHPの`array`は、連想配列、リスト、スタック、キューをすべて同じ構造で扱う「万能ナイフ」です。しかし、万能ナイフは往々にして指を切りやすい。
一方、Hackの`Vec
PHPのレガシーなアプローチ(Bad)
// PHP的な古い書き方。型が曖昧で、バグの温床になります。
function get_prices(array $items): array {
return array_map(fn($item) => $item[‘price’], $items);
}
このコードの何が悪いのか? `array`は「何が入っているか」を型チェッカーに伝えないため、`$item[‘price’]`が存在しなかったり、数値でなかったりしても実行時までエラーに気づけません。
—
2. HSL `Vec` でコードを「関数型」の芸術へ
HSLの`Vec`モジュールを使うと、データ処理のパイプラインが非常に読みやすくなります。
HSLでのリファクタリング(Good)
use namespace HH\Lib\Vec;
type Item = shape(‘name’ => string, ‘price’ => int);
function get_prices(vec
// Vec\mapは、PHPのarray_mapの「型安全で洗練された」上位互換です
return Vec\map($items, $item ==> $item[‘price’]);
}
なぜこれが素晴らしいのか?
1. 型推論の透明性: `vec
2. 可読性: `Vec\map`は、データ変換という「操作」に焦点が当たっており、PHPの`array_map`のように「配列を操作する関数」という構造上のノイズがありません。
—
3. 陥りやすい罠:ここだけは気をつけろ!
初心者がよくやる「Hack的ではないミス」をいくつか挙げておきます。
罠①:不変性(Immutability)の忘却
Hackの`Vec`は不変です。PHPの`array_push`のように破壊的に値を書き換えることはできません。
- 間違い: `Vec\push($my_vec, $new_val)` (`Vec`は新しいVecを返すことを忘れないで!)
- 正解: `$new_vec = Vec\concat($my_vec, vec[$new_val]);`
罠②:`null`への甘え
PHPでは`array_map`の結果が`null`になることを許容しがちですが、Hackでは厳格です。`Vec`を操作する際は、空の結果であっても`vec[]`(空のベクタ)が返されることを型システムは期待します。`null`を混ぜてはいけません。
—
4. アーキテクトからのアドバイス:思考の転換
PHPからHackへ移行する際、最も大切なのは「データ構造を先に定義する」という意識です。
`array`を操作するのではなく、`vec`という「リスト」を変換(Mapping)し、必要に応じて`filter`し、最後に`reduce`する。この一連の関数型パイプラインこそが、Hackにおいて最も効率的で、メモリ効率も良い手法です。
HHVMのJITコンパイラは、この「不変な`Vec`に対する関数型操作」を極めて効率的に最適化します。あなたが綺麗に書けば書くほど、マシンの実行速度も上がるのです。
今日の宿題
あなたのプロジェクトにある、複雑な`array_map`を探してください。それを`use namespace HH\Lib\Vec;`を使って書き換えてみましょう。型エラーが出たら? それはHHVMが「あなたのコードの欠陥」を教えてくれている、ありがたい警告です。
Hackの世界へようこそ。型安全なコードは、あなたに自由な開発体験をもたらしますよ。
—
Hackコアコミッターより愛を込めて