クラス設計における適切な責務の分離と単一責任の原則

Android開発

プログラム設計において、責務の分離や単一責任の原則(SRP)を守ることは非常に重要です。この原則を守ることで、保守性や拡張性が向上し、コードのテストもしやすくなります。この記事では、クラス設計における責務の分離とその改善方法について、具体的なコード例を交えて解説します。

責務の分離とは?

責務の分離(Separation of Concerns)は、各クラスやモジュールがそれぞれの関心事に集中し、他の処理を干渉しないように設計することです。これにより、コードの可読性や再利用性が向上し、保守が容易になります。

例えば、画面表示に関わる処理とビジネスロジックは分けるべきです。前述のコード例では、BattleViewが表示に集中し、戦闘に関するロジックはRelationshipServiceに委譲されています。これにより、表示に関するコードは変更があっても戦闘ロジックには影響を与えません。

単一責任の原則(SRP)とは?

単一責任の原則(Single Responsibility Principle)は、クラスやモジュールが一つの責務だけを持ち、複数の責務を持たないようにする原則です。この原則を守ることで、クラスの設計が簡単になり、変更に強いコードを書くことができます。

例えば、OrderServiceでは、割引計算と履歴管理の責務をそれぞれDiscountCalculatorとBrowsingHistoryRepositoryに分けています。このように、OrderServiceは「注文処理」に集中し、他の処理が変更されても影響を受けにくくなります。

改善されたコードのポイント

最初のコードでは、BattleViewクラスが戦闘のロジックと表示の両方を担当していましたが、修正後はBattleViewが表示専用となり、戦闘ロジックはRelationshipServiceに委譲されました。この変更により、表示の変更があっても戦闘ロジックに影響を与えることがなく、保守がしやすくなります。

同様に、OrderServiceクラスでは割引計算と履歴管理を外部クラスに分けることで、注文処理に集中できるようになり、コードの変更やテストが簡単になりました。

実際のコードで学ぶ責務の分離

以下に、責務の分離を実現するための簡単なコード例を示します。

class BattleView:
 def __init__(self, member1, member2):
 self.member1 = member1
 self.member2 = member2

 def start_attack_animation(self):
 print(f'{self.member1.name} が {self.member2.name} に攻撃!')

class RelationshipService:
 def __init__(self, positive_feelings):
 self.positive_feelings = positive_feelings

 def increase_feelings(self, subject_id, target_id):
 self.positive_feelings.increase(subject_id, target_id)

このコードでは、BattleViewは画面表示だけを担当し、戦闘ロジックはRelationshipServiceが担当しています。このように、関心事を分けることでコードの可読性と保守性が向上します。

まとめ

責務の分離と単一責任の原則(SRP)は、プログラム設計において非常に重要な原則です。これらの原則を守ることで、コードがシンプルで理解しやすくなり、変更が容易になります。今回紹介したように、クラスの責務を適切に分け、関心事を分離することで、より堅牢で拡張性のあるコードを書くことができます。

コメント

タイトルとURLをコピーしました