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