はじめに
今日はプログラミングの本質について少し考えてみました。
私は、 抽象と具象は、プログラミングに対して最も重要な考え方。 とお思います。
抽象は本質を捉えるための手段であり、具象はそれを具体的に実現するための手段です。
ゲームの例
たとえば、ゲームというのは:
- プレイヤー
- ルール
- データ
で構成されています。
プレイヤー1とプレイヤー2は、ルールに従って戦略を練り、操作を通じてゲーム内のデータを変化させ、場面を進行させていきます。
即ち、すべては次の3要素に還元できます:
主体・行動・状態
🧩主体→変数a
🔧行動→メソッドf
🔄状態→代入’=’
即ち世界は
a=f(a)
(当然これだけじゃないですが、本質の本質がこれと思います)
プログラミングとは、この三つの関係性を設計し、抽象し、具象化していく営みだと私は思います。
抽象と情報量
この話から進みます。今までの話は正しいですが、それ自体には意味がありません。まるで
「人はいずれ死ぬ」
と言うようなものです。そう、抽象化が進めば進むほど情報量はどんどん少なくなっていきます。逆に、具象化は情報量を増やしていきます。
抽象⇄具象の例
具象は、目標を明白する
💻システム機能について
抽象:「このシステムにはログイン機能がある」
具象:「ユーザーはメールアドレスとパスワードでログインできる。さらに二段階認証を設定すれば、ログイン時にスマホアプリへ6桁の確認コードが送られる」
具体化することで、やるべき事と任務を明白にする
🎲カードゲーム開発からの学び
自然に考えれば、カードゲームには プレイヤー、カード、そして ルール が必要です。
- プレイヤーは手札、デッキ、ライフ、これまでに使用したカードといった多くのデータを管理します。
- カードはコスト、体力、カード名、イラスト、効果などのデータを持ちます。
- ルールはカードバトルやゲーム内の各種効果処理など含みます。
その中でも、特に面白いのは カード効果 です。ここで私は 5W2H を用いました。
例として「ダメージを与える効果」を挙げてみます。
- When(いつ):自分のターン中、カードを引いたとき
- Where(どこで):自分の場にあるとき
- Who(誰に):エネミーのモンスタ
- What(何を):ダメージを与える
- Why(なぜ):カードを自分のデッキから手札に加えたから
- How(どのように):ランダムに1体選ぶ
- How many(どのくらい):1ダメージを与える
これを効果文にまとめると:
このカードが自分の場にあるとき、自分のターン中、カードを自分のデッキから手札に加えるたび、ランダムな相手のリーダーか相手のフォロワー1体に1ダメージ。

(リーダー効果のカードなので、“Where”は分かりづらいと思い、表現を変更しました)
抽象は、選択肢を増やす
💰支払い処理を例に考える
例えば、こんな処理があります
「金額を入力して、クレジットカードや銀行振込など、指定された支払い方法で決済する」
→ この段階では「どのように支払うか(カード決済なのか、振込なのか)」がプログラムに深く結びついています。
ここで抽象してみます。
「金額と支払い方法を入力すれば、支払いが実行される」
→ これにより、決済手段を変更したいでも、内部のコードは変更不要になります。
さらに抽象してみます。
「入力は整数の int と、int を受け取って void を返す executeメソッド。」
ここまで抽象すると、もはや「支払い」である必要すらありません。
ただし、適用できる範囲はぐっと広がります。
🎮サバイバル建築ゲーム
具体:「木を切る → 木材を得る → 小屋を建てる」
抽象:「資源 → 建築」
一度抽象すると、こう考えられます:
プレイヤーが自分で集める必要はあるのか?
ゲーム自身が資源を収集・生産する仕組みを作れるのではないか?

🕹️ RPG / アドベンチャー
具体:「モンスターを倒す → 装備がドロップする」
抽象:「挑戦(行動) → 報酬(資源)」
一度抽象すると、こう考えられます:
モンスター討伐に限らず、マップ探索、謎解き、取引、さらには放置でも「資源」を得られる仕組みが考えられる。

最後
これまでのところ、あくまで一個人の開発者としての拙い私見にすぎません。開発経験はまだ十分ではありませんが、少しでも自分の考えを共有したく書きました。どなたかの助けになれば幸いです。