UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供する
N's Creates (エヌズクリエイツ) 株式会社 フロントエンドエンジニアの齋藤 (@31mskz10) です。
エンジニア・IT業界には、有名な原理原則や法則がいくつかあります。
先人が何度も経験したことを言語化しているので、そこから学べることは多いはず。
今回は、オブジェクト指向設計で重要となる「SOLID原則」について紹介します。
SOLID原則とは?
SOLID原則とは、プログラマーのロバート・C・マーティン氏が提唱した、保守・運用しやすいソフトウェアを開発するための5つの設計原則をまとめたものです。
それぞれの原則の頭文字をとって「SOLID(ソリッド)」と呼ばれています。
少し難しく聞こえるかもしれませんが、1つ1つは「たしかにそうだよね」と思えるような内容です。
順番に見ていきましょう。
5つの原則
S:単一責任の原則(Single Responsibility Principle)
「1つのクラスが持つべき責任は1つだけ」という原則です。
例えば「ユーザー」を表すクラスがあったとします。このクラスがユーザー情報の管理だけでなく、データベースへの保存処理や、メールの送信処理まで担当していると、責任が多すぎます。
メール送信の仕様が変わっただけで、ユーザー情報のクラスを修正する必要が出てきてしまい、関係ない箇所にバグを生む原因になります。
役割ごとにクラスをきちんと分けることが大切です。
O:オープン・クローズドの原則(Open/Closed Principle)
「クラスは拡張に対しては開いて(Open)いて、修正に対しては閉じて(Closed)いるべき」という原則です。
簡単に言うと「新しい機能を追加するときに、既存の動いているコードはなるべく変更しないようにしよう」ということです。
例えば、料金計算のロジックがあったとして、新しい割引の種類を追加するたびに、元の料金計算クラスを書き換えるのは危険です。
そうではなく、割引ルールの部分だけを簡単に追加・交換できるような仕組みにしておくことで、安全に機能を拡張できます。
L:リスコフの置換原則(Liskov Substitution Principle)
「サブクラス(子クラス)は、そのスーパークラス(親クラス)と置き換え可能でなければならない」という原則です。
これは継承を正しく使うためのルールです。例えば「鳥」クラスを継承して「ペンギン」クラスを作ったとします。もし「鳥」クラスに「飛ぶ」という機能が定義されていると、ペンギンは飛べないので困ってしまいます。
このように、親クラスの代わりに子クラスを使ってもプログラムが問題なく動くように設計することが重要です。
I:インターフェース分離の原則(Interface Segregation Principle)
「クライアントに、利用しないインターフェース(機能の窓口)への依存を強制すべきではない」という原則です。
これは「多機能すぎるインターフェースは良くない」ということです。
例えば、印刷もFAXもスキャンもできる「多機能プリンター」というインターフェースがあったとします。印刷しかしないクラスにこのインターフェースを実装させると、使わないFAXやスキャンの機能にも影響を受けてしまう可能性があります。
「印刷インターフェース」「FAXインターフェース」のように、役割に応じてインターフェースを小さく分けるべき、という考え方です。
D:依存性逆転の原則(Dependency Inversion Principle)
「上位のモジュールは下位のモジュールに依存すべきではない。両方とも抽象に依存すべき」という原則です。
これは少し難しいですが「具体的なもの同士を直接つなげるのではなく、抽象的なもの(インターフェースなど)を間に挟んでつなげよう」ということです。
例えば、パソコン本体とキーボードが直接ハンダ付けされていたら、キーボードが壊れたときに大変です。USBという共通の規格(抽象)があるからこそ、どんなキーボードにも交換できます。
プログラムも同様に、具体的なクラス同士が密接につながるのではなく、抽象的なインターフェースを介して連携することで、柔軟で交換しやすい部品を作ることができます。
まとめ
今回は、オブジェクト指向設計の土台となる「SOLID原則」について紹介しました。
5つすべてを一度に完璧に実践するのは難しいかもしれません。
しかし、これらの原則を知っているだけで、コードの良し悪しを判断する解像度が格段に上がるはずです。
UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供する
N's Creates 株式会社は、神戸三宮オフィスまで週1出社(それ以外はリモートワーク)できる「デザイナー」「エンジニア」を募集しています。
興味のある方は、カジュアル面談しますので気軽にお問い合わせください!









