2021-04-21

オブジェクト指向がわからないあなたへ

どうも、都内の某企業に勤めるフルスタックエンジニアです。この記事では、ITの非専門家に向けて、オブジェクト指向の解説をしたいと思います。

小学生のプログラミング教育が開始されたり、AIやIoTなどの技術が身近になった今日、オブジェクト指向を理解しておくことは極めて重要です。なぜならば、オブジェクト指向はITエンジニアとっての「共通言語」であって、今やあらゆるソフトウェア技術がオブジェクト指向の上に成り立っているからです。したがって、オブジェクト指向を理解すれば、ITのすべての分野の基礎が身についたことになります。難しい概念がいくつか出てきますが、分かりやすく解説するので頑張ってついてきて下さい!

オブジェクト指向とは

まず、オブジェクト指向とは何かを解説します。オブジェクト(object)とは、「モノ」のことです。言い換えれば「モノ指向」です。つまり、コンピュータのようなバーチャルな対象ではなく、現実のモノをモデルにプログラミングしようというのが、オブジェクト指向の定義です。この考えは、今流行りのIoT(Internet of Things = モノのインターネット)にも取り入れられ、爆発的に影響力を増しています。

モノという考え方は、18世紀の哲学者カントに遡ります。カントは純粋理性批判において、理性と経験によって認識できる以前の「物自体」という概念を提唱し、大陸の合理主義とイギリスの経験主義を統一しました。オブジェクト指向におけるモノとは、カントのいう物自体です。したがって、オブジェクト指向は世界の真理を記述できます。そのため、コンピュータというバーチャルな世界を超えて、IoTを作ることが可能になります。

現代のプログラミング言語でオブジェクト指向をサポートする最も代表的な言語はJavaです。これに対して、CやC++といった旧来の言語は関数型言語といい、現在では顧みられることはありません。また、JavaのMicrosoft版であるC#や、Javaに組み込んで使うマクロ言語であるJavaScriptなどもオブジェクト指向言語であり、プロのエンジニアは好んでよく使います。一方、学生向けの教育用言語であるPythonやRubyなども、一応オブジェクト指向をサポートしています。これらはプログラミング入門には適していますが、実務で使われることはありません。

オブジェクト指向の三要素

オブジェクト指向で最も重要な要素は

  • カプセル化
  • 継承
  • ポリモーフィズム

の3つです。これらを駆使することで、食卓から宇宙までを豊かにするIoTを作ることが可能になるのです。一つ一つ解説していきます。

カプセル化

カプセル化とは、実装を利用者から見えなくすることです。

たとえば、ソフトウェアに脆弱性があったとしても、カプセル化をしていれば、利用者からはその脆弱性は無いように見えます。したがって、オブジェクト指向で作られたソフトウェアには、セキュリティ上の問題が存在しません。

また、IoTを用いていない従来の家電製品などは、ボタンがたくさんあったりして操作がとても複雑です。カプセル化を応用すると、この操作を全く包み隠してしまっても、機械が使えるようになります。iPhoneやスマートスピーカーがタッチパネルや声認識などで操作できるのは、カプセル化のおかげです。逆に、ガラケーやボタンがたくさんある家電製品などは、オブジェクト指向(=IoT)で作られていません。

継承

継承とは、あるオブジェクトの性質を別のオブジェクトが引き継ぐことです。

たとえば、人間は「歩く」「喋る」などの動作を行え、鳥は「飛ぶ」「鳴く」などの動作が行えます。オブジェクト指向の世界では、鳥を継承することで、人間が飛んだり、鳴いたりすることができるようになります。これを応用したのが、VR(Virtual Reality=仮想現実)です。

また、iPhoneが携帯電話であるにも関わらず、ツイッターをみたり、アマゾンで買い物ができたりするのもオブジェクト指向のおかげです。つまり、iPhoneはツイッターやアマゾンを継承しているのです。それだけではなく、iPhoneは時計や財布、メモ帳など、現実世界の多くのものを継承しています。

ちょっと抽象的になりますが、この考えを突き詰めると、次のような応用が生まれます。将来必要となるすべての機能を実装したオブジェクトを一度作っておけば、後続の開発者はそれを継承するだけで、新規の開発なしに新機能を追加することができます。このような性質を「再利用性」といい、ソフトウェア開発では極めて重要な考え方となります。継承はこの再利用性をもたらすために、ソフトウェア開発のスピードを爆発的に加速させ、現代のITの発展の原動力となりました。

ポリモーフィズム

