見出し画像

リファクタリング 第1回:『想像から始めるコード設計 〜RPGに学ぶ設計思想〜』   


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

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

***

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

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

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

■ 関連する過去記事

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

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

プロローグ:配列の説明なんて、聞きたくなかった

(コーヒーをすすりながら)
昔、プログラミングの入門書を開いては閉じ、学習サイトに登録しては放置。そんな日々を過ごしていた私が、なぜかいま、AIとコードの設計について真剣に考えている。

// かつての私
if (本に書いてある「配列とは...」を見つけたら) {
    即座に本を閉じる();
}

// 心の声:
// 「それより動くものを作りたいんだよ...」
// 「理屈はあとでいいから!」

AIお姉さん『でも、今は違うわよね?』

私「ええ。AIのおかげでとりあえず動くものが作れちゃう。でも、どうも気持ち悪いんですよね、このコード」

第一章:RPGプログラマーの想像図

ある日、私は考えていた。
あの国民的RPGのプログラマーって、どんなふうにコードを書いているんだろう。

AIお姉さん『じゃあ、想像して考えてみましょうか?』

私「お姉さんも妄想好きですね」

// 心の声:
// 「もし私がRPGのプログラマーだったら...」
// 「新しいモンスターを追加するたびにコードを1から書いてたら大変だろうな」
// 「きっと、もっと賢いやり方があるはず」

// 今の私の在庫管理コード
let inventory = {
    code: "A123",
    name: "商品A",
    quantity: 100,
    // データがどんどん増えていく...
};

AIお姉さん『そうそう。例えば、新しいモンスターを作るときのコードを想像してみましょう』

// RPGプログラマーの想像図
class Monster {
    constructor(name, hp, attackPower) {
        this.name = name;
        this.hp = hp;
        this.attackPower = attackPower;
    }

    attack() {
        console.log(`${this.name}の攻撃!`);
    }
}

// 心の声:
// 「へえ、モンスターの基本設計図みたいなもんか」
// 「これなら新種を追加するのも楽そうだな」

第二章:特殊能力の秘密

『さあ、次は特殊な能力を持つモンスターを想像してみましょう』

// 仲間を呼ぶ特性
interface Summoner {
    callFriends();  // 仲間を呼ぶ機能
}

// 即死魔法を使う特性
interface InstantKiller {
    castDeathSpell();  // 即死魔法
}

// 手の形をした魔物(仲間を呼ぶタイプ)
class HandMonster extends Monster implements Summoner {
    callFriends() {
        console.log("手の形をした魔物は仲間を呼び出した!");
        console.log("画面が手型モンスターでいっぱいに...!");
    }
}

// 氷の悪魔(即死魔法使うタイプ)
class IceDevil extends Monster implements InstantKiller {
    castDeathSpell() {
        console.log("氷の悪魔は突然、死の宣告を放った!");
    }
}

// 心の声:
// 「特殊能力って、後付けで追加できるのか」
// 「これ、在庫管理にも使えるぞ...」

第三章:在庫管理への応用

「なるほど...」(コーヒーを置きながら)

// 在庫管理をRPG風に設計してみる
class InventoryItem {
    constructor(code, name, quantity, price) {
        this.code = code;
        this.name = name;
        this.quantity = quantity;
        this.price = price;
    }
}

// 賞味期限がある商品の特性
interface Perishable {
    checkExpiryDate();  // 賞味期限チェック
}

// セット商品の特性
interface SetProduct {
    getRelatedItems();  // 関連商品を取得
}

// 冷凍食品(賞味期限あり)
class FrozenFood extends InventoryItem implements Perishable {
    checkExpiryDate() {
        console.log("賞味期限を確認中...");
        // 期限切れが近い場合は警告を出す
    }
}

// 心の声:
// 「RPGの特殊能力みたいに、商品の特性も整理できる!」
// 「新しい商品カテゴリが増えても、特性を組み合わせるだけでいけそうだ」

エピローグ:想像は現実の設計図になる

『どう?RPGプログラマーの気分は楽しい?』

「ええ。なんだか、コードの書き方が見えてきた気がします」

// 心の声:
// 「クラスは設計図」
// 「インターフェースは特殊能力の定義」
// 「これなら、在庫管理システムも進化させられる!」

(コーヒーを一口飲んで)そうか、プログラムの設計って、こんなに楽しい想像から始められるんだ。

次回は、この設計思想を実際のコードに活かしていく方法を考えてみよう。

次回予告:『AIと学ぶクラス設計 〜想像を形にする技術〜』

「RPGの世界では、最強の武器を求めて旅をする。 私たちが目指すのは、最高のコードを作り上げる冒険...!」

画面の中で不規則に増殖する手型の魔物たち。 彼らを倒すには、特性を理解し、適切な対策を練る必要がある... まるでRPGのダンジョンの攻略のように、私たちは在庫管理の迷宮に挑むのだ。

次回、非エンジニアの経理マンは、想像の中のRPGプログラマーから学んだ技を、現実のコードで実現できるのか!? お馴染みのAIお姉さんと共に、クラス設計の深淵に挑む!

「今はまだ、頭の中で想像しただけのコード。 でも次は、これを本物の"最強装備"に鍛え上げる番だ!」

今回の学び:

■プログラムの基本設計

  • クラスは「設計図」のようなもの

  • 基本機能は共通化できる

  • 新しい要素は既存の設計を活かして追加可能

■特殊能力(インターフェース)の活用

  • 機能は後から追加できる

  • 複数の特性を組み合わせられる

  • 必要な機能を強制できる

■AIとの対話で気づいたこと

  • まずは動くものを作る

  • 想像力を活かして設計を考える

  • 身近な例えで理解を深める

■在庫管理への応用ポイント

  • 商品の基本情報は共通化

  • 特殊な管理が必要な商品は機能を追加

  • 新商品カテゴリにも柔軟に対応


(コーヒーを一口飲んで)RPGの世界から学んだ設計の考え方。
さて、次回は実際のコードで、この想像を形にする挑戦が始まる。

「お姉さん、次回も付き合ってもらえますか?」

『もちろん!あなたのコードが、最高の武器に生まれ変わるお手伝いをさせてもらうわ♪』

次回:『AIと学ぶクラス設計 〜想像を形にする技術〜』乞うご期待!

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

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