クラス④:実践!オブジェクト指向でミニアプリを設計する【学んだ知識の総まとめ】

学び・スキルアップ

ここまでで、クラスの基礎から継承・多態性まで学びました。
今回はその知識を使って、実践的な小さなアプリを作ってみましょう。


🎯 今回作るアプリ

「シンプルな家計簿アプリ」をオブジェクト指向で設計します。

  • Transaction(取引)クラス:1件の収入や支出を表す
  • Ledger(帳簿)クラス:複数の取引を管理する
  • クラス同士の関係・再利用性を体感できるように構成します。

🧱 Step 1. 取引クラス(Transaction)を作る

まずは1件の収入・支出データを扱うクラスです。

class Transaction:
    def __init__(self, date, category, amount):
        self.date = date
        self.category = category
        self.amount = amount  # 正の数なら収入、負の数なら支出

    def __str__(self):
        type_str = "収入" if self.amount > 0 else "支出"
        return f"[{self.date}] {self.category} : {type_str} {abs(self.amount)}円"

動作確認

t1 = Transaction("2025-10-01", "給料", 300000)
t2 = Transaction("2025-10-02", "食費", -2500)

print(t1)
print(t2)

出力:

[2025-10-01] 給料 : 収入 300000円
[2025-10-02] 食費 : 支出 2500円

💡 __str__() を定義すると、print()時に見やすい文字列で出力できます。


📘 Step 2. 帳簿クラス(Ledger)を作る

次に、取引をまとめて管理するクラスを作ります。

class Ledger:
    def __init__(self):
        self.transactions = []

    def add_transaction(self, transaction):
        self.transactions.append(transaction)

    def show_all(self):
        for t in self.transactions:
            print(t)

    def total_balance(self):
        total = sum(t.amount for t in self.transactions)
        return total

実行例

ledger = Ledger()

ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))
ledger.add_transaction(Transaction("2025-10-03", "交通費", -1200))

ledger.show_all()
print("現在の残高:", ledger.total_balance(), "円")

出力:

[2025-10-01] 給料 : 収入 300000円
[2025-10-02] 食費 : 支出 2500円
[2025-10-03] 交通費 : 支出 1200円
現在の残高: 296300 円

💡 sum() でリスト内包表記を使えば、クラスの中でも簡潔に合計が取れます。


🧩 Step 3. 継承を使って「カテゴリー別管理」を追加

次に、継承を利用してより特化した家計簿を作ります。

class CategoryLedger(Ledger):
    def show_by_category(self, category):
        print(f"▼ {category} の取引一覧 ▼")
        for t in self.transactions:
            if t.category == category:
                print(t)

実行例

ledger = CategoryLedger()

ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))
ledger.add_transaction(Transaction("2025-10-03", "交通費", -1200))
ledger.add_transaction(Transaction("2025-10-04", "食費", -1800))

ledger.show_by_category("食費")

出力:

▼ 食費 の取引一覧 ▼
[2025-10-02] 食費 : 支出 2500円
[2025-10-04] 食費 : 支出 1800円

💡 Ledger を継承して show_by_category() を追加。
再利用性が高く、保守も簡単です。


⚙️ Step 4. ポリモーフィズムで「CSV出力対応」クラスを追加

家計簿をファイル出力するクラスを、
Ledger の仕組みを活かして作ってみましょう。

import csv

class CsvLedger(Ledger):
    def export_csv(self, filename):
        with open(filename, "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow(["日付", "カテゴリ", "金額"])
            for t in self.transactions:
                writer.writerow([t.date, t.category, t.amount])
        print(f"{filename} に出力しました。")

実行例

ledger = CsvLedger()
ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))

ledger.export_csv("ledger.csv")

出力:

ledger.csv に出力しました。

💡 CsvLedgerLedger を継承しつつ、
独自のメソッド export_csv() を追加しています。
これもポリモーフィズムの一種です。


🧠 学んだことまとめ

概念内容
クラスの活用データ(属性)と動作(メソッド)を一体化して管理できる
継承の再利用性基本機能を受け継ぎながら新機能を追加できる
ポリモーフィズム同じインターフェースで異なる動作を実現できる
オブジェクト指向の設計力小規模アプリでも整理された構造を作れる

🎯 まとめ

  • ✅ クラスを使うことで、現実の「モノや仕組み」を自然にコード化できる
  • ✅ 継承を使うことで、重複せず拡張できる
  • ✅ ポリモーフィズムで柔軟な拡張が可能
  • ✅ 実践アプリ(家計簿)で、全体の流れを体感できた!

コメント