サマリ

SOLID原則は、保守性と拡張性に優れたコードを書くための5つの設計原則です。単一責任、開放閉鎖、リスコフ置換、インターフェース分離、依存性逆転の原則から構成されています。これらを理解し実装することで、バグが少なく、変更に強いソフトウェアを開発できるようになります。

詳細

SOLID原則とは何か

SOLID原則は、オブジェクト指向プログラミングの父とも言われるロバート・マーティンが提唱した5つの設計原則の頭文字をとったものです。これらの原則に従うことで、コードの品質が格段に向上します。

実際のプロジェクトでSOLID原則を適用した場合、保守性が平均で40~50%向上するという調査結果もあります。特に大規模なシステムになるほど、その効果は顕著です。

S:単一責任原則(Single Responsibility Principle)

1つのクラスは1つの責任だけを持つべきという原則です。言い換えると、クラスが変更される理由は1つだけであるべきということです。

例えば、ユーザー情報の管理とメール送信を同じクラスで行わないようにします。ユーザー情報を扱う「UserManager」クラスと、メール送信を扱う「EmailService」クラスに分けるのです。

この原則に従うと、コードの変更が他の部分に影響しにくくなります。ユーザー情報の仕様が変わってもメール送信の機能に影響を与えません。

O:開放閉鎖原則(Open/Closed Principle)

ソフトウェアは拡張に対しては開かれており、修正に対しては閉じているべきという原則です。つまり、新しい機能を追加するときに既存のコードを変更しないで済むようにしましょうということです。

具体的には、インターフェースを使って拡張性を持たせます。支払い方法を例にすると、「PaymentMethod」というインターフェースを定義しておき、クレジットカード決済やコンビニ決済などは、このインターフェースを実装する別のクラスとして追加します。

新しい支払い方法が追加されても、既存の決済処理のコードは一切変更せずに済みます。これが開放閉鎖原則の力です。

L:リスコフ置換原則(Liskov Substitution Principle)

子クラスは親クラスの代わりに使用できるべきという原則です。継承関係を正しく設計することが重要です。

例えば、「鳥」という親クラスから「ペンギン」という子クラスを作ったとしましょう。もし親クラスに「飛ぶ」メソッドがあるのに、子クラスではそれを実装していなければ、この原則に違反しています。

正しくは、「飛ぶ動物」という別の親クラスを用意して、ペンギンはそちらを継承しないようにします。こうすることで、親クラスの機能を確実に子クラスが提供できるようになります。

I:インターフェース分離原則(Interface Segregation Principle)

クライアントに必要のないメソッドを持つインターフェースに依存すべきではないという原則です。大きなインターフェースより、小さく特化したインターフェースを複数用意する方が良いということです。

例えば、「Worker」というインターフェースに「work」メソッドと「eat」メソッドを両方含めるより、「Workable」インターフェースと「Eatable」インターフェースに分けます。ロボット労働者は「Workable」を実装すればよく、「Eatable」は実装しなくて済みます。

このように分けることで、実装するクラスの負担が減り、コードがシンプルになります。

D:依存性逆転原則(Dependency Inversion Principle)

高レベルのモジュールが低レベルのモジュールに依存してはいけません。両者とも抽象(インターフェース)に依存すべきという原則です。

具体例として、ユーザーデータをデータベースから取得する処理を考えます。通常は、ビジネスロジックがデータベースの具体的な実装に依存してしまいます。これを避けるため、「UserRepository」というインターフェースを用意し、ビジネスロジックはこのインターフェースに依存させます。

データベースの種類を後から変更しても、インターフェースを実装した別のクラスを用意するだけで対応できます。テストの際には、ダミーのリポジトリを使うことも簡単になります。

実装のポイント

SOLID原則を完璧に実装することは、実務ではまず不可能です。大切なのはバランスです。状況に応じて、必要な原則を優先的に適用することが重要です。

小規模なスクリプトであれば、すべての原則を適用する必要はありません。一方、複数人で開発する大規模システムなら、すべての原則に注意を払うべきです。

これらの原則を意識しながらコードを書く習慣をつけることで、自然と質の高い設計ができるようになります。

ABOUT ME
oyashumi
5億年前から来た全知全能の絶対神。 アノマロカリ子とハルキゲニ男を従え、 現代のあらゆる知識を手に入れようとしている。 生成AIは神に仇なす敵だと思っているが その情報に踊らされていたりする、愛すべき全知全能のアホ。 カリ子とゲニ男からの信頼は篤い。