プログラミングとは
プログラミングについてどうやって知りましたか?
-パスカルでプログラムを教える学校の9年生から11年生まで。
私のプログラムは何で構成されていましたか?
-手続きと機能、それらに対するデータとアクション。
何が好きではなかったのですか?
-大規模なプログラムを作成しようとしたとき、私は非常に長い間ミスに苦しんでいました...そして、それ以上に...私はすべてがどのように機能するかに関する膨大な情報を覚えておく必要がありました。 誰が誰に、どこに電話をかけます。
どのように複雑さに対処しましたか?
-セマンティックな目的に応じて機能を組み合わせた独立したモジュールを強調しました。 マウスを操作するため、グラフィックスを操作するため、BMPを操作するために別々に機能するなど、個別に機能します。
OOPとは何ですか?
OOPをどのように知りましたか?
-研究所での最初の年。
彼らはOOPについて正確に何を教えてくれましたか?
-覚えにくいです。 クラス、継承、 private 、 public 、 staticを覚えています 。
取得した知識をどのように使用しましたか?
「まあ、実世界のオブジェクトの反映としてクラスを作成しました。」 特定のクラスの機能を拡張するために継承されます。
OOPはどのように私を助けてくれましたか?プログラムを書くのが簡単になりましたか?
-最初は便利でした。 古いクラスを再利用することは可能でした。 時々、要件が変更された場合-私は継承され、必要に応じて相続人の行動を変更しました。
SOLIDの原則は何ですか?
クラスインターフェイスとは何ですか。なぜそれを明示的に記述するのですか?
一般/特定と部分/全体の関係は何ですか?
前の2つの質問に肯定的な回答をした場合は、読むことができなくなります。 さらに記事では、インターフェイスについて説明し、SOLIDの原理を簡単に説明し、オブジェクト指向プログラムのオブジェクト間の2つの主要な関係を示します。
インターフェイスとは何ですか?
Fooクラスのコードを見てみましょう。
class Foo { int a; static int b; public: Foo() { a = 0; } ~Foo() { a = 0; } int a() { return a; } static int b() { return b; } int sum1() { return a+b; } int sum2() { return a()+b(); } };
いくつかの種類の情報が表示されます。
1.クラス情報
-クラスフィールド:b
-クラスメソッド:b()
2.クラスインスタンス情報
-クラスインスタンスフィールド:a
-クラスインスタンスメソッド:()、sum1()、sum2()
-クラスインスタンスコンストラクター:Foo()
-クラスインスタンスデストラクター:〜Foo()
したがって、 クラスインターフェイスは次のデータです。
-クラスインスタンスメソッド:()、sum1()、sum2()
C ++インターフェイスを明示的に記述するにはどうすればよいですか?
-C ++言語にはこれに関する小さな問題があります(構文が貧弱です)
class IFoo { public: virtual ~IFoo() {} virtual int a() = 0; virtual int sum1() = 0; virtual int sum2() = 0; };
主よ、それは何ですか?
- 仮想デストラクタ :〜Foo()。
-純粋仮想メソッド:a()、sum1()、sum2()。
そして今、このIFooで何をすべきか?
-彼からクラスFooを継承します。
class Foo : public IFoo { int a; static int b; public: Foo() { a = 0; } ~Foo() { a = 0; } int a() { return a; } static b() { return b; } int sum1() { return a+b; } int sum2() { return a()+b(); } };
Fooクラスインターフェイスが明示的に記述されました。 Fooクラスは、 IFooインターフェイスの実装(実装)と呼ばれます。 次のように、 IFooインターフェイスを介してFooクラスのオブジェクトを使用する必要があります。
IFoo * foo = new Foo(); int a = foo->a(); int sum1 = foo->sum1(); int sum2 = foo->sum2();
これにより何が得られますか?
-さて、関数を見てください:
void process(IFoo * foo) { // ... }
IFooインターフェースの実装をプロセス関数に渡すことができます 。 FooとSuperFooおよびGiperPuperFooの両方にすることができます。
C#、Java、およびその他には、インターフェイスを記述するためだけに使用されるインターフェイスキーワードがあります。
interface IFoo { public int a(); public int sum1(); public int sum2(); };
Microsoft Visual C ++には__interfaceキーワードがあります 。詳細はこちら 。
ソリッドとは何ですか?
「SOLIDは、オブジェクト指向設計におけるクラス設計の5つの基本原則の略語です。」 ウィキペディア
S | Srp | 単一責任の原則 | |
O | Opc | オープン/クローズド原則 | 開放性/近接性の原理 |
L | Lsp | リスコフ置換原理 | リスク置換の原則 |
私は | ISP | インターフェース分離の原則 | インターフェイス分離の原理 |
D | ディップ | 依存関係の逆転の原則 | 依存関係の逆転の原則 |
オープン性/クローズ性の原則では、クラス、モジュール、関数は拡張のために開かれているが、変更のために閉じられている必要があります。 肝心なのは、一度作成されたクラス/関数は、特定のプロジェクトの特定のニーズに合わせて変更できないということです。 それらのエラーを修正することだけが許可されています-これ以上。 特定のクラス/関数の動作を変更するには、そのインターフェイスを明示的に記述し、このインターフェイスの別の実装を作成する必要があります。
一般に、リスコフ置換の原則は 、継承が汎用プライベート型のプログラム階層を作成するために正しく使用されることを示唆していますが、一部のケースではなく、 一部全体ではありません。 例:車の車輪は部分全体であり、「乗用車の車輪」は、「車輪」の一般化された本質に関連して、一般私的関係です。
インターフェイス分離の原則では、相互にまったく関係のないメソッドを共通のインターフェイスにグループ化するよりも、多くの特殊なインターフェイスを使用する方が正しいとされています。
依存関係の反転の原則は 、コード全体を修正せずにオブジェクトの置換可能性を確保し、コードの依存関係を弱めるために必要です。 クラスBへのポインタを持つクラスAがある場合、クラスは強く関連していると見なされます。 クラスBを他のクラスに置き換えるには、クラスAのコードを修正する必要があります-これは良くありません。 クラスBインターフェースを派生させることが提案されています。IBと呼びましょう。 クラスAのポインターのタイプをIBに変更します。 したがって、依存関係A-> Bは 、 A-> IB < -Bに置き換えられました。 これで、Bの代わりに、IBインターフェースの他の実装を使用できます。
オブジェクト指向設計とは何ですか?
オブジェクト指向プログラムはクラスで構成されます。 プログラムのプロセスでは、クラスのインスタンスが作成され、他のインスタンスと対話して、それらの存在を終了します。 自己相似クラスとの対話は、2種類の階層を形成します。
-部分/全体の関係階層
-パブリック/プライベート関係の階層
パブリック/プライベート関係の階層はどのように見えますか?
-陸上輸送の種類の階層:
-ホイールの種類の階層:
一部/全体の関係階層はどのように見えますか?
-乗用車の階層:
システムを設計するときは、両方のタイプの階層を定義する必要があります。
すべてがそのように機能する場合、なぜこれが必要なのでしょうか?
OOPは、「プログラムの複雑さを軽減する」ために作成されました。 正しく使用すると、プログラムの内部構造が非常にシンプルになります。 プログラマとして、あなたは単に怠け者でなければなりません))ここで、プログラムの複雑さを減らし、接続性を減らすなどの方法があります。
推奨読書
- きれいなコード。 ロバート・マーティン( OZON.ru )
- リファクタリング 既存のコードの改善。 マーティン・ファウラー( OZON.ru )
- サンプルアプリケーションを使用したオブジェクト指向の分析と設計。 グレイディブッチ( OZON.ru )
- オブジェクト指向設計のレセプション。 デザインパターン。 E.ガンマ、R。ヘルム、R。ジョンソン、J。 ヴリスサイド ( OZON.ru )
PS PLOの章のJ2MEのプログラミングに関する本の1つに、「PLOがパレスチナ解放のための組織である場合、別のより基本的な本を参照してください」というフレーズがありました。 現在、このフレーズは、OOPに対する誤解に関連しています。