新刊ピックアップ

なぜ日本人はオブジェクト指向をなかなか理解できないのか?

この記事を読むのに必要な時間:およそ 1.5 分

JavaやJavaScript,PHPなど,現在人気のプログラミング言語のほとんどは「オブジェクト指向言語」という種類の言語です。ですがこのオブジェクト指向,日本人には理解しにくいと言われています。その原因は様々ですが,一番の悪者は,日本のIT教育ではないでしょうか。

変数は「箱」じゃない!

皆さんは,プログラミングの授業で「変数」について,どのように教わりましたか? おそらく,⁠変数とはデータを代入する⁠箱⁠のようなものです」といった説明を受けたと思います。実はこの説明,まったくの大嘘なのです。

この「変数」「代入」という用語ですが,数学用語からそのまま転用されています。なぜなら,プログラミングでも数学でも,同じ記号を使って数式を書くからです。例えば次の数式は,⁠xという変数に1を代入する式」または「xという名前のついた箱に1を入れる式」だと教わります。

  •  x    =    1
  •  ↑   ↑   ↑
  • 変数 代入 データ

数学だったらその説明で良いのですが,プログラムの場合は意味が通じなくなることがあります。例えば,プログラムでよく見かける次の式はどうでしょう?

  • x = x + 1

「xという箱に入っているデータに1を加え,計算結果をさらにxという箱に入れる…」と説明することはできますが,同じ箱が複数出てくるところで論理が破綻してしまいます。

こうなってしまう原因は,そもそも「代入」という日本語自体が間違っているからです。

「=」「代入」じゃない!

数学用語の「代入」は,英語の「substitute」を和訳したものです。substituteは「代わりにする」という意味なので,妥当な訳ですね。しかし,IT用語の「代入」は,英語では「assign」という単語です。assignを直訳すると「割り当てる」なので,意味がまったく違います。

「=」「割り当てる」と訳してみると,先ほどの数式を日本語でうまく説明できます。⁠x = 1」「1にxを割り当てる」ですし,⁠x = x + 1」「xが割り当てられたデータに1を加えたものに,xを割り当てる」となります。ちょっと冗長ですが,このほうが意味がしっくりときますね※1)⁠

なぜ英語のassignを代入と訳したのかは今となっては不明ですが,おそらく,初めてプログラミングの「=」を解説する際,面倒なんで数学の「代入」をそのまま流用しちゃったんではないでしょうか。

箱とか,代入とか,
最初に言い出したのは誰なのかしら?

そもそも「変数」って何?

実は,誰かさんがassignを代入と訳したとばっちりで,日本人は「変数」の意味までも誤解してしまいました。変数も,数学とITでは意味が異なるのです。

「変数」は英語で「variable」なので,日本語に直訳すると「変化するモノ」になります。数学でもITでも意味は同じですが,この「モノ」の解釈が異なります。数学ではモノは「数」ですが,ITでは「データ」のことを指します。この解釈で,先ほどの「x = 1」という式を日本語に訳してみると,⁠1という変数(データ)にxという変数名を割り当てる」になります。また,これを式に当てはめると,次のようになります。

  • 変数名 = 変数

つまり,⁠x」はあくまで変数の名前に過ぎず,変数の実体とは「データ」そのものなのです。

あ…ありのまま 今起こった事を話すぜ!
⁠おれはデータを変数に代入したと
思ったらデータが変数だった』

変数とオブジェクト指向

オブジェクト指向では,⁠データ」「オブジェクト」として扱いますので,⁠変数」もまた「オブジェクト」と同じものだと言えます※2)⁠

そう考えることで,オブジェクト指向の様々な概念(プロパティ,メソッド,インスタンス等)も,すっきりと理解できるようになるでしょう。オブジェクト指向プログラミングでは,変数を作り,その変数に様々な機能や処理を加えることで,プログラムを作っていくからです。

変数の前に道はない
変数の後ろに道は出来る

