̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/ 5/18 通巻687号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ インクリメントを使うな - リーダブル・コード(35) インクリメントは、++ という記述の演算子による演算で、変数に格納されている 値を +1 するという、C言語系のプログラミング言語にある記述法です。 i = 2; i++; // インクリメントによって i = 3 となる i++ は、i = i + 1 と同じ処理をします。 ちなみに、この i = i + 1 は、 i と i + 1 が等しいという変な意味に読めてしまいますが、もちろんそんな 変な意味の処理がプログラムに記述されるわけがありません(バグでない限り)。 条件式以外の = は、右から左へ代入するという意味なので、変数 i の値に +1 した値を変数 i に代入する(入れなおす)という意味になります。 Basic 以外 の言語では、= は常に代入、== は常に等しいという意味になります。 インクリメントに似た処理に、デクリメントがあります。 デクリメントは、 -- という演算子で記述された値を -1 する処理です。 以後は、インクリメント について書きますが、デクリメントも同様の話をしています。 i = 2; i--; // デクリメントによって i = 1 となる インクリメントは、頻繁に使われる処理なので、++ という演算子が特別に C言語 で採用されました。 頻繁に記述するケースについては、略語などの短い記述を 例外的に認めた方が、全体的には逆にコストが下がるからです。 もう1つ特別な演算子として、複合代入演算子もあります。 複合代入演算子を 使えば、インクリメントと同じ処理を記述することもできます。 C言語では、i += 1 より i++ の記述の方が、一般的によく使われます。 i = 2; i += 1; // + の複合代入演算子によって i = 3 となる しかし、i++ より i += 1 の方が可読性が高いです。 i++ の方が読みやすい という理由は、慣れているからという理由以外にありません。 特別な演算子を採用する理由は、文字数が減ることで読み書きのコストを下げる ことですが、i++ も i += 1 も文字数はほとんど変わりません。 i += 1 は、足す値が 1 であることが明示されているため、理解を助けます。 これが効果が高く、リーダブルコードになる最も大きな理由です。 i += 1 に統一すれば、++ を学習する(思い出す)必要(副作用)はありません。 ここからは、専門的な話になります。 インクリメントは、コレクションの中の要素を一覧する(forEach)するときに 使われることが多いのですが、多くの種類があるコレクションのうち、配列に 対してしか使えません。 配列番号を加算するときだけです。 他のコレクションでは next などの別のメソッドで要素を一覧します。 このため、昔に比べてインクリメントを使うケースが減っており、 インクリメントという演算子を特別に用意する理由が小さくなっています。 インクリメントが存在しないプログラミング言語は多くあります。 Ruby、 Python、scala などです。 Ruby にインクリメントの演算子をサポートして 欲しいという要求は昔からありましたが、オブジェクト指向で設計された Ruby は、数値クラスが Flyweight パターンで実装されていて immutable である ためにインクリメントのメソッドにできない、特別扱いして実装することが 思想に反するということで見送られました。 もう少し噛み砕いて説明しましょう。 n++ はオブジェクト n に対するメソッドのように見えます。 しかし、メソッドは 変数 n ではなく、n が参照しているオブジェクトに対する操作です。 それに従った、 数値(例: 2)オブジェクトの意味を変える(例: 2 オブジェクトを 3 の意味 にする)という処理をするわけではありません。 インクリメントは、変数が参照 する数値オブジェクトを、別の数値オブジェクトに切り替える処理になります。 つまり、見た目から推測される動作が異なる(メソッドに見えるがそうではない) というわけです。 メソッドに見えてしまう理由は、おそらく = が表記されて いないからでしょう。 このような考えはオブジェクト指向に特殊な考えと考える こともできるでしょうが、そこから外れるということは統一性を欠いて複雑に なるということです。 オブジェクト指向の考えなしに現在の高機能なプログラ ミング言語はできません。 = を含む式(例: a = 1)を参照する式(例: b = ( a = 1 ) ) は、= が複数 あるために、複数の動作があることを感じることができ、その記述を避ける きっかけになります。 += のような複合代入演算子でも += に = が含まれている ことで、同様のきっかけになります。 しかし、インクリメントの演算子では、= が ないために同様のきっかけにはなりにくく、インクリメントを参照する式 (例: b = a++ )を書くことに抵抗が小さくなります。 メソッドに見えてしまう ことも抵抗が小さくなる理由です。 しかも、インクリメントを参照するコードは、 前置インクリメント (++i) か後置インクリメント (i++) かのどちらであるかに よって微妙な違い(プラスする前の値か、プラスする前の値のどちらが参照される かという違い)があり、その違いによって不具合が発生してしまいます。 不具合 の発生確率が増えるだけでなく、レビューのコストが増えることになります。 前置か後置かの違いを雄弁に語りたくなるからです。しかし、その対価を払うほど の大きな効果はありません。 参考 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323 http://blog.tokoyax.com/entry/ruby/increment http://www.freeshow.net.cn/ja/questions/2a3bcf9e6f61adbc47c64ecb1020fa2a388a4ef54fc57aab5a5d458e55520340/ http://d.hatena.ne.jp/xuwei/20110130/1296360331 注目ニュース 一覧 ◇ Windows 10は、iOSやAndroidアプリをユニバーサルアプリに移植できる! http://ascii.jp/elem/000/001/005/1005796/ http://pc.watch.impress.co.jp/docs/news/event/20150505_700654.html … iPhone も Android も何でも動く Windows 10 は理想論か。 ◇ OSに標準付属のMSBuildツールでプロジェクトをビルドするには? http://www.atmarkit.co.jp/ait/articles/1505/13/news016.html … ビルドだけなら Visual Studio も SDK もインストール不要。 ◇ 次世代BD、Ultra HD Blu-ray、仕様策定が完了。ロゴも発表。 http://japan.cnet.com/news/service/35064437/ … ようやく4K対応。DVD、BD、UBD の3種類になる。 ◇ iPhoneをよくなくす人ほどApple Watchが重宝する? http://www.itmedia.co.jp/pcuser/articles/1505/04/news018.html … スマホに電話をかけるだけでいいのだけど。 ◇ ネイティブ広告はコンプガチャの轍を踏む。 http://japan.cnet.com/marketers/interview/35064049/ … ステマ(ステルス マーケティング)を求める広告主がいる。 ◇ Microsoft傘下のSunrise、iOS/Android向け予定入力キーボード、Meet 発表。 http://www.itmedia.co.jp/mobile/articles/1505/15/news063.html … 英語と日本語をよく切り替える日本では、モードが増えてしまう。 ◇ 金融・電力などサイバー攻撃報告義務。政府素案。 http://www.yomiuri.co.jp/it/20150501-OYT1T50144.html … サイバー攻撃の情報を一括管理へ。 ソフトウェアデザイン館 Sage Plaisir 21 ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm