オブジェクト指向と、「C#」の Class について。

当ページのリンクには広告が含まれています。

 こんにちは、皆さん。今日は、「オブジェクト指向と、C# の Class 」について、その概要について、お話ししたいと思います。

 昨今の「プログラムのスタイル」というのは、初心者の方も聞いたことがあるかも知れませんが、「オブジェクト指向」が主流になっています。

 このオブジェクト指向というのは、英語では「Object-Oriented Programming(OOP)」となっています。要するに、「物を志向するプログラミング」、というような事です。

 一体、何のことでしょうか?。全然、分かりませんよね。私も、未だに分かりません。というより、プロの方でも、熟知している人は、少ないかも知れません。

 更に言うと、日本語としての「オブジェクト指向」という意味を、分かり易く実感として説明できる人が居ますか?。プログラミングを抜きにして、日常としてですが。

 その辺りを含めて、見て行きましょう。Let’s get started !.

目次

日常における「オブジェクト指向」とは。

 日常というのは、まぁ特に(OOP)とは、何の関係もない世界なんですが、オブジェクト指向という概念が、私の思っている範囲で、どのような「イメージ」なのかというのを、説明したいと思います。

 このことが、一番最後の方で関わってきます。

 皆さんは、日常世界においては、恐らく「オブジェクト指向」なんて言葉を、聞いたことも実感したことも無いと思います。

 多分、適切な例を挙げるのは難しいのですが、知らず知らずの内に、オブジェクト指向になっているのではないかと思います。

 しかし、そのどれがオブジェクト指向で、そのどれがそうでないかは、分からないと思います。

 逆に言えば、プログラミング(OOP)の方が、日常生活に追いついたとも言えます。

 私が、中学生の頃に、有志何人かと「数学の先生」に、「何故、2のゼロ乗は1なんですか?」と、聞きに行ったことがあります。もぅ、50年も前のことです。

 そうすると、その先生は、ノートを取り出して鉛筆で、次のようなことを即座に書いたんです。

  • 2^3(2の3乗)=8
  • 2^2=4
  • 2^1=2
  • 2^0=?
  • 2^-1=1/2
  • 2^-2=1/4

  つまり、「上から「2」で割って行くという「法則」があるというのが、分かるよね。」と教えてくれました。そうすると、私も中学生なので、「?」が「1」であるというのが、分かりました。

 なる程、そうだったんですね。それで理解できました。m(_ _)m

 ところがですね、法則は完全に、理解できたし分かったのですが、依然として「2^0」の実感がわきません。こういうことって、他にも沢山ありますよね。

 例えば、数学的や物理的なことが多いのですが、「四次元、五次元」とか、「量子論」とか、「相対性理論」とかですね(笑)。凡人には、全く分かりません。

 つまり、この事こそが、「オブジェクト指向」だと思うのです。言葉では分かっていても、実態とか実感としてが、未だに丸で分かりません(笑)。

 しかし、案ずることはありません。それが、普通だと思います(汗)。

OSにおける「オブジェクト指向」とは。

 このことは、可なり具体的に、「オブジェクト指向」の違いが分かるかも知れません。

 というのは、劇的な変化が、ある時期にありましたよね。皆さんもご存知の、「Windows 95」の登場です。それまでの、パソコンの世界を180度変えました。

 正に、「晴天の霹靂」でした(笑)。「CUI」から「GUI」へと。

 それまでは、「CUI(Character User Interface)」な「MS-DOS」から「Windows 3.1」を経て、完全に「GUI(Graphical User Interface)」で、「プリエンプティブ・マルチタスク」な、

「Windows 95」が、劇的に登場した分けです。これが、「オブジェクト指向」な「OS」な分けです。それまでの「MS-DOS」の「手続き型」から、一機に「オブジェクト指向」になった分けです。

 これは、「CUI」から「GUI」になったことで、実現できました。つまり、直観としてのオブジェクトが主役であり、アプリケーションは、その手段であるということです。

 よく言われるのが、「それは、手段であって目的ではない。」、というような事だと思います。

 例えば、「CUI」の場合は、主に「MS-DOS」なんですが、先ずは、「Application >オブジェクトの選択」という、流れですよね。

 ところが、「GUI」の場合は、「オブジェクト> Application の選択」という流れですよね。

 多分これこそが、オブジェクト指向なんだと思います。もう一度言いますが、「重要なのは、オブジェクト」なんですね。アプリケーションは、その手段だということです。

 これ等のことが明確になったのが、「Windows 95」だと思います。しかし、よくこんな劇的なことを思い付いて、発表したというのが凄いですよね。m(_ _)m

 まぁしかし、オブジェクト指向という概念は、何となく分かったのですが、それを具体的に実現する方法が、まだ分かりません。どうすれば良いのでしょうか?。

 それを次に、説明したいと思います。その前に、コーヒーブレイクをどうぞ!。

