Files
hakorune/docs/説明書/reference/box-design/delegation-system.md
Moe Charm e0f0a658e6 docs: Phase 9.75 Box設計根本革命 - SocketBox Arc<Mutex>責務一元化
 Phase 9.75実装計画追加:
- copilot_issues.txtにPhase 9.75追加(Phase 9.7と9.8の間)
- Arc<Mutex>二重化問題の根本解決計画
- 段階的実装戦略(Phase A-D)定義

📚 Box設計ドキュメント完全体系化:
- docs/説明書/reference/box-design/ 新設
- everything-is-box.md: 核心哲学の完全解説
- memory-management.md: Arc<Mutex>設計・fini/weak参照
- delegation-system.md: 完全明示デリゲーション仕様
- box-types-catalog.md: 全Box型の完全カタログ
- ffi-abi-specification.md: FFI/ABI仕様(移動済み)

🔧 実装ノート完備:
- current-issues.md: 現在進行中の設計課題
- socket-box-problem.md: Arc<Mutex>二重化問題詳細分析
- phase-9-75-redesign.md: 実装計画詳細

👥 Copilot実装ガイド作成:
- phase9_75_socketbox_arc_mutex_redesign.md
- SocketBox優先対応の具体的実装手順
- 完全テストスイート設計
- 段階的実装戦略(Step 1-5)

📋 CURRENT_TASK.md更新:
- Box設計ドキュメント完成記録
- Phase 9.75準備完了状況

🎯 効果:
- Everything is Box哲学の体系的文書化
- SocketBox問題解決の明確な道筋
- Copilot協調実装の準備完了
- 新規開発者オンボーディング改善

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-15 07:47:09 +09:00

7.1 KiB
Raw Blame History

🔄 Nyash デリゲーションシステム

📋 概要

Nyashは継承の代わりに「完全明示デリゲーション」を採用しています。 これは「Everything is Box」哲学に基づく、より安全で明確な設計アプローチです。

🎯 なぜデリゲーションか

継承の問題点

  1. 暗黙的な結合: 親クラスの変更が子クラスに予期せぬ影響
  2. 多重継承の複雑性: ダイヤモンド問題
  3. 実装の隠蔽: 何がどこから来ているか不明確

デリゲーションの利点

  1. 明示的: すべての委譲が明確に記述される
  2. 柔軟: 複数のBoxから選択的に機能を組み合わせ
  3. 安全: 予期せぬ副作用を防ぐ

🏗️ 基本構文

from構文によるデリゲーション宣言

// ParentBoxにデリゲート
box Child from Parent {
    init { childField }
    
    // 親のコンストラクタを呼ぶ
    pack(name, age, childData) {
        from Parent.pack(name, age)
        me.childField = childData
    }
}

override必須

box Child from Parent {
    // ❌ エラー: overrideキーワードが必要
    toString() {
        return "Child"
    }
    
    // ✅ 正しい: 明示的override
    override toString() {
        return "Child: " + from Parent.toString()
    }
}

📖 デリゲーションパターン

1. 基本的なデリゲーション

box Animal {
    init { name, species }
    
    pack(animalName, animalSpecies) {
        me.name = animalName
        me.species = animalSpecies
    }
    
    speak() {
        return me.name + " makes a sound"
    }
    
    toString() {
        return me.species + " named " + me.name
    }
}

box Dog from Animal {
    init { breed }
    
    pack(dogName, dogBreed) {
        from Animal.pack(dogName, "Dog")
        me.breed = dogBreed
    }
    
    override speak() {
        return me.name + " barks!"
    }
    
    // toStringは親のものをそのまま使用
}

2. 選択的メソッドオーバーライド

box EnhancedDog from Dog {
    init { tricks }
    
    pack(name, breed) {
        from Dog.pack(name, breed)
        me.tricks = new ArrayBox()
    }
    
    // speakは親のまま使用
    
    // toStringだけオーバーライド
    override toString() {
        local base = from Animal.toString()  // 祖父母から直接
        return base + " (Enhanced)"
    }
    
    // 新しいメソッド追加
    addTrick(trick) {
        me.tricks.push(trick)
    }
}

