オブジェクト指向について調査した結果まとめ【随時更新】
随時追加・整理します。
※個人的に気に入った説明を自分の言葉で書いているので理解できなかったらすみません。
オブジェクト指向とは?
概念そのものだとか、明確な説明はない、などありますが。
「変更されない箇所を軸に、頻繁に変更されるであろう箇所をクラスに抽出する、プログラミングスタイル」
要は後から仕様変更・機能拡張しやすいようにプログラムするための考え方だと理解します。
継承 is-aとは?
継承の本質は、抽象概念をまとめ上げられるインターフェイス
- 「機能の受け継ぎ」が本質ではない
- クラスの継承とインターフェイスの違いは、継承はスーパークラスから機能を受け継ぐことができるということ
- 継承よりコンポジションが良く使われる
- EX.) new 部品1, new 部品2, new 製品(部品1, 部品2)
ポリモーフィズムとは?
インターフェイス(抽象)に対してプログラムすること
- 具象に対してプログラムしてはいけない(「new」は具象)
- 依存するクラスが増えることは問題ではなく、問題なのは具象に依存してしまうこと
- ファクトリを作るまでもないインスタンス生成は、メインクラスで行うようにする
カプセル化とは?
無駄を省き洗練させてわかりやすいものを作ること
- 継承やポリモーフィズムとはレイヤーが異なる
- クラスに正しい名前をつける(これが一番苦手かも。。。)
- 現実世界をオブジェクト指向のソースに落とし込んでもうまくいかない。
名前の付け方
とりあえず以下だけ守ろうと思います。
- キャメルケース
- クラスは名詞 or 動名詞
- メソッドは動詞を最初に持ってくる
5つの原則(SOLID原則)
単一責任の原則(Single Responsibility Principle)
クラスを変更する理由は、1つ以上存在してはならない(役割=責任=変更する理由)
オープン・クローズドの原則(Open-Closed Principle)
・仕様変更があった場合に、振る舞いを追加することで変更に対処することができる
・振る舞いを追加しても、既存コードは影響を受けない
リスコフの置換原則(Liskov Substitution Principle)
望まれるのは、次のような置換性質である
S型オブジェクトo1各々に対して, T型オブジェクトo2が1つ存在
o2を使って定義されたプログラムpが存在
このとき、o2の代わりにo1を使ってもpの振る舞いが変わらない性質
インタフェース分離の原則(Interface Segregation Principle)
・クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない
・利用していないメソッドに依存してしまうと、そのメソッドが変更されたときに本来無関係であるはずのクライアントまで影響を受けてしまう場合がある
・それぞれのクライアントが実際に利用するメソッドだけに依存するようにする
・関連性を持ったインタフェースはグループ化し、クライアントごとに特化したインタフェースを用意
これによりクライアントは、自分が利用しないメソッドとの依存関係を断ち切ることができる
依存性逆転の原則(Dependency Inversion Principle)
・上位のモジュールは下位のモジュールに依存してはならない、どちらのモジュールも「抽象」に依存すべきである
・「抽象」は実装の詳細に依存してはならない、実装の詳細が「抽象」に依存すべきである
・下位モジュールが宣言したインタフェースに上位モジュールが従う形は、インタフェースの所有権が下位モジュールにある状態といえる
・具体的なクラスに依存せず、 プログラム内の関係は抽象クラスかインタフェースで終わるようにする
具体的なクラスから派生するクラスはだめ
基本クラスで実装されているメソッドは上書きしちゃだめ
抽象化のやり過ぎに注意
・早まった「抽象」をしないことと「抽象」を使うことは同じように大事
という説明がありました。意味・効果のある抽象化を見極めて行いたいと思います。