「人の人生は重き荷を負うて遠き道を行くが如し」

 これは、江戸幕府を作った「徳川家康」の言葉です。もぅ、素晴らしいの一言ですね。日本の頂点に立った戦国大名が、こんなに謙虚だったとは。

 それ以外にも、感動以外の言葉が見付からない程の「名言」が、沢山ありますね。しかも、史実ですからね、フィクションではありません。

 「徳川幕府」が、200年も続いたのは、偶然ではなく必然ですね。

「C#」における「オブジェクト指向」とは。

 実は、この事が一番具体的に、説明できる分け(分野)です。今までの事は、「概念」であって更に「抽象的」なことなんですね。

 ですから、オブジェクト指向という概念が、如何に難しいかを説明してみました。

 ところが、「C#」における「オブジェクト指向」というのは、ハッキリ言って「Class(クラス)」です。というより、「Class」が全てです。

 「Class」を理解できないと、プログラムは一行も書けません。

 しかし、安心してください。一行も書けないということは、逆にそれだけ「チュートリアル」が、徹底しているという事です。偶然で、プログラムは動きません。

 もし万が一、プログラムが動いた場合は、それは「立派なオブジェクト指向」だという事です。ですから、頑張りましょう。

 そうですね、一般的に広報されている説明は、以下の通りです。

 プログラミングにおける「オブジェクト指向」というのは、「データと操作方法」を、一つのオブジェクト(部品)として作成(設計)して、それを再利用して扱うという試みです。

 それによって、「簡易性」と「安全性」と「利便性」が、格段に良くなります。

 という様なことだと思います。実際、私も使っている立場からいうと、その通りだと思います。しかし、ユーザーの要求が果てしないですから、プログラミングの難易度も、それに負けてはいません(汗)。

オブジェクト指向のプログラミングとは。

 これは本当に、素晴らしい事なんです。一度習得すると、後には戻れません。

 何が凄いかは、中々具体的には言えないのですが、箇条書きにすると、「一冊の本」ができる量は有るかも知れません(笑)。

 例えば、「C」とか「古い Basic」とかは、手続型の言語であるので、「 Class 」とかは扱えません。しかし、超高速で動くとか、直観的で分かり易いという特徴があります。

 一方、「 Class 」を扱えるのが、「 C++ 」とか「 C# 」とか「 VB 」です。そして、「 Class 」を扱えることが、「オブジェクト指向」ということです。

 そして、「オブジェクト指向」の最高峰は、「 C++ 」です。「 C# 」は、その一歩手前です。しかし、初心者にとって、最もコストパフォーマンスが良いのは、「 C# 」です。

 「 C++ 」は、プロ用なのでサンデープログラマーとしては、多分可なり汗がでると思います(笑)。

オブジェクト指向の三大要素とは。

 実は、これが「オブジェクト指向プログラミング(OOP)」の、全てなんです。この三大要素を使い熟すことが、オブジェクト指向を使い熟すということです。

 そして、その三大要素というのが、「継承」、「カプセル化」、「多能性(ポリモーフィズム)」なんです。

 この中で、一番分かり易いのが、「継承」と「多能性」です。何故なら、実態が存在するからです。一方、一番分かり難いのが「カプセル化」です。

 何故なら、実態が抽象的だからです。何を公開して、何を公開しないのか、或いは、データに安全にアクセスする手段を、提供します。

 これは、作り手側の都合であって、「C#」的な制約は一切ありません。というより、未来に対して実装するというのは、実は、滅茶苦茶難しいのです(笑)。

 しかし、使い勝手が最も問われるのは、この「カプセル化」だと思います。そういう意味で、最も難しいと私は思います。

 ですから、まぁ取りあえず、分からない場合は、最初は全て「public virtual」にして置きましょう(笑)。

 

STEP
「継承」とは。

 これは、親の全ての「資産」を受け継ぐという、形式です。継承が行われると、何もしなくても、親の全てのメンバー(プロパティ、メソッド、イベント)を、自動的に使えます(引き継げます)。

 つまり、一からではなく、「差分」だけを扱える、滅茶苦茶コストパフォーマンスの良い機構が、「継承」なんです。

 そうですね、「継承」は、オブジェクト指向の中で、最も重要な要素なんですが、これが行われないと、「カプセル化」も「多能性」も、何も使えません。

 また、コンストラクターとも密接に関係しています。この辺りのことを調べると、非常に重要なことを、色々と発見出来るかも知れません。

 

STEP
「カプセル化」とは。

 これは、何を公開して何を公開しないのかを、設計することです。或いは、データを安全に扱う方法を、提供する機能です。

 例えば、データの値を「プロパティ」で制限することができます。これによって、データの安全性が確保できます。或いは、「メソッド」によって、データへの利便性を提供することができます。

 簡単そうに思えるかも知れませんが、私としては、これが一番難しい分野ですね。

 例えば究極として、「C#のコントロールクラス」のようなメンバー(プロパティ、メソッド、イベント)を、設計(実装)できますか?という命題です。サンデープログラマーとしては、多分無理だと思います。

 というより、個人で作るものではないので、出来なくて当たり前なのですが、一応書いてみました(笑)。まぁつまり、難しいということを、言いたかった分けです。m(_ _)m

 しかし、それは究極なことなので、考える必要もないのですが、兎に角、簡単なことからで良いので、何でもかんでも、作って見ましょう。そして、失敗しましょう。それが、財産です。

 まぁ兎に角、最初は全て、「public」から始めましょう。それが、一番使い易いです(笑)。そして、全てに、「virtual を付けて置きましょう。

 修正は、後から幾らでも出来ます。重要なのは、考え過ぎないことです。Take it easy !. ですよ。

 

