はじめに
最近のプログラミングはオブジェクト指向プログラミング一択のようなんですが、C#だとかJavaだとかのプログラミング言語を覚える事がオブジェクト指向プログラミングを覚える事とイコールになってしまってオブジェクト指向プログラミングってなによって感じになってるような気がします。
で、オブジェクト指向プログラミングについて勉強しようと思っても専門用語とかが多すぎて訳わかんないし、職場の先輩とか上司とかの間違ったオブジェクト指向プログラミングによる仕様書やなんかで・・・
というわけで、オブジェクト指向プログラミングを勉強する前に、まずは構造化プログラミングを勉強してみてはいかがでしょう?
構造化プログラミングとは
wikiによると、
構造化プログラミングではプログラミング言語が持つステートメントを直接使ってプログラムを記述するのではなく、機能を抽象化した仮想機械を想定し、その仮想機械が提供する命令群でプログラムを記述する。普通、抽象化は1段階ではなく階層的である。各階層での実装の詳細は他の階層と隔離されており、実装の変更の影響はその階層内のみに留まる。各階層はアプリケーションに近い抽象的な方から土台に向かって順序付けられている。この順序は各階層を設計した時間的な順番とは必ずしも一致しない。
と難しい言葉でよく判らないことが書いてあるので、ここはあえて無視します。
構造化プログラミングで大事なことは次の3つ
1.プログラムを機能や処理によってブロックに分ける
2.各処理は1.で作ったブロックを呼び出して記述する
3.機能の追加や削除、修正などはブロック単位で行う
このプログラムの機能や処理をまとめた『ブロック』がプログラムを構成する構造体でこのブロックを積み重ねてプログラムが出来上がります。
また、積み重なったブロックの一部を別のブロックに入れ換えたり順番を変えればプログラムの動きが変わりますし、一度作ったブロックは他のプログラムにも利用可能だったりします。
って、これってなんてオブジェクト指向プログラミング?
オブジェクト指向プログラミングとの比較
wikiによると、
オブジェクト指向プログラミングとは、一般的に以下の機能や特徴のいくつか、あるいは多くを活用したプログラミング技法である。
カプセル化(振る舞いの隠蔽とデータ隠蔽)
インヘリタンス(継承) -- クラスベース
ポリモフィズム(多態性、多相性)
ダイナミックバインディング(動的束縛) -- 動的型付け
これらの機能を提供するプログラミング言語は、オブジェクト指向プログラミング言語 (OOPL; object-oriented programming language) と呼ばれる。これらの機能のうち、オブジェクト指向の考え方で不可欠なのは「カプセル化」の機能だけである。そのため、オブジェクト指向プログラミング言語の中には、カプセル化以外の機能については一部を提供していないものもある。
ただし、カプセル化(可視性の定義)やポリモフィズムとダイナミックバインディングはオブジェクト指向言語に固有の概念というわけではなく、非オブジェクト指向言語の中にもこの性質を備えるものもある。
ってまぁ判りやすいような判りにくいような事が書いてありますが、この中で不可欠と書かれている『カプセル化』が『構造化』に置き換えられるんです。
また、カプセル化以外のインヘリタンスやポリモフィズムもよく読めば構造化プログラミングの中で書かれていたりするので、我々普通のプログラマにとっては殆ど同じ設計思想と言ってしまってもそれほど間違ってはいないかもしれません。あくまでも現場レベルでは、ですがw
構造化プログラミング的オブジェクト指向のすすめ
オブジェクト指向でプログラムを設計しようと思うと、まずどんなクラスを作ってと言った感じで『外側』から作りがちですが、構造化プログラミングの場合はまずそのプログラムに必要な機能を洗い出して、そしてそれを組み合わせてブロックを作って、そして更にそのブロックを組み合わせてもう一つ大きなブロックを作って・・・と言った感じで『中身』から作ります。
これはオブジェクト指向プログラミングで最初で最大の難関であるたい焼きの例えで考えると判りやすいと思います。
オブジェクト指向プログラミングでは
1.たい焼きの型を作る(クラスの作成)
2.たい焼きの中の餡を作る(プロパティ、メソッドの構築)
構造化プログラミングでは、
1.たい焼きの中の餡を作る(機能ブロックの作成)
2.たい焼きの型を作る(プログラムの作成)
となります。
ここでオブジェクト指向プログラミングがこの例えで何故判りにくいかというと、この状態で今川焼きを作りたい場合どうすれば良いのかと考えるとすぐに判ります。
今川焼きをインヘリタンスで作るとすれば、たい焼きが中に入ったでっかい今川焼きになるの?
たい焼きの中の餡をポリモーフィズムで今川焼きに入れることは出来るけど、そんな風に作ってないから作り直しだしぃ・・・
でも、構造化プログラミングなら、餡は餡というブロックで作ってありますので、今川焼きでも御座候でも回転焼きでも、それこそどら焼きでも違和感なく、直感的に餡を流用出来ます。(餡を餡クラスとして作成して、たい焼きクラスや今川焼きクラス、どら焼きクラスなどでインクルードやインポートしてもいいでしょう)
ま、オブジェクト指向プログラミングでも設計手法をきちんと理解した上で、きちんと設計してからプログラミングすればこんな変なことにはなら無いのですが、現場でやっつけでプログラムしてるとついついこんな変なことになってしまったり、上の人がたい焼き信者の自称ベテランオブジェクト指向プログラマーだったりすると・・・
というわけで、オブジェクト指向プログラミングで作成するように言われてもいきなりクラスから作らずに、まずは機能や処理のブロック化、構造化を行ってから、オブジェクト指向を頭の隅に置きながらどの単位でクラスにすると便利かな?って考えならがブロックという構造体を積み重ねていく事をお勧めします。