結論から言うと、メソッドには「そのオブジェクト自身の状態を使う処理」を置くと、クラスの役割が整理しやすくなります。

クラスを書けるようになってくると、次に迷いやすいのが「どこまでをメソッドにするべきか」です。
クラスの中に何でも入れてしまうと役割が広がりすぎますし、逆に外へ出しすぎるとデータと処理がばらけます。
この記事では、メソッドを設計するときの基本を、動くコードと一緒に整理します。

この記事でわかること

  • メソッドに向いている処理の考え方
  • 属性を使う処理をクラスに置くと整理しやすい理由
  • 実務でメソッドを増やしすぎないための見方

完成コード

完成コードは次の通りです。

class CartItem:
    def __init__(self, name, price, quantity):
        self.name = name
        self.price = price
        self.quantity = quantity

    def calculate_total(self):
        return self.price * self.quantity

    def increase_quantity(self, amount):
        self.quantity += amount

    def build_label(self):
        total = self.calculate_total()
        return f"{self.name} x {self.quantity} = {total}円"


item = CartItem("ワイヤレスマウス", 3500, 2)
print(item.build_label())

item.increase_quantity(1)
print(item.build_label())

コードのポイント

このコードでは、商品1件に関係する処理だけを CartItem のメソッドにまとめています。

  • calculate_total() は属性を使って合計金額を求めます
  • increase_quantity() は数量という状態を更新します
  • build_label() は属性を使って表示用の文字列を作ります

どのメソッドも name price quantity といった属性を前提にしているため、クラスの中に置く意味がはっきりしています。

コードを順番に説明します

主要な処理を分けて説明します。

1. 属性を使って結果を作る処理はメソッドに向いています

    def calculate_total(self):
        return self.price * self.quantity

この処理は、価格と数量という CartItem 自身の属性を使っています。
毎回 pricequantity を外から渡すより、メソッドとして持たせたほうが自然に読めます。

こうした「そのオブジェクトが持つ値をもとに計算する処理」は、メソッドにすると役割がまとまりやすいです。
データと計算の距離が近くなるため、あとから読んでも追いやすくなります。

2. 状態を変える処理もメソッドにまとめると管理しやすくなります

    def increase_quantity(self, amount):
        self.quantity += amount

数量を増やす処理は、CartItem の状態を更新する操作です。
そのため、外側に increase_item_quantity(item, amount) のような関数を置くより、メソッドにしたほうがまとまりがよくなります。

状態変更の処理がクラスの中にあると、どこで値が変わるかを追いやすくなります。
特に実務では、更新ルールが増えてきたときに管理しやすさの差が出ます。

3. オブジェクトと関係が薄い処理まで無理にメソッドにしないことも大切です

    def build_label(self):
        total = self.calculate_total()
        return f"{self.name} x {self.quantity} = {total}円"

このメソッドは、商品の表示文を作る処理です。
self.nameself.quantity を使っているため、オブジェクトに密接に関係しています。

一方で、たとえば画面全体のレイアウトを決める処理や、別の商品の一覧までまとめて並べる処理は、このクラスの責務ではないことが多いです。
メソッドを設計するときは、「このオブジェクト自身の仕事か」を見ると判断しやすくなります。

実務で使うときのポイント

実務では、メソッドを作るときに「その処理はこのオブジェクトの属性を前提にしているか」を確認すると整理しやすいです。

  • 属性を使った計算や状態更新は、メソッドにすると見通しがよくなります
  • そのオブジェクトと関係の薄い処理まで入れると、クラスの責務が広がりやすいです
  • 似たメソッドが増えてきたら、役割が重複していないか見直すと保守しやすくなります
  • 呼び出し側で自然に読めるかを確認すると、設計の不自然さに気づきやすいです

たとえば業務ツールでは、注文、顧客、設定のように対象ごとにクラスを分けることがあります。
そのとき、それぞれの対象に関係する処理だけをメソッドに集めると、機能追加しても崩れにくい構成になります。

よくある勘違い・注意点

  • クラスに書けば何でもメソッドにしてよいわけではありません
  • 属性をまったく使わない処理は、外の関数にしたほうが自然なことがあります
  • 1つのメソッドに複数の役割を詰め込むと、名前も処理もわかりにくくなります
  • メソッドの数を増やすことより、責務を揃えることのほうが大切です

まとめ

  • メソッドには、そのオブジェクト自身の状態を使う処理を置くと整理しやすいです
  • 属性を使った計算や状態更新は、メソッドに向いています
  • 関係の薄い処理までクラスへ入れすぎると、責務が広がります
  • 実務では、「この処理はこのオブジェクトの仕事か」で判断すると設計しやすいです