2013/11/13(水)【追記あり】そもそもかけ算ではありませんでした

2013/11/13 23:45

以下のエントリは全面的に取り下げます。このエントリにいくつかリンクが張られていることを確認しており、また、私がかつてこのような考えを持っていたことは否定しないので、エントリそのものは残しておきますが(ただし、頭が沸騰している状態で追記した攻撃的な文章は削除しました。申し訳ありませんでした)、現在の私がこのような主張をしているわけではないことをご承知の上でお読みください。

このエントリに関しまして、2点お願いがあります。

まず、前述のとおり、私がかつてこのような考えを持っていたことは否定しません。しかし、そのことをもって、私と関わってくださる方々や、私の関わったことのあるプロジェクトを侮辱するのはお控えいただきたく思います。なにとぞよろしくお願いいたします。

もう1つ、過去にこのような発信をしたのは事実ではありますが、現在進行形で発信の内容ではなく人格を攻撃されるのは辛いものがあります。勝手なお願いではありますが、そろそろ私の人格を攻撃するのはお許しいただき、エントリの内容に対するご批判やご指導にとどめていただけないでしょうか。ご検討のほど、よろしくお願いいたします。

以前のエントリの続きです。

ほかの方の意見をいろいろと拝見して、それはそれで納得したのですが(というか、そもそも私は「わかりづらい」以上の主張はしていません)、ただ、以前のエントリで書いたとおり、わかりづらいものはわかりづらい。かけ算の順序にこだわった教育を受けてきた記憶はないのですが。

あと、前回も書いたとおりこれはあくまでも例であり、もうちょっとややこしい式になっていることが多いです。さすがに数量と単価くらいならどちらの順番でもわかるので、あんまり無能扱いするのは勘弁してくださいw

閑話休題。

今日も今日とて現行プログラム解析をしていたのですが、同じ作業をしている隣の席の方がぼやいているのが耳に入りました。

「この式わっかりづれぇんだよ。なんで違う単位の値を返すんだよ」

ん? 返す?

……ということで、理由がわかったかもしれません。そして、謝らないといけません。私(たち)がわかりづらいと言っていたのは、あまり算数、数学と関係のない理由でした。

たとえば amout * unit_price という順番で書かれていた場合、こういう処理をすることを期待しています。

// amout * unit_price
price = amount.operator*(unit_price);

しかし、さすがにこれは違和感があります。個数クラスのインスタンスに金額クラスのインスタンスを引数で渡して演算メソッドを呼び出した場合、個数クラスのインスタンスを戻り値として期待するのは当然でしょう。

ですから、金額を計算するような場合は次のような順番で書かれていてほしい。(実際には、コンパイラが良きにはからってくれることが多いですが)

// unit_price * amount
price = unit_price.operator*(amount);

今回price(にあたるもの。以下同様)もunit_priceもamountもintのラッパークラスなので、どんな順番で書こうが変わらないのですが、どうやら我々は無意識のうちに単位をクラスと見立てて考えてしまっていたようです。

要するにプログラミング言語における*演算子は、厳密な意味での乗算じゃないんですね(もちろん言語によると思いますが)。数値同士の場合に乗算のように見えるだけで。これを算数に適用しようとしたのが間違いでした。申し訳ありませんでした。

もっと極端な例でいうと、(たとえばPythonの)配列や文字列における*演算子の使い方ですかね。

# 要素数が100ですべての要素の値が0の配列
arr = [0] * 100

# ABCABCABC
repeat_str = 'ABC' * 3

もちろん、これはあまりにも算数とは関係がありませんが。

というわけで、前回のエントリの内容につきましては、「あのプログラムが」わかりづらいということを除き、ほぼ全面的に取り下げます。ですから、私のことを数量と単価のかけ算も満足にできない人間扱いする意見も取り下げていただけると幸いです。