こんにちは。Hack言語のコアを愛するエンジニアの皆さん。今日は、PHPの遺産である「配列の闇」から脱却し、Hackが誇る堅牢な静的型システムの一つである`Tuple`(タプル)型を使って、コードに魂を吹き込む方法についてお話ししましょう。
PHPでは、複数の値を返したいときに、つい`[‘status’ => 200, ‘data’ => $user]`のような連想配列を使いがちですよね。でも、それ、本当に「安全」と言い切れますか?
—
なぜ「配列」で戻り値を返すのが危険なのか?
PHPの配列は、いわば「何でも入る箱」です。型チェッカーから見れば、それはただの`dict
- キーの打ち間違い: `$result[‘sttaus’]` と書いても、実行するまでエラーになりません。
- 不完全な構造: `$result[‘data’]` が欠けていても、型チェッカーは文句を言いません。
- 認知負荷: 関数を呼び出すたびに「キーは何だっけ?」とソースコードを遡る必要があります。
これらは、大規模開発において「静的解析の放棄」を意味します。Hackの`strict`モードで開発しているなら、もっとエレガントで、計算機が納得する書き方をしましょう。
—
Tuple型による「構造的解釈」の導入
`Tuple`は、サイズが決まっており、各要素が特定の型を持つ「固定長のリスト」です。
基本的な書き方
例えば、「ユーザーID(int)」と「ユーザー名(string)」を返す関数を考えてみましょう。
<<__EntryPoint>>
function main(): void {
// Tupleを使って、戻り値の型を厳格に定義する
list($id, $name) = getUserInfo(1);
// $id は int、 $name は string であることが確定している
echo “User {$name} (ID: {$id}) is active.”;
}
// 戻り値の型として (int, string) を指定する
function getUserInfo(int $id): (int, string) {
// 常にこの順序、この型で値を返すことが保証される
return tuple($id, “Alice”);
}
なぜこれが強力なのか?
1. 分解の強制: `list($id, $name) = …` と書くことで、戻り値が必ず2つの要素を持つことを明示します。
2. 型推論の恩恵: `$id` や `$name` にカーソルを合わせるだけで、IDEは型を完璧に把握します。
3. メモリ効率: HHVMのJITコンパイラは、Tupleの構造が固定であることを理解しているため、配列よりも効率的なメモリ配置を行い、最適化の余地を最大限に引き出します。
—
よくある落とし穴:初心者がハマるポイント
Hackを学び始めた方が、Tupleを使いこなす中で遭遇しやすいエラーを解説しますね。
1. 要素数の不一致
`list($a, $b) = funcReturningTupleWith3Elements();` のように書くと、型チェッカーは容赦なく「要素数が合いません」と警告します。これはバグの温床を未然に防ぐHackの優しさです。
2. 戻り値の「箱」を間違えない
関数定義で `(int, string)` と書いたのに、`return tuple(“Alice”, 1);` と順序を逆にすると、型チェックで弾かれます。「順序」という明確な契約を定義できるのがTupleの強みなのです。
—
さらなる高みへ:Shape型との使い分け
ここまで読んだあなたは、「じゃあ、キーの名前も付けたい時はどうするの?」と思うはずです。その場合は`Shape`型を使いましょう。
- Tuple: 戻り値の「順序」に意味がある場合(例:座標 `(x, y)` や、計算結果の `(商, 余り)`)。
- Shape: 戻り値の「各フィールド」に意味がある場合(例:ユーザー情報の `shape(‘id’ => int, ‘name’ => string)`)。
使い分けの指針はこれだけです。「順序に依存するならTuple、名前でアクセスしたいならShape」。これを守るだけで、あなたのコードは劇的に堅牢になります。
—
まとめ:型は「守り」ではなく「道しるべ」
Hackの型システムは、開発者を縛り付けるための檻ではありません。むしろ、「ここを歩けば絶対に安全だ」と教えてくれる光の道です。
配列という曖昧な箱から卒業し、Tupleという構造化されたデータを使うことで、HHVMはあなたのコードをより深く理解し、より速く実行できるようになります。
まずは、小さな関数一つからで構いません。`array` を `(int, string)` のような `Tuple` に置き換えてみてください。型チェッカーが静かに、しかし力強くあなたをサポートしてくれる感覚が分かるはずです。
ここをクリアすれば、あなたはもうHackの基礎をバッチリマスターしたも同然です。さあ、次はどんな複雑なデータ構造を型で縛って遊びましょうか?