FC2ブログ
プログラマがオブジェクト指向を理解したいのなら
結論から書こう。プログラマがオブジェクト指向を勉強したいならC言語を学べばよい。C++ではないC言語だ。

世の中には、「オブジェクト指向ってこういうものなんだよ それほどむずかしくないでしょ わかった?」 といった文書が多すぎる。そんな中でも、ときにものすごくキラリと光る、本当に勉強をさせていただける文書もあるが、そんな文書は少数もいいところだ。

第一に、プログラマは「オブジェクト指向がどんなものであるか」わかっただけでは何もできない。どのようにプログラムに落とし込むか。どのようにプログラムするのかが重要である。

そもそもGUI環境はオブジェクト指向であるので、オブジェクト指向なんていうのは皆意識しないで使っている。

僕が大学に入った当時ぐらいにオブジェクト指向という言葉がインターネットの広がりとともに流行り出し、コンピュータサイエンスに従事しない人間にも知られる単語となっていたが、説明できる人間は僕の周りにはいなかった。僕も理解しようと努力したが、オブジェクト指向がどんなものであるか人と議論できるようになったのはつい最近、大学4回生になった頃です。

「関数と演算子」についてだけでもこれだけの記事が書けてしまいます。

deq blog - 関数と演算子

「プログラマ視点から見たオブジェクト指向」を時間をかけずに理解できるわけがありません。

また、

deq blog - 手続き型言語(VO構文)vs オブジェクト指向言語(OV構文)

という記事の最後の方に deq君は「オブジェクト指向」は、

いろんなプログラミングテクニックが合わさったものである

といっています。

僕は、オブジェクト指向は 

「何を知っていて 何ができるか」

でいいと思うのですが、Javaなどの有名な言語が「隠蔽化」や「カプセル化」を言語自体が強制する形であるといったことから、deq君が言っているように「いろんなプログラミングテクニック」を一つ一つ理解しないと「オブジェクト指向」を理解できないのが現状だと思います。


ここでは、色んなプログラムテクニックがあわさったものを「オブジェクト指向」と呼ぼうという観点で話を書いていきます。別個のプログラムテクニックを学ぶには、JavaやC++よりも前に存在して今も現役のCを使うべきです。そもそも、C言語といったような昔ながらのプログラミング言語からテクニックが生れ、そのテクニックを言語自体でカバーしようとオブジェクト指向言語が登場したわけですから、C言語を学んで損はありません。

では、C言語でなにを学べばよいのか?なんですが、

まず、

関数まで学ぼう

関数まで学びましょう。関数を学んだら自分でプログラムをガンガン関数を使って書いてみましょう。メソッドなんて言ってしまえば単なる関数です。関数が使えない人にメソッドが使えるでしょうか?

関数を学び終えたら、

構造体まで学びましょう。


構造体を学んだら、構造体を使ってガンガンプログラムを作ってみましょう。作っているとわかりますが、「構造体は結局自分で新しい型を作ったことと同じなんだ!」と気づきます。

この、自分で型を作る

ということはクラスを作るということと大差がありません。
構造体を使いこなせるようになっているならクラスを理解するのは簡単です。さらに、構造体は必要なデータをまとめています。これはまさにカプセル化です。

構造体まで学んだなら、200行ほどのプログラムが作れるようになっているはずです。ここは頑張ってもっと長い行数が必要となる題材を選んでみましょう。個人的にはオセロプログラムをお勧めします。如何に強くするかで変わってきますが1000行ほどのプログラムになるはずです。初めて1000行の大台に乗り、こんなプログラムを書けるようになったのかと自分自身に興奮することでしょう。しかし、同時に1000行を超えたプログラムは使う関数の実装が離れた行にあったりして、可読性に欠けだします。全部自前で作ってる場合は、あっちの関数を直してから、この500行目を書き直そう!なんていうのはザラにあります。僕はまだ企業でチームを組んでプログラムをするというのを体験していませんが、プログラムを習い出した人は、概ねコーディングと設計を同時に行うのでこのように書きなおし書きなおし、よいモノにしていくというスタイルはザラにあると思います。

そこで、

ファイルを分割する方法

を学習することになります。

ファイルを分割できれば、一つのファイルに収まる行数が減って可読性が増します。さらによく似た機能を持った関数を一つのファイルにまとめれば あの関数を手直ししたいときはこのファイルを見に行けばよいとプログラミングの効率を上げることができます。

例えば自前で

「データベースへの接続」
「データベースへの問い合わせ」
「データベースとの切断」

が行える関数を作ったとしましょう。
これをデータベースを扱う関数を集めたファイルとして db.c とでも名付けたファイルにしまっておけばデータベースに関することで手直ししたければこのファイルを見に行けば良いことになりますし、新しくデータベースまわりの処理をする関数を作りたくなってもこのファイルに追加していけばよいことになります。つまり、また関数をまとめるという作業がでてきました。カプセル化です!

さらに、ファイル分割を用いると隠蔽化も体験できます。あるファイルを作ってそのファイルの中に大域変数を static とともに宣言しましょう。すると、その変数はそのファイル以外からは参照することはできません。

