![見出し画像](https://assets.st-note.com/production/uploads/images/172093253/rectangle_large_type_2_760d0828773ef5e6f16ffbe990125023.png?width=1200)
リファクタリング 第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 #非エンジニアのコード作成