こんにちは、皆さん。今日は、「オブジェクト指向と、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」にして置きましょう(笑)。
これは、親の全ての「資産」を受け継ぐという、形式です。継承が行われると、何もしなくても、親の全てのメンバー(プロパティ、メソッド、イベント)を、自動的に使えます(引き継げます)。
つまり、一からではなく、「差分」だけを扱える、滅茶苦茶コストパフォーマンスの良い機構が、「継承」なんです。
そうですね、「継承」は、オブジェクト指向の中で、最も重要な要素なんですが、これが行われないと、「カプセル化」も「多能性」も、何も使えません。
また、コンストラクターとも密接に関係しています。この辺りのことを調べると、非常に重要なことを、色々と発見出来るかも知れません。
これは、何を公開して何を公開しないのかを、設計することです。或いは、データを安全に扱う方法を、提供する機能です。
例えば、データの値を「プロパティ」で制限することができます。これによって、データの安全性が確保できます。或いは、「メソッド」によって、データへの利便性を提供することができます。
簡単そうに思えるかも知れませんが、私としては、これが一番難しい分野ですね。
例えば究極として、「C#のコントロールクラス」のようなメンバー(プロパティ、メソッド、イベント)を、設計(実装)できますか?という命題です。サンデープログラマーとしては、多分無理だと思います。
というより、個人で作るものではないので、出来なくて当たり前なのですが、一応書いてみました(笑)。まぁつまり、難しいということを、言いたかった分けです。m(_ _)m
しかし、それは究極なことなので、考える必要もないのですが、兎に角、簡単なことからで良いので、何でもかんでも、作って見ましょう。そして、失敗しましょう。それが、財産です。
まぁ兎に角、最初は全て、「public」から始めましょう。それが、一番使い易いです(笑)。そして、全てに、「virtual を付けて置きましょう。
修正は、後から幾らでも出来ます。重要なのは、考え過ぎないことです。Take it easy !. ですよ。
実はこれが、一番使えますね。というより、最も使うのが「多能性」です。「 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#」という環境に居ることこそが、引いては「オブジェクト指向」だということです。
重要なのは、「オブジェクト指向」を考えるのではなく、拙作でも「プログラム」を完成させることです。頑張りましょう。
まとめ。
今回は、一通り「オブジェクト指向」の概要について、説明してみました。勿論、これ位の説明で「オブジェクト指向」が、分かる筈もありません。
そうですね、より具体的なことは、簡単なアプリケーションを作成する過程において、その都度説明して行きたいと思います。
取り敢えず今回は、「オブジェクト指向」という、「途轍もない大きなテーマ」の末席の概要を、説明して見ました。
重要なのは、そうですねぇ、「下らないチッポケナ権威を、人に認められようとすること」ではなく、「真摯に、人を認めようとする心」が、重要ですね。頑張りましょう。
それでは、この辺でごきげんよう。


コメント