D IT Y

タマキ工務店のIT日記

チェリー本輪読会 第16週目まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第16週目のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第16週目まとめ

第11章11.1.1〜第11章11.6まで

期間:2021年9月6日〜2021年9月10日

デバッグ とは

第11章はRubyデバッグ技法について章になります。

デバッグとは、プログラムで起こる不具合の原因を探し出し直すことを指します。

デバッグ - Wikipedia

バックトレース とは

プログラムの実行中にエラー(例外)が発生すると、出力される情報のことをバックトレースと呼びます。以下、リンク先の資料には、「メソッドの呼び出し状況を表したデータ」と書いてありました。

Ruby でのバックトレース活用法

バックトレースは、上に行くほどエラーに近いので、一番上がエラーの発生場所になります。

エラー内容が上から下に遡る(trace back to)しています。

よく発生する例外クラス(Exceptionクラス)

アプリケーションの実行中に発生するエラーを表すオブジェクトです。

るりまには多く例外クラスが掲載されています。

docs.ruby-lang.org

その中でも発生頻度の多い例外クラスがチェリー本では解説されています。

  • NameError
    • 未定義のローカル変数や定数、privateメソッドなどを呼び出したときに発生
  • NoMethodError
    • 存在しないメソッドを呼び出そうとしたときに発生
  • TypeError
    • 期待しないクラスがメソッドの引数に渡されたときに発生
  • ArgumentError
    • 引数の数が違ったり、期待する値ではなかったりした場合に発生
  • ZeroDivisionError
    • 整数を0で除算しようとしたときに発生(1/0 のように0で割ってはいけないとき)
  • SystemStackError
  • LoadError
    • requireやloadに失敗したときに発生
  • SystemError(syntax error)
    • 構文エラー、endやカンマの不足、丸括弧などが閉じていないなどが原因で発

printデバッグ

printデバッグは、簡単ですぐに使えるデバック方法です。私も一番最初に覚えました。

printデバッグと呼びますが、主に、pputs を使って行われます。変数やメソッドの値を出力したり、条件分岐が意図した通りに実行されているかどうかを確認したりに使えます。

printデバックと呼ばれる方法は以下の4つのメソッドが存在します。

  • printメソッド
  • putsメソッド
  • pメソッド
  • ppメソッド(prity printの略)

デバッカ(Byebug)を使う

デバッガを使えば対話的にデバッグをすることができます。

プログラムをステップ実行しながら変数の中身を確認したり、実行される条件分岐を確認したりすることができます。

Rubyの標準ライブラリとして提供されているdebugライブラリがありますが、開発の現場ではdebugライブラリよりも、Byebugという外部ライブラリ(Gem)が使われることが多いようです。

使い方については、伊藤さんのByebugチュートリアルが参考になります。

qiita.com

binding.irb

チェリー本では紹介されていませんが、フィヨルドブートキャンプのメンターさんからbinding.irbを使ったデバッグ方法も伝授していただきましたので紹介したいと思います。

下記のコードようにbinding.irbを挟むと、そこでデバック作業が発動し、irbが起動するしくみです。

def fizz_buzz(n)
  if n % 15 == 0
    "Fizz Buzz"
  elsif n % 3  == 0
    "Fizz"
  elsif n % 5 == 0
    "Buzz"
  else
    n.to_s
  end
end
binding.irb

ブレークポイントirbが起動するので、試したいコードを打ち込むことが可能になります。

今回は、fizz_buzzメソッドを入力してみました。

$ ruby test/fizz_buzz_test.rb
lib/fizzbuzz.rb @ line 12 :

     7:     "Buzz"
     8:   else
     9:     n.to_s
    10:   end
    11: end
 => 12: binding.irb
    13:
    14:
    15: # require 'minitest/autorun'
    16: #
    17: # class FizzBuzzTest < Minitest::Test

irb(main):001:0> fizz_buzz(15)
=> "Fizz Buzz"
irb(main):002:0> fizz_buzz(99)
=> "Fizz"
irb(main):003:0> fizz_buzz(7)
=> "7"

binding.irb を使ったやり方のメリットはデバッガ等の設定をしなくて済むので手軽であること、コードを止めた時点でアクセス(利用)可能な変数やメソッドにアクセスできるので好き勝手コードを打って試行錯誤が試せることです。

「エラーが出ました。どうすればいいですか?」から卒業するための基本と極意

以下では、デバッグの基本と極意が学べます。

qiita.com

日々ハマりまくっているので偉そうなことは書けませんが、デバッグって本当に初心者の方の壁だと思っています。同じバグで何日も詰まったことは数知れず。心が何度も折れそうになりました。。。 何度もメンターさんにペアプロしていただいて助けていただいています。そんな時に痛感することなのですが、メンターさんのデバッグの的確さ、そして速さ。本当に魔法のように問題が解決していきます。

まだまだ初心者を抜け出せたとは言えないませんが、この動画や本書の内容を日々実践し、デバッグ力を上げていきたいと思います。

参考書籍

🍒 まとめ

輪読会が終わり、かれこれ3ヶ月も経ってしまいましたが、第16週目のブログを書きました。

1週目をスタートしたときから「最終週まで書き上げる!」と自分の中で目標を決めていたので、今更ですが書いてみました。次は最終週です!

では、また!(次回、第17週目(最終週))