STEP
多能性(ポリモーフィズム)。

 実はこれが、一番使えますね。というより、最も使うのが「多能性」です。「 Class 」の挙動を、自由に変えることが出来ます。

 キーワードは、「virtual」です。これによって、継承先で「オーバーライド」が出来ます。この機能によって、「if 文」を使うことなく、変化を許容することができます。

 実は、プログラマーにとって、「if 文」を使わないのが、一番「楽」な方法なんです。何故なら、バグの追跡が、必要ないからです(汗)。

 或いは、スコープを、「グローバル」から「ローカル」に、置き換えることが出来るからです。 スコープというのは、広いより狭い方が、プログラミング的には楽です。

 これは、本当に画期的なことなんです。つまり、継承元では、継承先で何が起こっているのかが、全く分かりません。

 まぁ、私の独断と偏見かも知れませんが、プログラマーにとっては、これが一番「楽」だと思います(Good)。

結局、Class(クラス)とは。

 ここまで説明した中で、恐らく初心者の方は、「Class(クラス)」を実体だと、思っているかも知れません。例えば、「ソフトクリーム」のように。

 しかし、全然違います。実は「Class(クラス)」というのは、「設計図」なんです。実体は、存在しません。

 つまり、何らかの「型」なんです。例えば、「鯛焼きの型」とか、「鋳物の型」とか、「社訓」とかですね。それ自体は、売り物ではありません。

 そこに、材料を入れることによって、無限大に製品を作ることが出来ます。この出来た製品のことを、「インスタンス」と言います。

 プログラミングでは、この「インスタンス」を扱います。インスタンスには、プログラマーが其々に、任意の名前を付けることが出来ます。

 例えば、「(public)TextBox nameTextBox = new TextBox();」という感じです。この時に初めて、「nameTextBox」という実態が、メモリー上にアロケーション(作成)されます。

 余談ですが、(public)は、作成する場所によって、必要になったり不要になったりします。

 プログラミングとしては、この「nameTextBox」に対して、色々な処理を行います。そして、この「nameTextBox」には、「TextBox クラス」の全ての機能が実装されています。

 これが、「Class(クラス)」を扱うということです。

 「インスタンス」は、メモリーの許す限り、幾らでも作ることが出来ます。しかも、最もコストパフォーマンスが良い方法で、作成されているので、安心して幾らでも使えます。

 更に、「C#」は、マネージド言語なので、ガーベージコレクションが、自動的に行われるので、メモリーのことを心配する必要は、全くありません。

 但し、グラフィックとかを扱う場合は、ガーベージコレクションだけでは、間に合いません(汗)。

結局、「オブジェクト指向」とは。

 冒頭にも、書いて置きましたが、プログラミングにおける「オブジェクト指向」とは、一体何なのでしょうか?ということです。

 実は、これが「オブジェクト指向」だ、という明確な基準はありません。「オブジェクト指向」として、推奨されることは多々あるかも知れませんが。

 しかし、それらも完全ではありません。何らかの一長一短はあります。例えば、「速度と安全性」のトレードオフというのは、必ずあります。

 「速度」を優先するのか?、それとも「安全性」を優先するのか?で、プログラミングのスタイルは、180度異なってきます。

 ですから、何を優先するのかは、個人の自由なんです。「マニュアル」が全てではありません。「マニュアル」は、飽くまでも「基本」を示しています。

 そして結局、「オブジェクト指向」というのは、どういう事なのか?ということです。

 つまり、「C#」という環境においては、極端なことを言えば、「Class(クラス)」が全てです。そして、「Class」こそが「オブジェクト指向」その物なんです。

 ですから、難しく考えることはありません。「郷に入れば郷に従え」という諺もあります。又は、「田舎の学問より京の昼寝」という諺もあります。

 要は、「オブジェクト指向」という命題を考えるのではなく、「C#」という環境に居ることこそが、引いては「オブジェクト指向」だということです。

 重要なのは、「オブジェクト指向」を考えるのではなく、拙作でも「プログラム」を完成させることです。頑張りましょう。

まとめ。

 今回は、一通り「オブジェクト指向」の概要について、説明してみました。勿論、これ位の説明で「オブジェクト指向」が、分かる筈もありません。

 そうですね、より具体的なことは、簡単なアプリケーションを作成する過程において、その都度説明して行きたいと思います。

 取り敢えず今回は、「オブジェクト指向」という、「途轍もない大きなテーマ」の末席の概要を、説明して見ました。

 重要なのは、そうですねぇ、「下らないチッポケナ権威を、人に認められようとすること」ではなく、「真摯に、人を認めようとする心」が、重要ですね。頑張りましょう。

 それでは、この辺でごきげんよう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次