2013年1月14日月曜日

ウンコードの殆どは、実は言語仕様に問題がある。と思う

代入と比較の取り違え
http://unkode-mania.net/view/5055e449a753b5d160000008

代入演算子と、比較演算子の取り違えはよくありますが、テストすりゃ判る。それはその通り。

式の中で、代入と比較を混在できるのも、よくよく考えればヤバイ。とは言え、これは手続き型言語の鬼門とも言えますな。本来は言語仕様レベルでなんとかするべきでしょう。この点考慮してるのは、pascal系ぐらい?しかも流行ってません。この間違えた誰かさんはpascal育ちなのでは無いでしょうか?そんなに馬鹿にしたものではないかもよ。

そもそも字面が1文字違いってのもヤバいです。イコール1個忘れたら動かないわけですよ?むしろ間違えるなって方が無理。よくよく見ても判りません。小生、乱視が酷くてですね。

そういう意味では、Java族のgetter/setterはその反省といえるのかも知れませんが、1文字違いなのは解決してないという。

クラス初期化にmemset
http://unkode-mania.net/view/5019208444f2527722000000

Cまではメモリ管理がプログラマ任せでしたから、その調子でC++を書けば、こんなことは起こるでしょう。intで宣言したら0入れて、char[]で宣言したらmemsetで、ってそんな馬鹿正直に書くより、全部memsetしちゃったほうが賢い。悪いのは仮想関数の機構、および、初期化しませんっていう、C/C++ランタイムのサボリです。

forの2段目のコピペ間違え
http://unkode-mania.net/view/50177f11fc12b2e54a000000

これは古典的Cのfor構文が悪い。ネタでは2段ループの2段目を間違えました。ってオチですが、実はこれ。1段でも起こります。

古典for構文では、制御変数を3回書かなければならない。故に、後発の軽量言語では大抵foreachが使えます。極力ソレを使うべき。なにより、「ループの意図」を明確にできます。

逆に、古典forの3ブロックの式で、すべて別の変数をイジることはできるわけですが、むしろ小生としてはそっちの方が有用だと思ってます。

  • ループの前に必ずやること、
  • ループの終了条件、
  • ループの最後に必ずやること、


という3点を明記できますから。

初期化ブロックとかを空にして無限ループとかいう小細工も横行してますが、小生の感覚では、これは裏技です。コンパイラを騙してる感がします。