ポリモーフィズムは、日本語では「多態性」と言います。多態性とは、読んで字のごとく、多くの状態を持つということです。

オブジェクト指向では、多くの状態を持つことができます。一方、C言語などの関数型言語は状態を持つことができません。関数型言語では、プログラムを関数(つまり、入力と出力をもつブラックボックス)の合成として記述します。関数は、中学校の数学で学んだように、入力に対して出力が一意に定まるので、状態を持つことができないのです。この制約を「参照透過性」と言います。

オブジェクト指向では、参照透過性の制約がないため、プログラマは自由にコードを書くことができ、関数型言語と比べて遥かに生産的です。また、上に述べたように状態を持てるということは、プログラムの入力に対する出力を無数に持てるということです。この応用がAI(Artificial Intelligence=人工知能)です。AIが、まるで人間が考えたかのように答えを出すことができるのは、ポリモーフィズムにより無数の出力を得ることができるからなのです。

おわりに

全体的に難解な記事となってしまいましたが

部分的にでも理解すればITの世界を見る目が変わるはずです。

うさんくさい情報がネット上には多いですが

そういうものに騙されず、皆さんには本物の知識を身に着けてもらえればと思います。

  • すごくわかりやすかったです。 勉強になりました!!!!!!!!!!!

  • こんなところまで来てかみ砕いた説明読まないと理解出来ない人はプログラム向いてないんじゃないの 知らんけど

  • ちょっと理解が違うな オブジェクト指向はモノ化することだから、KKOが風俗に行って女性をモノ化したり、女性が上昇婚して男性をモノ化することだよ

  • どっかのサイトのほうが分かりやすかったわ 元増田の話はわかりにくい

  • 15年前の文章か? 関数型言語を意識してるあたり、5年くらい前の流行をちょっと拾ってはいるがやばすぎる。 絶対に参考にしてはいけない。

    • そういうレベルじゃなくて完全にでたらめだよ 手続き型言語を関数型言語と言い換えたり、わざと間違いを混入してる文章 増田のレベルを試してるのかもな

      • だよねこれツッコミ待ち?の記事だよね 後で読む的にブクマ伸びてるんだろうけど 素でこの知識披露したらかなり痛い人になりそう 一応 CやC++といった旧来の言語は関数型言語とい...

    • どこが間違ってるかいっさい説明のないゴミ指摘。

  • したがって、オブジェクト指向で作られたソフトウェアには、セキュリティ上の問題が存在しません。 すごすぎ

    • この説明は確かに全然判らなかった。脆弱性の話とは別だと思うけど>オブジェクト指向

  • 再投稿かな?

  • 将来必要となるすべての機能を実装したオブジェクトを一度作っておけば、後続の開発者はそれを継承するだけで、新規の開発なしに新機能を追加することができます。 こういうのは...

  • 冷静に見たら嘘ばっかりじゃねえか "PythonやRubyなども"(略)"プログラミング入門には適していますが、実務で使われることはありません。"

  • Javaに組み込んで使うマクロ言語であるJavaScript これは間違い。 JavaのMicrosoft版であるC# こちらはある意味正しい。

  • お〜 わかりやすい! りかいが深まりました にかいも読んじゃいました!

  • 縦読みオリエンテッド文章

  • しかしオブジェクト指向も「オブジェクト指向といえば継承です。継承だけは使わんといてくださいよ」ってなるのどうにかならんのかね21世紀やぞ

  • コード書かん人間がOOP知ってどうすんの&コード書かんと理解できんだろこんなん

    • プログラミング始めて半年ぐらいはこういうこと語りたくなるもんだよ 誰もが通ってきた道なんだから挫いてやるなよ 将来偉大なエンジニアになるかもしれんだろ

      • おれも、銅線の配線とか、少しは詳しくなったぞ。 インターネットにはまだまだ、銅線もいるからよ

        • メタルなのかファイバーなのかを判定して、ちがうコードがだなぁ(以下略)

      • コードの暗黒面に魅入られたスパゲッティコーダーを倒してコードにバランスを齎すんか?

  • カント「俺がバグがあるって認識できないんだからバグはない」

  • これがソーカル事件ちゃんですか かなり不思議な気分になるわ

  • C++ってCにオブジェクト指向を取り入れた言語じゃないの? あと世界的には今でも人気TOP3には入る基本言語だと思う 俺は勉強してないけど

  • そうかこうやって釣るのか

  • オブジェクト指向とは、構造化プログラミングの問題を解決するために生まれた。グローバル変数の氾濫の対処と、メソッド名の簡略化ができる。

  • ちょうど昨日似たようなこと考えてた https://anond.hatelabo.jp/20210421004414

  • プログラミングを別の例で解説している物をよく見るが、正直言ってその例で分かるのか?といつも思う

  • なんとなくわかった気がするんだけどぼくのぴゅう太でどうやって実装すればいいでしょうか

  • 子どもが見たら本気にするからヤメレw

  • 「耳目を集めるためには、誰でもつい物申したくなるような言説を披露することが必要である」ということがわかる名文。 加えて、「真実の中に嘘を散りばめることで無知な人々を騙す...

    • だるいんで全文読まなかった 偉いね全部読んだんだ

    • N88 (Quick) Basicのころからデバイス制御のためのプログラミングしてます。VB6を結構使い続けてて気づいたときには「.net」しか使えないってことで愕然とした記憶有。.net使いだけどオブジ...

  • そんな餌に釣られクマー

  • わかりました。   これからは 「カプセル化を継承してポリモーフィズムでチャチャッと直してよ。」 「明後日までに出来るでしょ?」 と言うことにします。

  • ↓2つのワードパワーが凄まじい JavaのMicrosoft版であるC# オブジェクト指向で作られたソフトウェアには、セキュリティ上の問題が存在しません。

  • 「VR = Virtual Reality」みたいな訳語の説明以外に正しい記述がほとんど無い……。

    • DVD = Digital Versatile Disc (デジタル多用途ディスク) IT = Information Technology (情報技術) 増田 = Anonymous Diary (匿名日記) とかはどう?

  • この一文だけでも相当高度。 C言語などの関数型言語は状態を持つことができません。 「C言語 = 関数型言語」という間違った前提から一転して、急に本当の関数型言語の特徴の説明...

  • 釣り堀会場定期

    • ITの非専門家に向けて、オブジェクト指向の解説をしたいと思います。 難しい概念がいくつか出てきますが、分かりやすく解説するので頑張ってついてきて下さい! (略) 全体的に難...

  • Pythonの、インデントでブロックを表現する方法は、教育用言語のABCから影響を受けている という事実はある そこから単語だけ抜き出して適当につなげて 学生向けの教育用言語であるPyt...

  • オブジェクト指向がどうとかとかこだわってるやつ久々に見たと思ったら見事に釣られたわ 学習コスパ悪いしバッドノウハウ満載・ただの00年代おっさんPGの叩き棒でしかないってバレて...

  • ↓これがオチってことやろ? 『うさんくさい情報がネット上には多いですが そういうものに騙されず、皆さんには本物の知識を身に着けてもらえればと思います。』

  • 全 部 う そ

  • 発掘あるある大辞典と同じなんだよな。 納豆が身体に良い ⇒ 納豆をたくさん食べれば良い みたいな短絡的な情報しか受け付けない思考回路。 別にすべての記述の裏を取れとは言わな...

  • オブジェクト指向は宇宙の法だよ。 おっしゃるとおり、「デジタル」と「リアル」を繋ぐ唯一の方法。 オブジェクト指向とタントラを学ぶことは、これからのAI時代に益々重要になると...

  • 記事を読んだが俺はオブジェクト指向には反対だね。 IoTとか言って、モノを重視するのは前時代への退行だよ。 デザインパターンとか言って、世の中や人間を型に当てはめたがるのも気...

  • オブジェクト指向は、弦理論と融合して宇宙をモデリングする統一言語となりつつあると思います。 日本が科学立国として世界をリードするためにも、オブジェクト指向を理解すること...

  • これからは小学校教育にもオブジェクト指向を取り入れるべきだ そうしなければAIに代替されてしまうだろう オブジェクト指向的思考法で英会話やアクティブラーニングを教えなければ...

  • インスタンス化という発想は少子化問題にも応用できると思う

  • オブジェクト指向を発案したアラン・チューリングやフォン・ノイマンは、ノーベル賞ですよね? だから、世界平和や環境問題にもオブジェクト指向で取り組むべきだと思うのです。

  • オブジェクト指向の言葉の意味については、昔からよく調べていますが、しかし、いまだによくわかっていないのですが、今回の記事を読んでみても、あまり理解ができません。理解す...

    • 集合内の要素をパターン化して作るために集合を定義してるだけやで

      • 違います オブジェクト指向の(オブジェクト指向に限らずあらゆるプログラミングパラダイムの)目的は「関心の分離」です すなわち、 プログラムの処理目的をインタフェースに抽...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん