Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: 数値の正負チェックはpositive?やnegative?で明確に書こう(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

Ruby: 数値の正負チェックはpositive?やnegative?で明確に書こう(翻訳)

Rubyは他の多くの言語と対照的に、シンプルなプログラミングタスクの実行方法を複数提供しています。開発者の幸せを追求するため、Rubyの標準ライブラリはコードをより英語らしく見せる機会を提供しています。

今回は、数値とゼロとの比較を見ていくことにします。

🔗 以下のように書くのではなく

比較演算子を使う。

if number > 0
  # 何かする
end

if number < 0
  # 何かする
end

🔗 以下のように書くこと

RubyのNumericやそのサブクラスに備わっている便利メソッドを使って、より明快な形で書く。

if number.positive?
  # 何かする
end

if number.negative?
  # 何かする
end

🔗 そうする理由

過去記事では、これとよく似たzero?という比較メソッドを取り上げました↓。

Ruby: 数値のゼロチェックには'== 0'よりも'zero?'メソッドを使おう(翻訳)

「より英語らしい」書き方なら、今後コードを再び読むときの明確さが増し、理解しやすくなります。比較演算子で書くと、<>の向きを読み取って数値や変数との関連を理解するときに集中力を一瞬余分に使うかもしれません。

Rubyを書いていて最も楽しい点のひとつが、このような方法で便利メソッドやシンタックスシュガーを実現していることです。

Rubyはプログラマーを幸せにするために設計されています。
Yukihiro "Matz" Matsumoto

🔗 そうしない理由があるとすれば

「このスタイルは他の言語と違いすぎる」「<が"less than"と"greater than"のどちらだったかで迷ったことなどない」と主張する開発者もいます。

パフォーマンスを引き合いに出してこのスタイルを使わない場合もあるかもしれません。

require "benchmark/ips"

Benchmark.ips do |x|
  x.report("1 > 0") { 1 > 0 } #=> true
  x.report("0 > 0") { 0 > 0 } #=> false
  x.report("-1 > 0") { -1 > 0 } #=> false
  x.report("1.positive?") { 1.positive? } #=> true
  x.report("0.positive?") { 0.positive? } #=> false
  x.report("-1.positive?") { 0.positive? } #=> false

  x.report("1.0 > 0") { 1 > 0 } #=> true
  x.report("0.0 > 0") { 0 > 0 } #=> false
  x.report("-1.0 > 0") { -1 > 0 } #=> false
  x.report("1.0.positive?") { 1.positive? } #=> true
  x.report("0.0.positive?") { 0.positive? } #=> false
  x.report("-1.0.positive?") { 0.positive? } #=> false
end

Integerの場合:

1 > 0
31.644M (± 0.1%) i/s
0 > 0
31.625M (± 0.2%) i/s
-1 > 0
30.919M (± 0.1%) i/s
1.positive?
22.602M (± 0.2%) i/s
0.positive?
22.621M (± 0.2%) i/s
-1.0.positive?
22.676M (± 0.1%) i/s

Floatの場合:

1.0 > 0
31.442M (± 0.2%) i/s
0.0 > 0
31.178M (± 0.1%) i/s
-1.0 > 0
30.861M (± 0.2%) i/s
1.0.positive?
22.707M (± 0.1%) i/s
0.0.positive?
22.576M (± 0.1%) i/s
-1.0.positive?
22.654M (± 0.1%) i/s

上のベンチマークでは、IntegerFloatのどちらについても「シンタックスシュガーなし」に軍配が上がっています。

しかしここで重要なのは、私のノートPCではシンタックスシュガー「なし」「あり」のどちらも数千万i/s(秒あたりのインストラクション実行数)に達していることです。

パフォーマンス上の要求が最大級に厳しい場合でない限り、読みやすい方を使いましょう。このスケールを超えるパフォーマンスを「本当に」要求されるとしたら、別のもっと大きな問題に直面する可能性があるかもしれません。

関連記事

Rails: ハッシュのマージをwith_defaultsメソッドで明快に書こう(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。