ISP(The Interface Segregation Principle) – SOLID

ISP(The Interface Segregation Principle)
– クライアントに対して利用しないインタフェースへの依存を強制してはならない。

参考:ここここ

 

・インターフェイスはクライアント(使う側)の都合により変更される

→インターフェイスはそれを使うクライアントごとに分離されるべき

 

 

・インターフェイスが分離されていないと、

クライアントにサーバが依存すべきところが、

サーバにクライアントが依存してしまい、

変更のたびに全体へ影響を与えてしまう。

→依存関係の逆転が成り立たず、脆弱となる。

 

 

・太った(いろんな役割を持つ=便利な)インターフェイスにしない。

→SRP(単一責務の原則)にする

 

・依存をできる限り減らす。

→クラス間の結合度(Coupling)を減らす

 

オブジェクト指向って難しい・・・。

 

 

 

LSP(The Liskov Substitution Principle)- SOLID

LSP(The Liskov Substitution Principle)リスコフの置換原則
– 派生クラスは、その基底クラスと置換可能でなくてはならない。

 

参考:ここ

 

リスコフさんが提唱した、置換原則です。

置換するもの:親クラスと子クラス

この2つが置き換えることができなければならない。

 

よく、子クラスに親クラスをオーバーライドするのですが、

その時、親クラスの意図する動きをしなければならないということ。

 

LSP ありきの ODP

子クラスと親クラスが置き換え可能でないと、

そのクラスに依存するクラスの変更時、

子クラスor親クラスからの来たのかの条件文が必要となり、

変更が大変、浪費がかかる。

=拡張にしにくく、修正が多い

ODP(オープン・クローズドの原則)に反している。

 

 

 

DIP(The Dependency Inversion Principle)依存性反転の原則- SOLID

DIP(The Dependency Inversion Principle)依存性反転の原則

– 抽象に依存すべき。具象クラスに依存してはいけない。

 

HeadFirstデザインパターンの説明が分かりやすかったです。

↑では様々な種類のPizza(NYCheesePizza,NYClamPizza…)を作るPizzaStoreを例に出しています🍕🍕🍕

 

[Before]なにも考えず実装する🙄

PizzaStoreは具象クラスであるNYCheesePizzaやNYClamPizzaに依存しています。

高水準なクラス PizzaStoreから低水準なクラスNYCheesePizzaに依存する形となり、依存の方向は上から下(矢印)になっています。

 

デメリット🙅‍♂️

PizzaStoreは4つの具象クラス依存しており、Pizzaの種類が増えるとさらに依存する具象クラスが増え、コードの修正も必要となってしまいます。

 

 

[After]DIPに沿った実装をする🤔

抽象クラスPizzaを追加しました。

PizzaStoreは抽象クラスPizzaを作成し、抽象クラスPizzaに依存するようになります。

また、具象クラスだったNYCheesePizzaやNYClamPizzaは抽象クラスPizzaを実装するようになり、抽象クラスPizzaに依存するようになりました。

これにより、原則通りにPizzaStoreもNYCheesePizzaやNYClamPizzaもすべて抽象に依存するようになりました!!!

さらに、依存の方向を示す矢印も上から下だったものが「反転」して、下から上への依存となりました💡

 

メリット🙆‍♂️

PizzaStoreは具体的なPizzaの種類を知らなくていい(抽象Pizzaクラスしか知らない)ので、新しい具象Pizzaクラスが作成されても修正は少なくなります。

 

 

まとめ

この原則に従った設計を考える時には、高水準コンポーネントではなく低水準コンポーネントから抽象化できないかを考えていくといい気がしました。

 

また、この原則に従うための指針として

  • 具象クラスへの参照を保持する変数を持たない
  • 具象クラスからクラスを継承しない
  • ベースクラスの実装済みメソッドをオーバーライドしない

というのも大事だなと改めて感じました。

 

\ 改めて、この本おすすめです🍺/

 

OCP(The Open-Closed Principle)- SOLID

OCP(The Open-Closed Principle)オープン・クローズドの原則
– オブジェクトは拡張に対して開いており、修正に対して閉じていなければならない。

参考:こちら

 

この法則ですが、よく聞くし、言いたいこともなんとなくわかるのですが、

どうすれば、この法則に沿ったソースが書けるか、なってるのかがまだわかんないですね。わかったらまた書こう。

 

ー オブジェクト指向の核心をついている

というますが、オブジェクト指向がまだまだなので、「確かにそうだ!」とかまだ言えるレベルではないです、はい。

 

オブジェクト指向の話って、よく「抽象」て言葉が出てくるんですけど、

日本語が苦手なので、ここで覚えます。

「抽象」《名・ス他》

多くの物や事柄や具体的な概念から、それらの範囲の全部に共通な属性を抜き出し、これを一般的な概念としてとらえること。
(ほうほう、なるほど、共通部分を簡潔に捉える的な感じですかね?)

まとめ
・追加/継承する時が楽にできる(開放)
・その時、既存のコードを変更しなくていい、
そのコードが使われる時、使う主体に影響を与えない(閉鎖)

 

⇒使う側にも、使われる側にも影響が少ないもの

SRP(The Single Responsibility Principle)- SOLID

SOLIDとは…
オブジェクト指向設計の五つの原則の頭文字をとったものだそうです。

SRP(The Single Responsibility Principle)
– クラスの責務は単一でなければならない。

OCP(The Open-Closed Principle)
– オブジェクトは拡張に対して開いており、修正に対して閉じていなければならない。

LSP(The Liskov Substitution Principle)
– 派生クラスは、その基底クラスと置換可能でなくてはならない。

ISP(The Interface Segregation Principle)
– クライアントに対して利用しないインタフェースへの依存を強制してはならない。

DIP(The Dependency Inversion Principle)
– 具象化されたものではなく、抽象化されたものに依存するべきである。

 

今回は、
SRP(The Single Responsibility Principle)単一責務の原則
-クラスの責務は単一でなければならない。

について、書きます。

1つのクラスには、1つの責任・役割を持たせる。

その理由としては、
クラスの責任・役割を小さくすることで、読みやすくて、保守性も上がるからだそうです。

コードの変更の必要が発生した時、1つのクラスに複数の役割の関数をもたせていた場合、
依存が大量に発生し、変更箇所が増える。
こんな感じかなっと掴んでいます。この読みが当たっているかはわかりませんが・・・。

設計って大事だなっと、しみじみと思いました。 おわり

参考:
オブジェクト指向の法則集
プログラマが知るべき97のこと