184 lines
4.0 KiB
Markdown
184 lines
4.0 KiB
Markdown
|
|
# birthの原則 - なぜすべての箱は「生まれる」必要があるのか
|
|||
|
|
|
|||
|
|
## 🌟 決定的な瞬間
|
|||
|
|
|
|||
|
|
プラグインボックスの実装で、ChatGPT5が提案した:
|
|||
|
|
|
|||
|
|
```rust
|
|||
|
|
// 効率的に見える罠
|
|||
|
|
static SHARED_INSTANCES: HashMap<String, Arc<PluginBox>>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
にゃーが却下した:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
「他の箱と同じようにbirthでインスタンスをうむ」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
この判断が、システム全体の一貫性を救った。
|
|||
|
|
|
|||
|
|
## 📦 birthの哲学
|
|||
|
|
|
|||
|
|
### すべての箱は平等に生まれる
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// ユーザー定義Box
|
|||
|
|
box Person {
|
|||
|
|
birth(name) {
|
|||
|
|
me.name = name
|
|||
|
|
print(name + " が生まれました")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ビルトインBox(概念的に)
|
|||
|
|
box StringBox {
|
|||
|
|
birth(value) {
|
|||
|
|
me.value = value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// プラグインBox - 同じ原則!
|
|||
|
|
box FileBox from PluginBox {
|
|||
|
|
birth(path) {
|
|||
|
|
// 外部ライブラリ初期化は1回だけ
|
|||
|
|
FileSystem.initOnce()
|
|||
|
|
|
|||
|
|
// でもインスタンスは普通に生成
|
|||
|
|
me.handle = newHandle()
|
|||
|
|
me.path = path
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ⚠️ 参照共有の誘惑と危険
|
|||
|
|
|
|||
|
|
### なぜ参照共有は魅力的に見えるか
|
|||
|
|
|
|||
|
|
1. **効率性**
|
|||
|
|
- メモリ節約
|
|||
|
|
- 初期化コスト削減
|
|||
|
|
- 「賢い」実装に見える
|
|||
|
|
|
|||
|
|
2. **既存パターン**
|
|||
|
|
- シングルトン
|
|||
|
|
- ファクトリーパターン
|
|||
|
|
- DIコンテナ
|
|||
|
|
|
|||
|
|
### しかし、これが破壊するもの
|
|||
|
|
|
|||
|
|
1. **予測可能性の喪失**
|
|||
|
|
```nyash
|
|||
|
|
local f1 = new FileBox("data.txt")
|
|||
|
|
local f2 = new FileBox("data.txt")
|
|||
|
|
// f1とf2は同じ?違う?予測できない!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **状態管理の複雑化**
|
|||
|
|
```nyash
|
|||
|
|
f1.write("Hello")
|
|||
|
|
// f2も変更される?されない?
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **デバッグの困難化**
|
|||
|
|
- どのインスタンスが問題か特定困難
|
|||
|
|
- 状態の追跡が複雑
|
|||
|
|
- テストの独立性が失われる
|
|||
|
|
|
|||
|
|
## 🎯 birthがもたらす利点
|
|||
|
|
|
|||
|
|
### 1. 明確な生成と死
|
|||
|
|
```nyash
|
|||
|
|
// 生まれる瞬間が明確
|
|||
|
|
local box = new MyBox() // birth呼ばれる
|
|||
|
|
|
|||
|
|
// 死ぬ瞬間も明確
|
|||
|
|
box = null // fini呼ばれる
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 独立性の保証
|
|||
|
|
```nyash
|
|||
|
|
local a = new ArrayBox()
|
|||
|
|
local b = new ArrayBox()
|
|||
|
|
a.push("item")
|
|||
|
|
// bは影響を受けない - 当たり前だが重要!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 初期化の一貫性
|
|||
|
|
```nyash
|
|||
|
|
// どの箱も同じパターン
|
|||
|
|
new Box() → birth() → 使用可能
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 実装の知恵
|
|||
|
|
|
|||
|
|
### 外部リソースとの両立
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// グローバル初期化とインスタンス生成の分離
|
|||
|
|
static box FileSystem {
|
|||
|
|
static initialized = false
|
|||
|
|
|
|||
|
|
static initOnce() {
|
|||
|
|
if (!initialized) {
|
|||
|
|
NativeFileSystem.init()
|
|||
|
|
initialized = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
box FileBox {
|
|||
|
|
birth(path) {
|
|||
|
|
FileSystem.initOnce() // 初回のみ実行
|
|||
|
|
me.handle = createHandle() // 毎回新規作成
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 💡 深い洞察
|
|||
|
|
|
|||
|
|
### birthは技術的決定ではなく哲学的決定
|
|||
|
|
|
|||
|
|
1. **生命のメタファー**
|
|||
|
|
- 箱は「生きている」
|
|||
|
|
- 生まれ、成長し、役割を終える
|
|||
|
|
- 各々が独立した存在
|
|||
|
|
|
|||
|
|
2. **公平性の原則**
|
|||
|
|
- ビルトインもプラグインもユーザー定義も
|
|||
|
|
- すべて同じ規則に従う
|
|||
|
|
- 特別扱いなし
|
|||
|
|
|
|||
|
|
3. **シンプルさの追求**
|
|||
|
|
- 「new → birth」これだけ
|
|||
|
|
- 例外なし
|
|||
|
|
- 説明不要
|
|||
|
|
|
|||
|
|
## 🎓 教訓
|
|||
|
|
|
|||
|
|
ChatGPT5ですら効率性の罠に落ちた。これは重要な示唆を含む:
|
|||
|
|
|
|||
|
|
1. **AIは最適化を好む**
|
|||
|
|
- 効率的な解を追求
|
|||
|
|
- パターンの再利用を提案
|
|||
|
|
|
|||
|
|
2. **人間は一貫性を守る**
|
|||
|
|
- 哲学的原則を維持
|
|||
|
|
- 長期的な保守性を重視
|
|||
|
|
|
|||
|
|
3. **両者の協調が鍵**
|
|||
|
|
- AIの効率性+人間の哲学性
|
|||
|
|
- バランスが成功を生む
|
|||
|
|
|
|||
|
|
## 結論
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
すべての箱はbirthで生まれる
|
|||
|
|
例外なし
|
|||
|
|
これがNyashの魂
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
この単純な原則が、26日間の爆速開発を支え、数々の危機を回避し、美しいシステムを作り上げた。
|
|||
|
|
|
|||
|
|
効率性より一貫性。賢さよりシンプルさ。
|
|||
|
|
|
|||
|
|
これがbirthの原則である。
|