見出し画像

リファクタリング 第2回:『妄想を形にするクラス設計 〜RPGの世界から実装へ〜』

連載企画:AIと学ぶコードの進化論(全3回)

第1回:『想像から始めるコード設計 〜RPGに学ぶ設計思想〜』
第2回:『妄想を形にするクラス設計 〜RPGの世界から実装へ〜』
第3回:『想像を実現するリファクタリング 〜RPGの世界から現実へ〜』

***

「生成AIを使ってGASで在庫管理ツールを作ったはいいものの...」

動くコードは書けるようになった。でも、それって本当に"良い"コードなのか? 非エンジニアの私が、生成AIと二人三脚で作ったコードを、さらに良いものに進化させる物語。

RPGの世界を想像しながら、オブジェクト指向を学び、実践するまでの3部作。 コードの改善って、案外RPGの世界に似ているかもしれない...。

■ 関連する過去記事

  • 在庫会議資料を1クリックで作成!経理マン奮闘記

  • このツールを題材に、コード改善の旅が始まる

プロローグ:コードの中のダンジョン

(コーヒーをすすりながら)前回、RPGのプログラムを想像して、クラスやインターフェースの考え方を学んだ。
でも、実際のコードはもっと複雑だ。まるで、誰かが作った古いダンジョンの中を探検しているような...

// 今の在庫管理コード
function processInventory() {
    // 大量の処理が詰め込まれている
    loadData();
    calculatePrices();
    updateStatus();
    checkExpiry();
    // ...延々と続く

    // 心の声:
    // 「このダンジョン、どこまで続くんだ...」
    // 「罠もあるし、分かれ道も多いし...」
}

AIお姉さん『あら、迷子になりそう?』

私「ええ...どこから手をつければいいか」

第一章:モンスター図鑑を作るように

AIお姉さん『じゃあ、前回の想像を実際のコードに活かしていきましょう。
まずは、在庫データの「図鑑」を作るところから始めましょうか』

// 在庫アイテムの基本クラス
class InventoryItem {
    constructor(code, name, quantity, price) {
        this.code = code;
        this.name = name;
        this.quantity = quantity;
        this.price = price;
    }

    // 基本的な操作を定義
    updateQuantity(delta) {
        this.quantity += delta;
    }

    calculateValue() {
        return this.quantity * this.price;
    }
}

// 心の声:
// 「へえ、モンスターの基本データみたいに」
// 「在庫データも整理できるんだ」

第二章:特殊能力の実装

私「基本クラスはできました。でも、商品にはいろんな特殊な管理が必要ですよね」

AIお姉さん『そう、モンスターに特殊能力があるように、商品にも特別な管理が必要ね』

// 温度管理が必要な商品の特性
interface TemperatureControlled {
    checkTemperature(): void;
    getStorageRequirements(): string;
}

// セット商品の特性
interface SetProduct {
    getRelatedItems(): string[];
    calculateSetPrice(): number;
}

// 冷凍食品クラス
class FrozenFood extends InventoryItem implements TemperatureControlled {
    private temperature: number;

    checkTemperature() {
        if (this.temperature > -18) {
            console.log("警告:温度が高すぎます!");
        }
    }

    getStorageRequirements() {
        return "-18℃以下で保管";
    }
}

// 心の声:
// 「特殊な管理項目を、能力として追加していくのか」
// 「これなら、新商品が増えても対応できそうだ」

第三章:ダンジョンの構造改革

AIお姉さん『さあ、次は複雑なコードの整理よ。
ダンジョンだって、きっとちゃんと区画整理されているはず』

// 在庫管理の責任を分割する
class InventoryLoader {
    // データ読み込みの責任
    loadFromSystem() { ... }
}

class InventoryCalculator {
    // 計算処理の責任
    calculateTotalValue() { ... }
    checkProfitMargin() { ... }
}

class InventoryMonitor {
    // 状態監視の責任
    checkTemperatures() { ... }
    monitorExpiryDates() { ... }
}

// 心の声:
// 「なるほど、一つのクラスに一つの責任」
// 「RPGでいえば、剣士は攻撃、僧侶は回復、みたいな」

エピローグ:コードの迷宮を抜けて

変更前:

// 迷宮のような昔のコード
function doEverything() {
    // 全部ごちゃ混ぜ
}

変更後:

// 整理された新しいコード
class InventoryManager {
    private loader: InventoryLoader;
    private calculator: InventoryCalculator;
    private monitor: InventoryMonitor;

    processInventory() {
        // 各クラスが自分の責任を果たす
        this.loader.loadFromSystem();
        this.calculator.calculateTotalValue();
        this.monitor.checkStatus();
    }
}

// 心の声:
// 「迷宮が、明るく整理された倉庫に変わった」
// 「これなら道に迷う心配もない」

AIお姉さん『どう?コードの迷宮、少しは明るくなってきた?』

私「ええ。RPGの世界から学んだ設計が、現実のコードでも活きてきましたね」

(コーヒーを一口飲んで)しかし、まだ終わりじゃない。
次は、この設計を活かして、具体的な機能を実装していく番だ。

次回予告:『AIと実践するリファクタリング 〜伝説の在庫管理システム誕生へ〜』

画面の向こうで、赤く光るワーニング。 「賞味期限切れまであと3日...」 「在庫回転率の低下を検知...」 「類似商品の価格変動を確認...」

時を同じくして、基幹システムから新たなデータが送られてくる。 うごめく在庫データの波に、私たちはどう立ち向かうのか。

AIお姉さん『準備はいい?いよいよ最後の戦いよ』

私「ええ、RPGから学んだ技術を、すべて注ぎ込みます」

かつて想像の中で描いた最強の設計図。 それを現実のコードへと昇華させる時が来た。

経理マンとAIお姉さんの最後の挑戦。 果たして伝説の在庫管理システムは誕生するのか!?

次回、『AIと実践するリファクタリング』。 全ての在庫を適切に管理するため、私たちの戦いは続く...。

乞うご期待!

(あ、コーヒーがなくなった...次回分、買っておかないと)

■ 今回の技術的な学び

  • 基本クラスで共通機能を定義

  • インターフェースで特殊機能を追加

  • 責任ごとにクラスを分割

  • 複雑な処理を整理して見通しを改善

■ RPGから学んだ設計のコツ

  • 基本能力は共通化(モンスターの基本ステータス)

  • 特殊能力は後付け可能(属性や特技)

  • 役割は明確に分ける(職業による得意分野)

  • 拡張性を考慮(新モンスターの追加)

■ 実践的なヒント

  • まずは基本クラスを作る

  • 特殊な機能はインターフェースで追加

  • 大きな機能は責任ごとに分割

  • コードの見通しを常に意識する

#技術ブログ
#コード設計
#オブジェクト指向
#プログラミング学習
#RPGで学ぶ
#ChatGPT
#非エンジニアのコード作成

いいなと思ったら応援しよう!