副作用を型で支配する:Hackの「Capabilities(能力)」がもたらすコードの静寂
やあ。HHVMの深淵へようこそ。Hackのコア開発に関わっていると、よく「なぜPHPからこれほど厳しい制約を課す言語へと進化したのか?」と聞かれる。答えはシンプルだ。「予測可能性」をコンパイラに証明させるためだ。
PHPで開発していると、「この関数はデータベースを叩くのか? それともただの計算か?」と不安になったことはないかな? 実行してみるまで分からないコードは、バグの温床だ。
Hackが導入した「Capabilities(機能・能力)」と「Coeffects(コンテキスト)」は、その不安を型レベルで消し去るための究極の武器だ。今日は、このHack最強の武器を解説しよう。
—
1. Capabilitiesとは何か?:関数の「所信表明」
Hackにおいて、関数は単に引数と戻り値を持つだけではない。その関数が「何ができるか(何に触れるか)」を型シグネチャに刻み込むことができる。
// 何も副作用を持たない純粋な関数([defaults]なし)
function add(int $a, int $b): int {
return $a + $b;
}
// I/Oや状態変更を伴う関数([defaults]は一般的な副作用を許可する)
function saveToDb(string $data): void [defaults] {
// ここでデータベース接続やファイル書き込みが可能
}
なぜこれが重要なのか?
[defaults]を明記しない関数は、「副作用を一切起こさない」という強力な制約下にある。もし、純粋な関数の中で`echo`したり、グローバル変数に触れようとしたりすれば、HHVMの型チェッカー(`hh_client`)は容赦なくレッドカードを突きつける。
—
2. 副作用を型で分離する:[write_props]と[io]
HackのCoeffectsシステムは、より細かい制御を可能にする。
- `[pure]`: 完全に純粋(引数以外へのアクセス禁止)。
- `[write_props]`: オブジェクトのプロパティを変更する許可。
- `[io]`: ファイルシステムやネットワークに触れる許可。
実践:副作用を「隔離」する設計
class User {
private int $age = 0;
// プロパティを変更する権限を持つ関数
public function setAge(int $age): void [write_props] {
$this->age = $age;
}
// 読み取り専用の計算関数(副作用を持たない)
public function isAdult(): bool {
return $this->age >= 18;
}
}
ここで重要なのは、`isAdult()` には `[write_props]` がついていないことだ。もし誰かがこの関数内でうっかり `$this->age = 0;` と書いたら、コンパイルエラーになる。「読み取り専用だと言っただろ?」とコンパイラが教えてくれるわけだ。
—
3. 初学者が必ずハマる「罠」と解決策
Hackを始めたばかりの人が必ず直面するエラーがある。
エラー例:「副作用があるのに許可がない」
function logger(string $msg): void {
echo $msg; // 警告: [io] が不足している
}
解決策: 「この関数はI/Oを行う」と宣言する。
function logger(string $msg): void [io] {
echo $msg;
}
なぜこうなるのか?
HHVMの型システムは、上位の関数から下位の関数へ「権限の委譲」を確認する。`logger` が `[io]` を必要とするなら、それを呼び出す側の関数もまた `[io]` の権限を持っていなければならない。
イメージ図:
- `main()` [defaults] -> `process()` [io] -> `logger()` [io]
- もし `process()` が `[io]` を持っていなければ、`logger()` を呼ぶことはできない。
この「権限の伝播」こそが、アプリケーション全体で副作用を制御するための要だ。
—
4. なぜPHPからHackへ移行するのか?
多くの開発者は、PHPの自由さに疲弊してHackへ来る。PHPでは「どこでグローバル状態が書き換わったのか?」を追うためにデバッガをフル稼働させる必要があるが、Hackではコンパイラがそれを教えてくれる。
Hackの知見:
1. 純粋性を高める: `[pure]` なコードを増やすほど、ユニットテストは不要になる(入力に対する出力が常に一定だからだ)。
2. 制約は自由の始まり: 「何をしてもいい」コードベースはカオスだが、「何ができるか決まっている」コードベースは、大規模開発における唯一の救いだ。
—
さあ、Hackの掌握を始めよう
最初は `[io]` や `[write_props]` の記述が面倒に感じるかもしれない。だが、これは「将来の自分への保険」だ。
Hackの型システムは、君のコードが暴走しないように見張る強力なガーディアンだ。最初は厳格さに戸惑うかもしれないが、一度この「型による秩序」に慣れてしまえば、もうPHPの混沌とした世界には戻れなくなるはずだよ。
何か詰まったら、いつでも型チェッカーの出すエラーメッセージを読み解いてみてほしい。それは君を攻撃しているのではなく、君のコードをより堅牢にするための「設計図の修正案」なのだから。
ここをクリアすれば、君はもうHackのアーキテクチャの入り口に立ったも同然だ。さあ、次はどの機能の深淵を覗いてみたい?