結論から言うと、メソッドには「そのオブジェクト自身の状態を使う処理」を置くと、クラスの役割が整理しやすくなります。
クラスを書けるようになってくると、次に迷いやすいのが「どこまでをメソッドにするべきか」です。
クラスの中に何でも入れてしまうと役割が広がりすぎますし、逆に外へ出しすぎるとデータと処理がばらけます。
この記事では、メソッドを設計するときの基本を、動くコードと一緒に整理します。
この記事でわかること
完成コード
完成コードは次の通りです。
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 自身の属性を使っています。
毎回 price と quantity を外から渡すより、メソッドとして持たせたほうが自然に読めます。
こうした「そのオブジェクトが持つ値をもとに計算する処理」は、メソッドにすると役割がまとまりやすいです。
データと計算の距離が近くなるため、あとから読んでも追いやすくなります。
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.name や self.quantity を使っているため、オブジェクトに密接に関係しています。
一方で、たとえば画面全体のレイアウトを決める処理や、別の商品の一覧までまとめて並べる処理は、このクラスの責務ではないことが多いです。
メソッドを設計するときは、「このオブジェクト自身の仕事か」を見ると判断しやすくなります。
実務で使うときのポイント
実務では、メソッドを作るときに「その処理はこのオブジェクトの属性を前提にしているか」を確認すると整理しやすいです。
- 属性を使った計算や状態更新は、メソッドにすると見通しがよくなります
- そのオブジェクトと関係の薄い処理まで入れると、クラスの責務が広がりやすいです
- 似たメソッドが増えてきたら、役割が重複していないか見直すと保守しやすくなります
- 呼び出し側で自然に読めるかを確認すると、設計の不自然さに気づきやすいです
たとえば業務ツールでは、注文、顧客、設定のように対象ごとにクラスを分けることがあります。
そのとき、それぞれの対象に関係する処理だけをメソッドに集めると、機能追加しても崩れにくい構成になります。