現役車載組込みソフトエンジニアの青葉です。
今回はSOLID原則のインターフェース分離の原則について例を交えてまとめていきます。
SOLID原則
- S:単一責任の原則(SRP:Single Responsibility Principle)
- O:オープン・クローズドの原則(OCP:Open-Closed Principle)
- L:リスコフの置換原則(LSP:Liskov Substitution Principle)
- I:インターフェース分離の原則(ISP:Interface Segregation Principle)
- D:依存関係逆転の原則(DIP:Dependency Inversion Principle)
インターフェース分離の原則
ソフトウェアを設計する際には、実際に使っていないものへの依存は回避するべき
という原則です。
ものすごく当たり前なことを言っているようで、実践すると意外に難しいのがこの原則のいやらしいところですね。この原則を読み解くためには、まず原則で述べられている「依存」について理解する必要があります。そのあたりを含めて、次の例を用いて解説します。
原則違反の例
「身長・体重出力機能」を呼び出すことで計算結果を得る「BMIを算出する機能」と「平均身長比較機能(平均身長より高いか低いか判定)」があります。
BMI算出機能は、身長・体重出力機能から得られる身長と体重の両方を取得して動作します。BMI算出機能は、身長・体重出力機能に依存しており、身長データも体重データも使っています。平均身長比較機能は、身長・体重出力機能に依存しているものの利用する情報は身長のみで、体重のデータは利用しません。
この状態だと平均身長比較機能は利用しないはずの体重データにも依存しており、インターフェース分離の原則に反しています。
さてこの場合何が問題になるでしょうか。
例えば体重に関する処理を変更するために身長・体重出力機能をアップデートしたとします。すると、BMI算出機能と平均身長比較機能の両方に対して、影響の評価や再テストの必要性が出てきます。BMI算出機能はともかく、平均身長比較機能は体重の情報を使っていないのに、影響を受けて検討を強いられてしまいます。
原則違反を解消した例
では、次のような設計であればいかがでしょうか。
「身長・体重出力機能」を「身長出力機能」と「体重出力機能」に分割て同じ機能構成を実現したとします。「BMI算出機能」は両方を使い、「平均身長比較機能」は「身長出力機能」だけを使うことができます。
この構成であれば、先ほどのような体重出力機能のアップデートの影響を受けるのは、実際にそのデータを利用しているBMI算出機能のみとなり、平均身長比較機能は影響を受けません。
身長・体重出力機能を身長と体重で2つの機能に分けることでインターフェース分離の原則を守ったように、実はこの原則を守ると結果的にソフトウェア部品を細かく分割するような対応が必要になることが多いです。
まとめ
今回はインターフェース分離の原則について簡単な例を使ってまとめてみました。インターフェース分離の原則を守るとソフトウェア部品を細分化していく方向に向かうことでしょう。
コメント