この隠蔽化された変数は、まさにクラスのプライベートに設定されたメンバー変数にあたると考えることができます。

僕が言っている

「何を知っていて 何ができるか」

という「何を知っている」にあたるのは変数のことです。
「何ができるかは」は関数のことです。

この2つが合わさるとオブジェクトです。

static で宣言された大域変数と関数が記述されているファイルをみてみてください。 C++でいうメンバー変数とメンバー関数(Javaでいうメソッド)を持っていると見なせば C言語でオブジェクト指向ができてしまいました。でも、ちょいしんどい。じゃあ言語でサポートしちゃおうよということで C++が生れてきたんだと思います。

継承だって、別のファイルを include してしまえば、そのファイルの関数(メソッド)を使えるわけですから、オーバーライド等はできないにしても、ちょっとしたマネごとはできてしまいます。


クラスを作るに等しい 型の定義
データや関数をまとめる カプセル化
変数を他から参照させない 隠蔽化
別の人間が作った関数(メソッド)を使える 継承


がC言語で体験できます。

ひどい言い方をしてしまえば、これを一度に理解してプログラムを書き始めろと言っているのがオブジェクト指向言語ということができます。

いきなり、オブジェクト指向言語から入るのは難しいと思うのですが、それは僕だけなんでしょうか?

C言語でこういったテクニックを理解すれば、オブジェクト指向言語の習得時にはこれらのテクニックをどう記述するのかに重点を置いて勉強できます。



最後に一言、やったことはないんですが、構造体に関数ポインタを持たせればクラスの完成になります。
スポンサーサイト



アベント
私の場合「オブジェクト指向で作る=作ったクラスの中身は忘れてもOK」って事だと思ってました。
まぁ、それはそれであってる、のでしょうか・・・
2007/03/12 (月) 19:33:13|URL |#CfFZ5oX2
ビンゴ中西
お、書きかけの段階でコメントもらいましたねw 長文を書く励みになりましたw

うーん 考え方は人それぞれだと思いますが、「忘れてしまったら」このクラスのこのメソッドを使うとか、このクラスのこのメンバー変数にこれを保存させようとか、このメンバー変数の値を変更しようといったことができないと思うのですが・・・

って そこまで忘れるとは言ってない:-)

ってことなのかな(汗)

 
2007/03/12 (月) 20:09:05|URL |#-
アベント
今見に来たら増えてましたw

中身(≒実装)は忘れて、使い方(≒インタフェース)は覚えておく、と言うことですね、私の場合。
カプセル化と隠蔽を重視する方針と言うんでしょうか。

・・・ただこれ、バグが出ると大変なんですよねぇ。忘れちゃってるから。
2007/03/12 (月) 20:26:15|URL |#-
ビンゴ中西
あ、なるほど。

確かに使い方はこうですから皆使ってくださいね。というのがやりやすいというのがオブジェクト指向言語ですよね。PerlのCPANというところがモジュールを配布しているのですが、その発想だと思います。

でも、やっぱり作ってる方が忘れちゃうのは厳しいですよね・・・(汗)

プログラム開発で得たノウハウとかは次の開発でも活かしたいですし、やっぱり覚えれるなら覚えておいた方がよいかと・・・
2007/03/12 (月) 20:48:33|URL |#-
まぁ俺も忘れるってのに賛成かな!
忘れるって言っても、コーディングする上で中身まで覚えておく必要ないという意味で、機能として覚えていれば良いってことやな!!
そりゃ~開発で得たノウハウ等々覚えておいて絶対に損はないと思う。ここでの忘れるって意味は『考える⇒コーディング』の段階で別に中身まで気にしないでもプログラム書けますよってことで、これこそがオブジェクト指向の利点やと思うで!!
2007/03/13 (火) 01:14:34|URL |#-
ビンゴ中西
お、つまり

オブジェクト指向が「どんなものであるか」というよりは、オブジェクト指向で作ると「こんな利点がある」といった 

一言まとめが

「中身まで気にしなくても(忘れても)よい」

といったところかな。

#勝手にまとめちゃってゴメンナサイ
2007/03/13 (火) 01:47:21|URL |#-
pascal
カプセル化に関しては、Cなら抽象データ型を作るのが一番分かり易いんじゃないかな?
構造体の中にスタックやキューの実態となる配列を入れて、関数ポインタを使ってその処理も構造体の中に格納する。これで、データ構造とアルゴリズムを一体として扱うことを学べる。

オブジェクト指向というか、クラスを使った場合と違って、多態性やらの他の概念が入り込まないから混乱しないと思う。

そういえば、カプセル化とか隠蔽周りはCで学べるとして、多態性とかはCで表現できるのかな?
2007/03/13 (火) 04:27:32|URL |#-
コメントを投稿する
Name:
URL:
Comment:

秘密:管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事にトラックバックする(FC2ブログユーザー)
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

03 | 2021/04 | 05
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

ブロとも申請フォーム

この人とブロともになる

| ホーム |