1. 序章
オブジェクト指向プログラミングは、私たちの脳と同じように世界をモデル化しようとします。
この短いチュートリアルでは、このモデリングの背後にあるコアコンセプトについて説明します。
2. 私たちが世界をどのように見るか
人間の脳は世界をそのまま処理しません。それは世界を単純化します。そうでなければ、毎秒受け取る膨大な量の情報を処理することができません。 もちろん、私たちが世界をどのように単純化するかは重要です。私たちは重要なことを考慮に入れ、他のものを無視します。
言い換えれば、私たちは心の中で世界のモデルを作成します。
3. クラスを使用したモデリング
このモデリングプロセスは、物事間の類似性を見つけることに基づいています。脳が、2つのアイテムが十分に類似しているように見える場合、それらを同じカテゴリに分類します。それ以外の場合は、異なるカテゴリに分類します。
たとえば、犬は同じカテゴリに分類するのに十分似ています。 (実際、「犬」という言葉はカテゴリーそのものです。 すぐにこれに戻ります。)犬には体重や色などの特性があり、たとえば吠えたり尻尾を振ったりすることができます。
犬、猫、テーブルは、通常、すべてが4本の脚を持っているという点で似ています。 しかし、犬と猫を使って同じカテゴリにテーブルを置くことは検討しません。 ただし、犬と猫は非常によく似ているため、すべてが適合するカテゴリを作成できます。哺乳類、または動物:
カテゴリの幅に応じて、他にも多くのカテゴリがあります。テーブルも収まるカテゴリを考え出すこともできます。
この分類には、より科学的な名前があります:分類。 したがって、これらのカテゴリをクラスと呼ぶことをお勧めします。
4. オブジェクト:実世界のクラス
すでに述べたように、クラスは、クラスでラベル付けするもの間の類似性を表します。
これらのクラスまたはモデルは、現実の世界には存在しません。 それらは現実の抽象化であり、私たちの心の中にのみ存在します:
私たちが「犬」と呼ぶものに出会ったことはありません。 はい、ばかげているように聞こえますが、違いを理解する必要があります。 「今日犬を見た」という文は、「今日、犬として分類した生き物を見た」の短いバージョンです。
実際に存在する(または少なくとも存在する)のは、ラッシーまたはライカです。 彼らは私たちがかわいがることができる毛皮と愛のボールです。
犬のクラス自体は表示されませんが、実世界の犬のクラスのインスタンスが表示されます。 これらのインスタンスをオブジェクトと呼ぶことがよくあります。
5. カプセル化:データと動作
犬は大きくても小さくてもかまいません。 それらは灰色または茶色である可能性があります。 その上、彼らは彼らの名前を認識します。 これらは犬の特性です—私たちが知っているデータです。すべての犬にはこれらの特性があります。 したがって、これらを犬のクラス自体に割り当てます。 しかし、すべての犬はこれらの特性に対して異なる値を持っています。
これらのプロパティの値は必ずしもわかりませんが、存在することがわかっているため、取得できます。 たとえば、彼らを見て彼らの色を見たり、彼らの所有者に彼らの名前を学ぶように頼んだりすることができます。
プログラミングでは、theisデータをフィールドに格納します。
その上、オブジェクトには動作があります。 犬は自分の状態を変えたり(座ったり横になったり)、他の物と相互作用したり(ボールをフェッチしたり)、環境を変えたり(面白い行動をとることでみんなを笑顔にする)できます。
プログラミングでは、これらの動作をメソッドで表します。
クラスでフィールドとメソッドの両方を定義します。 その結果、すべてのインスタンスにこれらのプロパティと動作があります。 さらに重要なのは、これらの一見無関係な概念(データと動作)を単一のエンティティにラップすることです。 言い換えると、データとそれを操作するアクションをカプセル化します。
それは完全に理にかなっています:私たちは犬に話します、そしてそれは座っています。 座っている犬を吐き出す装置に立っている犬を入れません。 代わりに、アクションとデータを結合します。これが世界の仕組みだからです。
6. 人間関係の力
オブジェクトはそれ自体で多くのことを行うことができます。 しかし、彼らが協力すれば、さらに多くのことができます。 その場合、彼らは関係にあります。 協力するオブジェクトはそれらの合計よりはるかに多いです。
たとえば、所有者がボールを投げると、それは飛び去ります。 しかし、犬はボールを追いかけ、それを捕まえて、飼い主に戻します。 飼い主、犬、そしてボールの間のこの小さなダンスは、参加者がいなければ不可能でした。
これらの関係にはさまざまな形式があります。詳細については、継承、構成、集約、関連付け、およびに関する(技術者の)記事を参照してください。 X189X]それらの間の違い。
面白い事実:プログラミングでは、いくつかの関係をデータとしてモデル化します。
7. 可視性:他の人が見るべきではないものを隠す
オブジェクトには、表示したくない、または表示してはならないデータと動作が含まれている可能性があります。 これらの詳細は、オブジェクトの内部動作の一部です。 プログラミングでは、それらを実装の詳細と呼びます。
たとえば、犬の体が臓器を隠しているため、犬の臓器は見えません。 彼らの存在や働きについての手がかりはありません。
これらは複雑すぎてほとんどのシナリオで理解できないため、これは良いことです。通常、犬の静脈から血液を送り出し、神経から電気を送る方法を知りたくありません。それを実行させます。 簡単なことが1つ必要です。走っている犬です。
犬は単純な解決策を使用します。それは明確に定義された一連の行動を外界に公開し、他の詳細を自分自身に保持します。犬は外界に介入する力を持たせたくありません。その内部状態。 それは私たちが避けたい犬を過度に制御することを可能にするでしょう。 大きな力には大きな責任が伴います:
プログラミングでは、オブジェクトのフィールドとメソッドに他のオブジェクトから個別にアクセスできます。 たとえば、Javaでは、アクセス修飾子を使用してこれらを制御します。
8. 状態処理:可変または不変
オブジェクトは、内部状態(データ)を変更できるかどうかに応じて、それぞれ可変および不変にすることができます。
たとえば、犬は食べる量に応じて体重が変化するため、可変です。 対照的に、紙幣は不変です。 プリンターから出た後は、通貨と価値は変わりません。 10ドル札が5ユーロ札になることはありません。
ほとんどのプログラミング言語では、オブジェクトはデフォルトで変更可能です。 それらを不変にするために追加の作業を行う必要があります。
9. 物事を参照する
話しているオブジェクトを指定したい場合があります。たとえば、複数の犬がいる場合があります。 混乱を避けるために、名前を付けて名前を付けます。 また、ニックネームなど、多数の名前を付けることができます。 それにもかかわらず、犬は彼らの名前に答えます。 特定の犬をその名前で参照または指し示します。
私たちが犬について話すとき、私たちはその参照を文の真ん中に置きます。 たとえば、家族が犬を飼っていて、誰かが「私は犬を散歩させます」と言うとき、誰もが彼女がどの犬を意味するかを知っています。 しかし残念ながら、犬の寿命は人間よりも短いため、犬は死ぬ可能性があり、家族は新しい犬を飼うことができます。 これが起こったとき、同じ「私は犬に歩いて行きます」という文は別のことを意味します。
同じ変数ですが、別のオブジェクトを参照しています。 変数の値は変更できます:
プログラミングでは、オブジェクトをメモリに格納します。 ただし、直接アクセスすることはできません。 オブジェクトがある特定のメモリアドレスを参照する方法が必要です。 これを行うには、メモリの一部への参照である変数を使用します。 これらの変数には名前が付いているので、それらが保持しているオブジェクトを理解できます。
10. 変わらないもの
人生には常に物事があります。 これらを参照する場合、時間は関係ありません。 それらは常に同じことを意味します。
たとえば、私たちが地球と言うとき、それは常に同じ惑星を意味します。 もちろん、いつの日か、太陽は地球を拡大し、爆発させ、破壊するでしょうが、その場所を占める別の惑星はありません。 地球は私たちが住んでいるこの岩の球であり、他には何もありません。
プログラミングでは、定数に新しい値を割り当てることはできません。 プログラミング言語によっては、定数がその値を取得する正確な時刻が変わる場合があります。
11. 定数対。 不変
まとめると、変数はオブジェクトを参照します。 ここで変更できるのは、オブジェクトの内部状態と、変数が指すオブジェクト自体の2つです。
不変性とは、オブジェクトの内部状態に関するものです。 最終または非最終は、参照するオブジェクトを変更できるかどうかです。
これらは独立しています。 4つの組み合わせすべてを持つことができます。
12. 結論
オブジェクト指向プログラミングは、私たちの脳と同じモデリング手法で世界をモデリングしようとするため、非常にうまく機能します。
この記事では、これらの概念を紹介し、簡単な実際の例でそれらを示しました。