これからオブジェクト指向言語を学ぶ方は,ここで紹介した「変数とはオブジェクトのこと」というイメージを胸に,学習に臨んでみてください。それだけで,理解度が多少なりとも変わってくると思います。それと,初めて学習するなら言語は「Python」「Ruby」がおすすめですよ!

※1)
コンピュータのメモリに入っている「データ」に,ペタリと名札を貼るようなイメージです。なお,機械語の時代は名札が貼れなかったので,データが収まっているメモリアドレス(ポインタ)を使ってデータを扱っていました。
※2)
どのデータを「オブジェクト」として扱うかは,言語によって大きく異なります。特に,数字や文字といった単純なデータ(リテラル)をオブジェクトとして扱わない言語はたくさんあります。

コメント

  • 日本のIT業界が悪いのではなくて、あなたのように嘘っぱちの情報を堂々と書く人がいるのが原因でしょうね

    Commented : #14  ; (2015/11/03, 16:02)

  • Re:

    有用じゃないから使われないんじゃないでしょうか?
    有用ならば、何と名づけられたものであれ使われるはず。
    あるいは(社会的に無駄なのかもしれないが)同時多発的に発明されるはず。
    そうでないオブジェクト指向は偽の技術だと思う。

    Commented : #13   (2015/05/07, 01:06)

  • ひどい

    長々とわけのわからない擁護をしてる人がいますが

    >個人的にこの記事は有用であり、それに対してあまりに粗
    >暴かつ的外れな批判を行っているから指摘した。

    この記事のどこが有用なんでしょうね?
    理解不能だわ

    Commented : #12  ぬ (2015/01/17, 23:15)

  • ある程度有用な記事だと思うが・・・。

    記事が何のために書かれたのか分からないなどと言っている人もいるが、その人の文章も何のために書かれたのかよく分からない。その文章を書くことで記事が改善されたりするのなら意味があるのだろうが、言いがかりを付けて否定しているだけで、改善案などは出してないのだから、そういう意図も無いのだろうし。
    具体的には
    >>* 日本のIT教育が一番の悪者と言っているが、英語 nativeな人は、日本人よりもオブジェクト指向が理解しやすいという統計結果があるの?
    いいがかり、論文じゃないんだから統計など必要ないし、日本人には理解しにくいと言われているというのはもちろん筆者がそういう風に言われている場面を見たり聞いたりしたことがあるだけだろう。ただの体験談であり、そして文章の導入にすぎない。

    >>* 「箱が大嘘」と言っているが、なぜ大嘘なのか書いていない。箱を変数の値を格納するメモリ領域と考えれば多くのプログラミング言語の実装のとおりであり、まったく問題がない。
    言いがかり、筆者は「箱が大嘘」などとは一言も言っていない。その後に続く
    「この「変数」や「代入」という用語ですが,」という文を読めば分かる通り、筆者が大嘘だと言っているのは「箱」ではなく変数や代入と言った用語に対してである。また、なぜ大嘘なのか書いていないなどとのたまっているが、「「=」は「代入」じゃない!」ならびに「そもそも「変数」って何?」で書かれている。

    >>* 代入は、下のコメントの人が言っているとおり、左辺値と右辺値を正しく説明すればよい。右辺にある変数は(他のプログラムでかかれた変数と同様に)変数が指している値を、左辺の変数は代入される場所を指す、ということをきちんと教えれば何も問題はない。
    筆者が嘘だと言っているのは、数学用語とIT用語の違いに起因するものだからこの指摘は的外れである。この説明はIT用語での「代入」ならば問題はないが、数学用語での代入でいえば明らかに誤りである。数学用語の代入とは、プログラムのように代入演算子を使ったものでは無く、等号を使ったものであるからである。pythonやCで言えば = ではなく == を利用したものであり、それは「右辺と左辺が等しい」ということを言っているに過ぎない。具体的な違いとして、数学的には x=1も、1=xもまったく同じ意味であるが、右辺の値を左辺に代入するという代入演算子では同じでない。
    >>* 「「データに」に、ペタリと名札を貼るようなイメージ」って、assignよりもsubstituteの方が近いんじゃない?データに名前をつける(=データを名前で置き換える(読み変える))という意味で。bind variable to valueという表記を勉強してください。
    >>* 「同じ箱が複数出てくるところで論理が破綻」ってどこが破綻しているのか記述していない。そもそも破綻していない。
    IT用語的な代入の意味を理解している人には破綻していないのだろうが、数学的な代入の意味しか知らない人に、詳しく説明もせず、x=x+1という式を見せたら明確に破綻している。もちろん中学生レベルの数学を習ったことがある人ならば分かるだろうが、数学では同一の式内で同一の文字が使われた場合、それらは同一の数値を持つので、x=x+1というのは明確に破綻している。xの数値が等しいのに、右辺だけに1を足しているから、等号が成立していない。これを式として成立させるには、個別の変数を用意する必要がある。例えばy=x+1や´を付けてx´=x+1にする必要がある。

    >>* 用語がおかしいから理解が進まないというのはありえるが、用語を直せば理解が完全になるかと言われてもそうではない。代入の意味をきちんと教えなければ、代入を割り当てにしたところで理解は完全とはならない。著者の文章は、用語が悪いという指摘をしたいがために、肝心の代入の意味もめちゃくちゃに説明してしまっている。
    筆者はIT用語の代入が数学での代入とは違うこと、そしてIT用語の代入は割り当てると呼称した方が実態を表していると言っているが、これは妥当であり、滅茶苦茶ではない。具体的にどこがめちゃくちゃなのだろうか。
    >>* 日本人は「変数」の意味まで誤解した、とあるが、本当ですか?しかもどう誤解したか書いてないし。
    これを式に当てはめると,次のようになります。

    変数名 = 変数

    という上記の文があるが、IT業界ではこの文での変数名の部分を単に変数としてしまっており、これを誤解と書いている。もっともこれは筆者の主張であり、その妥当性を十分に示しているとは言い難いが、しかし「どう誤解したのか書いてない」などということは無い。
    >>* リテラルの使い方が間違っている。文字型にはリテラルもそうでない場合も存在する。
    これはもっともである。
    >>* データをオブジェクトと考えると概念がすっきり理解できる意味がまるでわからない。変数を正しく理解できないことがこれらの概念の妨げになってたの?
    これは言いがかりではないだろう。疑問に思ってるだけだし。回答としては変数の概念を理解する段階で躓いている人には意味がある。そうでない人には意味が無い。
    >>* 下のコメントにあるとおり、「「変数」もまた「オブジェクト」と同じ」、はおかしい。
    筆者の言っている「変数」とはIT業界での「変数」ではない。筆者が言っている変数とは
    変数名 = 変数
    の式の通りデータであり、IT業界が言っている変数とは上記左辺の変数名の部分である。
    >>* オブジェクト指向プログラミングでは、「変数を作る」って変です。変数は単なる(著者風に書けば)「データ」につけられる名前であって、作られるのは「データ」です。
    上と同じく。筆者の言っている変数はデータなので、おかしくない。

    >>以上より、この文章の著者が計算機科学を知らないのは明らか。
    早計である。知った上で主張している可能性を考慮していない。
    >>そして、この文章の著者の名前がないけど、著者はPythonスタートブックの著者なのか。そうであれば、この本を読まなくて良いという意味で有用だけど、そうでないのであればいい迷惑だと思う。この本が選ばれている理由がまるで書いてないし。何のためにこの文章が存在しているのかまるで分からない。
    書籍案内 » 新刊ピックアップ » なぜ日本人はオブジェクト指向をなかなか理解できないのか?
    と書かれており、まるで分からないなどということは無い。書籍案内とは書籍の内容を紹介するものではないのか?

    個人的にこの記事は有用であり、それに対してあまりに粗暴かつ的外れな批判を行っているから指摘した。

    Commented : #11   (2014/10/06, 00:39)

  • ひどい

    こういう文書があるおかげで現場は余計混乱することになる

    Commented : #10  obj (2014/03/30, 15:38)

1ページ(1/3)    

コメントの記入