3. 複数Box組み合わせ予定機能

// 将来的な複数デリゲーション構想
box MultiChild from ParentA, ParentB {
    pack() {
        from ParentA.pack()
        from ParentB.pack()
    }
    
    methodA() {
        return from ParentA.method()
    }
    
    methodB() {
        return from ParentB.method()
    }
}

🎁 pack構文 - Box哲学の具現化

packの優先順位

box User {
    init { name, email }
    
    // 優先度1: pack推奨
    pack(userName, userEmail) {
        me.name = userName
        me.email = userEmail
    }
    
    // 優先度2: initpackがない場合
    init(name, email) {
        me.name = name
        me.email = email
    }
    
    // 優先度3: Box名互換性のため
    User(name, email) {
        me.name = name
        me.email = email
    }
}

// packが優先的に使用される
local user = new User("Alice", "alice@example.com")

packとデリゲーション

box Product {
    init { name, price }
    
    pack(productName, productPrice) {
        me.name = productName
        me.price = productPrice
    }
}

box DiscountedProduct from Product {
    init { discount }
    
    pack(name, originalPrice, discountPercent) {
        local discountedPrice = originalPrice * (1 - discountPercent / 100)
        from Product.pack(name, discountedPrice)
        me.discount = discountPercent
    }
    
    originalPrice() {
        return me.price / (1 - me.discount / 100)
    }
}

🔍 from構文の詳細

メソッド内でのfrom使用

box Child from Parent {
    override process(data) {
        // 前処理
        local prepared = me.prepare(data)
        
        // 親の処理を呼ぶ
        local result = from Parent.process(prepared)
        
        // 後処理
        return me.postProcess(result)
    }
}

条件付きデリゲーション

box SmartChild from Parent {
    override calculate(value) {
        if value > 100 {
            // 大きな値は親に任せる
            return from Parent.calculate(value)
        } else {
            // 小さな値は自分で処理
            return value * 2
        }
    }
}

ベストプラクティス

1. 明示的なoverride

// ✅ 良い: 意図が明確
override toString() {
    return "Custom: " + from Parent.toString()
}

// ❌ 悪い: overrideなしはエラー
toString() {
    return "Custom"
}

2. 適切なデリゲーション粒度

// ✅ 良い: 必要な部分だけオーバーライド
box CustomList from ArrayBox {
    override push(item) {
        console.log("Adding: " + item)
        from ArrayBox.push(item)
    }
    // 他のメソッドはそのまま使用
}

// ❌ 悪い: すべてをオーバーライド
box BadList from ArrayBox {
    override push(item) { /* ... */ }
    override pop() { /* ... */ }
    override get(i) { /* ... */ }
    override set(i, v) { /* ... */ }
    // すべて再実装は無駄
}

3. デリゲーションチェーンの管理

// ✅ 良い: 明確な責任分離
box A {
    process() { return "A" }
}

box B from A {
    override process() {
        return from A.process() + "->B"
    }
}

box C from B {
    override process() {
        return from B.process() + "->C"
    }
}

// 結果: "A->B->C"

🚨 注意点

1. 循環デリゲーション禁止

// ❌ エラー: 循環デリゲーション
box A from B { }
box B from A { }  // コンパイルエラー

2. 多段デリゲーション制限

// 現在の制限
box A { }
box B from A { }
box C from B {
    method() {
        // ❌ エラー: CはAにデリゲートしていない
        from A.method()
        
        // ✅ OK: 直接の親
        from B.method()
    }
}

3. 動的デリゲーション不可

// ❌ エラー: デリゲーション先は静的に決定
box Dynamic from (condition ? A : B) { }

🔮 将来の拡張構想

1. 複数デリゲーション

box Multi from Network, Storage {
    save(data) {
        from Storage.save(data)
        from Network.sync(data)
    }
}

2. 条件付きデリゲーション

box Smart from Parent when Parent.version >= 2.0 {
    // バージョン対応
}

3. デリゲーションプロキシ

box Proxy delegates * to target {
    // すべてのメソッドを自動委譲
}

関連ドキュメント: