オブジェクト指向のプログラミング原則

こんにちは、Habr!私の名前はVladislavRodinです。私は現在、OTUSのヘビーデューティアーキテクトコースの責任者であり、ソフトウェアアーキテクチャコースも教えています。



特に「建築とデザインパターン」コースの新しいストリームでのクラスの開始のために、私はもう1人の著者の資料を用意しました。






前書き



古典的なデザインパターンとなると、オブジェクト指向のプログラミング自体を考えざるを得ません。結局のところ、GoFパターンはまさにオブジェクト指向のプログラミングパターンです。機能プログラミングには独自のパターンがあります。



一般に、すべては次のように配置されます。オブジェクト指向のプログラミング自体があります。彼には原則があります。オブジェクト指向プログラミングの原則から、私たちが解析したGRASPパターンは(オプションとして-SOLID原則)続き、そこからGoFパターンが続きます。それらからは、企業パターンなど、いくつかの興味深いことが続きます。



オブジェクト指向のパラダイム



定義には、「オブジェクト指向プログラミングは、基本的な概念がドメインで識別されるオブジェクトの概念であるプログラミングパラダイムである」と記載されています。



したがって、システムは、何らかの方法で相互作用するドメインのオブジェクトのセットとして表されます。各オブジェクトには、ID、状態、動作の3つのコンポーネントがあります。



オブジェクトの状態は、そのすべてのフィールドとその値のコレクションです。



オブジェクトの動作は、オブジェクトのクラスのすべてのメソッドのコレクションです。



オブジェクトIDは、あるクラスオブジェクトを別のクラスオブジェクトから区別するものです。Javaの観点から、equalsメソッドが定義されるのはアイデンティティによるものです。



オブジェクト指向のプログラミング原則



オブジェクト指向のプログラミングには、いくつかの原則があります。それらの数の考え方は異なります。誰かがそれらの3つ(古いプログラマーの学校)があると主張し、誰かがそれらの4つ(新しいプログラマーの学校)があると主張します:



  1. 抽象化
  2. カプセル化
  3. 継承
  4. 多形性


私はそれらについてもっと詳しく話すことを提案します。唯一のことは、私は自分が古いプログラマーの学校にいると思っているので、抽象化を考慮しないことを提案することです。



カプセル化



多くのインタビュイー(場合によってはインタビュイー)の意見に反して、カプセル化は「すべてのフィールドがプライベートである場合」ではありません。カプセル化はソフトウェア設計の最も基本的な原則であり、その痕跡はミクロレベルでのみ観察されますが、マクロ設計レベルでも観察されます。



科学的な定義によると、「カプセル化とは、クラス、および広義にはシステムの一部を「ブラックボックス」と見なす必要があるという原則です。クラスまたはサブシステムのユーザーは、インターフェイス(つまり、宣言されたプロパティとメソッドのリスト)のみを表示する必要があります。 )そして内部実装を掘り下げないでください。」



したがって、クラスAがクラスBのフィールドに直接アクセスする場合、これは「情報セキュリティが侵害されている」という事実ではなく、クラスAがクラスBの内部デバイスに関連付けられているという事実、およびクラスBの内部構造を変更しようとする試みにつながることがわかります。クラスAの変更につながります。さらに、クラスAはクラスBのフィールドで機能するだけでなく、いくつかのビジネスロジックに従って機能します。つまり、クラスBの状態を処理するためのロジックはクラスAにあり、クラスBを再利用する場合、クラスAがないとクラスBは役に立たない可能性があるため、これを行うことはできません。これにより、クラスBを一緒に指定する必要があります。クラスA。これをシステム全体に外挿すると、システム全体のみを再利用できることがわかります。



カプセル化は最も過小評価されている原則であり、残念ながら、それを正しく解釈する人はほとんどいません。これにより、クラスとサブシステム間のリンクの数を最小限に抑え、したがって、クラスとサブシステムの独立した実装と変更を簡素化できます。



継承



継承とは、祖先クラス(スーパークラス)のすべてのプロパティとメソッドを保持しながら、必要に応じて新しいプロパティと

メソッドを追加しながら、あるクラスを別のクラスから派生させる機能です。



継承は最も過大評価されている原則です。「理想的なプログラマーにとって、継承ツリーは無限大になり、完全に空のオブジェクトで終わる」とかつて信じられていました。なぜなら、継承は現実世界のそのようなプロパティを階層として表現する方法であり、方法ではないことを人々がよく理解していなかったからです。両方のアイテムにハンドルがあるため、冷蔵庫からマシンを継承してコードを再利用します。継承は非常に強い関係であるため、可能な限り継承を回避することをお勧めします。継承のレベル数を減らすには、ツリーを「ボトムアップ」で構築することをお勧めします。



多形性



多態性とは、祖先クラスを対象としたコンテキストで子孫クラスを使用する機能です。



最もサディスティックな定義の背後にあるのは、タスクを分解し、ifとswitchをリファクタリングするプログラミング言語の機能です。






All Articles