導入
Smalltalk 君は「人の思考方法に寄り添った設計思想」と解説しましたが、「計算式のようなもの」は譲れない理由があるのです。
人が計算すると
3 + 4 * 5
この答えは、 23 です。われわれ人間の世界では、かけ算は足し算より先に計算しなければいけないからです。
Smalltalk 君が計算すると
以下を Playground で Print It してみてください。
3 + 4 * 5
Smalltalk 君の場合 35 と表示しますね。間違えてんじゃん!と思いますよね? しかしこれには理由があるのです。
Smalltalk 君の言い訳
計算式ってなに?
オブジェクトへのメッセージ送信だもーん!
解説
Smalltalk 君にとっては
3 + 4 * 5
は計算式ではないのです。
Smalltalk では左から右の順でメッセージを送信します。
最初に、値が 3 である SmallInteger オブジェクトに、値が 4 である SmallInteger オブジェクトを引数にした + メッセージを送ります。
結果として、値が 7 である SmallInteger オブジェクトを返します。
続けて、値が 7 である SmallInteger オブジェクトに、値が 5 である SmallInteger オブジェクトを引数にした * メッセージを送ります。
結果として値が 35 である SmallInteger オブジェクトを返します。
Smalltalk 君にとっては 35 が正しいのです!
計算ミスではない
Smalltalk 君は、人間界における計算式の計算方法は完全無視です。計算式というものは存在せず、オブジェクトとメッセージ送信があるだけです。
でも
人間であるわれわれにとっては、35 は間違いで 23 が正しいです。これは困りました。
解決方法
3 + (4 * 5)
先にメッセージ送信して欲しい部分をカッコで括れば良いのです。これを Playground で Print it してみてください。今度は 23 と表示しました。
めでたしめでたし!
まとめ
優先順位に依存するコードは書かないようにしよう、カッコで括って明示しよう、というコーディング規約を採用している現場もあったりします。足し算よりかけ算を優先するのは、われわれ人間の世界では常識すぎて、カッコで括る必要は無いと多くの人は言うと思います。
「それってあなたの◯◯ですよね?」 ひ◯ゆき
しかし、優先度に依存するコードは避けようという昨今の潮流からすると、計算式のかけ算の部分をカッコで括るというのは、あながち間違いではないとも思えないでしょうか。われわれはわれわれの常識に囚われすぎているのかも知れませんよ?