オブジェクト指向言語であるC#を使ってプログラミングをしていても,オブジェクト指向的にプログラミングできているものと,そうでないものがあります。
プログラミング初心者にはこの違いは分からないでしょうが,初心者でなくてもこの違いが分かっていない方って結構います。
特に,.NETが誕生する2002年より前からVB6などでプログラミングをしていた人は,なかなかこの「オブジェクト指向」という言葉の意味や,実装方法が「分からない」「理解できない」「難しい」という声をよく聞きます。
ここ10年くらいの間にプログラミングを始めた人は,最初からC#という言語が存在していたので,オブジェクト指向的にプログラミングができているか?というとそうでもありません。
大学で数年間プログラミングを勉強して会社に入ってくる新人を教育していても,オブジェクト指向的にプログラミングをする意味を理解していないし,入社して5年ほど経つエンジニアでも理解できていない人は結構います。
オブジェクト指向的にプログラミングするというのは抽象的な表現であり,ズバリこれがオブジェクト指向で書かれたプログラムだ!となかなか示し辛いというのもあり,また人それぞれで解釈も異なるため,プログラマーがそれぞれに思うプログラミングをしてしまっているというのも,現代のプログラマー市場では往々にしてまかり通っています。
そもそもプログラマーという職業,今はどうか分かりませんが,まったくプログラミングできない人間でもプログラマーになれました。大学でプログラミングを勉強していなくても,プログラムを書いたことがなくてもプログラマーになれました。
というのも,大昔はコンピューターなんて無い時代でしたが,その後に現れたコンピューターというのはドデカイ物で,銀行や企業の限られた人が使うものでした。
ここ20年で一人に1台(もっと?)パソコンが与えられて仕事をするのが当たり前になり,それに伴い,社内や個人で使用するアプリケーションといわれるソフト開発の需要が恐ろしく伸びたのです。
アメリカも日本もそうですが,パソコンが普及し,一気にプログラマーの需要が伸びたため,次第に未経験者であっても,まったくプログラミングの知識の無い人であっても,企業を雇うようになりました。大手企業は自社で人を雇い,育てていくのでまだいいですが,プログラマーを雇い,企業に派遣する会社は,ロクに教育もせず,プロのプログラマーの顔をして,現場に派遣します。そして一人50万程度の単価で働かせて,当人には20万程度を給料として支払うという会社がたくさん現れました。
あなたが今,職場で目にしているわけの分からないプログラムコードは,こういった未熟な人間によって作られています。少し勉強して,代入とIF文を独学で学んだだけの人間でも,プロのプログラマーとして働き,保守性の悪い,いや何もかもが悪いダメダメプログラミングを量産しています。
マーチンファウラーの有名な著書「リファクタリング」でも,最初にケントベックと出会ったときのエピソードの中で,ケントベックは「1週間かけてすべてのプログラムを全員でリファクタリングさせた」と語っていますが,アメリカおきていたことが,10年ほど遅れて日本でも同じことが起きているのだと感じます。
オブジェクト指向プログラミングをそうで無いもの
未熟なプログラマーによって,世の中には大量のオブジェクト指向でないプログラムコードがあふれかえっています。そしてその一部は恥ずかしながら私の手によって作り出しました。オブジェクト指向で作られたプログラムは,保守性が高いため,プログラム修正や,改造が容易で,プログラムをいじったために,どこにどのような影響が出るのかが,分かりやすいものになっています。ある程度知識のある人間が読むと読みやすく,複数人でプログラム開発を行っても,重複コードが出にくく,再利用可能なプログラムコードになっています。
オブジェクト指向で作られていないプログラムは,どこに何が書いているか分かり辛く,修正したものがどこに影響するのか分かり辛い。同じようなプログラムコードが量産され,新規に配属されたメンバーはどの関数を呼び出せば正しく動くのかが理解できません。少しの修正や改造をするために膨大な時間を要し,テストにも非常に時間がかかります。
「理論上大丈夫」と思える感覚がもてません。
なぜオブジェクト指向で作らないのか?
なぜオブジェクト指向で作らないのか?理由は次の3つだと思います。
- オブジェクト指向を知らない
- オブジェクト指向を知っているけど理解できない
- 自分で編み出すことができない
オブジェクト指向を知らない
オブジェクト指向を知らない場合は仕方がありません。当然オブジェクト指向プログラミングはできません。
オブジェクト指向を知っているけど理解できない
オブジェクト指向を知っているけど理解できない人も結構います。特に前述したように,昔からプログラミングをやっている人に多い傾向と思われます。
当時はみんなこういった本を読んで勉強していましたが,理解して,実装できるレベルには到達できませんでした。
オブジェクト指向でなぜつくるのか 第2版
オブジェクト指向は自分で編み出すことができない
理由の3番目が「自分で編み出すことができない」です。
結局これに尽きると思います。とても頭の良い人が,クラスやインタフェースというものを作り出し,javaやC#といったオブジェクト指向言語を作ってくれました。あとは好きなようにオブジェクト指向プログラミングをすればいいのですが,人間の思考回路上,上から順番に処理されるコードと,サブルーチン(共通関数)化にしか普通の人はたどり着くことができません。オブジェクト指向を勉強せずに,オブジェクト指向言語だけを与えられても,オブジェクト指向プログラミングはできるようにならないのです。
クラス,継承,インタフェースというものの使い方を理解しても,どのように使うのが有効的なのか?というのは,「オブジェクト指向設計」「デザインパターン」「テスト駆動開発」「ドメイン駆動開発」というものを勉強しなければ決して身につくものでは無いのです。
だから「代入」と「IF文」書けます!程度でプロのプログラマーとしてプログラミングをしていてはいけないのです。学校では教えてくれない,正しいプログラミングの方法を学ぶ必要があります。
ちなみに学ぶ順番は次のような順番が良いかと思います。
- 最低限のコーディング知識
(IF文など。継承やインタフェースは分からなくてもオブジェクト指向設計を学びながらでも習得は可能) - オブジェクト指向設計
- デザインパターン
- テスト駆動開発
- ドメイン駆動開発
それでは次章より,オブジェクト指向とは何たるかを解説していきます。
まとめ
オブジェクト指向言語はなんとなくプログラミングをしているだけでは決して身につかない。先人の知恵を拝借して学んでいくしか道はなし!
「基礎文法」「オブジェクト指向」「デザインパターン」「テスト駆動」「ドメイン駆動」の順番で勉強しよう。
=================================
今回はオブジェクト指向プログラミングの中身を順番に見て行きたいと思います。