プロを目指す人のためのRuby入門の感想

初めに

ほぼ初学者の私が、プロを目指す人のためのRuby入門を読み終えた感想をシェアしていきたいと思います!

良かったところ!

豊富な事例に出会える。

某プログラミングスクールに通っていたのですが、Rubyの学習はほとんど深く追求することなくすぐにRailsの学習に移行していました。
しかしRubyの学習範囲は非常に広く、実際にエンジニアとして働くには多くの学習量と知識がなくては全く使い物にならないということを豊富な事例で実感できたのは非常に有意義だったと思います。
例えばブロックには多くの書き方があることを知ることができました。

sum = 0
numbers.each do |n|
  sum += n 
end
p sum
numbers = [1,2,3,4]
sum  = 0
numbers.each {|n| sum += n }
p sum 
[1,2,3,4].select{|n| n.odd?}
[1,2,3,4].select(&:odd?)

初心者からプロの基準が体験できる。

コードを書くにあたりなるべくシンプルで他人にもわかりやすく書くことが求めれられます。
以下のコードがその例なのですがプロが書いたコードは驚愕するくらいシンプルでわかりやすく書かれています。

def to_hex(r,g,b)
   '#' +
   r.to_s(16).rjust(2,'0') +
   g.to_s(16).rjust(2,'0') +
   b.to_s(16).rjust(2, '0')
end

1回目のリファクタリング

def to_hex(r,g,b)
   hex = '#'
   [r,g,b].each do |n|
      hex += n.to_s(16).rjust(2,'0')
   end
   hex
end

2回目のリファクタリング

def to_hex(r,g,b)
   [r,g,b].sum('#') do |n|
      n.to_s(16).rjust(2,'0')
   end
end

これまでの私ならばとりあえず書いて動けば大丈夫と思っていたのですが、
プロの思考基準を理解し、追求することの大切さに氣付くことができました。

学んだこと!

プログラムの動作確認を行うために積極的にMinitestを使用すること。

シンプルなプログラムでも動作確認は目視ではなく、テストを自動化することでミスも少なくなり時間もトータルで見れば早く終わります。
どんがシンプルなプログラムであっても1つ1つ検証を人間の目で行うと間違いが生じてしまうことがありますし
シンプルなプログラムであれば1つ1つ検証でもいいかも知れませんが複雑なプログラムになればなるほで人の目で検証することは難しくなります。
例えばfizz_buzzの結果を示したものですが、目視で確認することは意外と難しいと思います。

fizz_buzzの正しい結果

$ ruby fizz_buzz.rb
1
2
Fizz
4
Buzz
Fizz
Fizz_Buzz

fizz_buzzの誤った結果

1
2
Fizz
4
Fizz
Buzz
Fizz_Buzz

そこでテストの自動化を行うことでテストコードに誤りがなければ間違えることはなくなりますし、一瞬で終わることさえ可能になります。
今までプログラムのテストといえばRspecしか頭になかったのですが、手軽に使用できるMinitestを使用して積極的にテストの自動化を行いたいと思います。

難しかったこと!

クラスメソッドの理解そしてどんな状況で使用するのか?

クラスメソッドとは?ひとつひとつのインスタンスに含まれるデータは使用しないメソッドを定義したい場合に使用する。
と書いてあるがまずはインスタンスメソッドとクラスメソッドを比べてみます。 **インスタンスメソッド

class User 
   def initialize(name)
      @name = name
   end
   

   def hello
      "Hello I am #{@name}"
   end
end

user = User.new('Bob')
user,hello => Hello I am Bob

クラスメソッド

class MathUnit
   def self.multiplication(n)
      n * n
   end
end

MathUnit.multiplication(5)

次にクラスメソッドあり、なしを比較してどんな状況で使うと良いか見ていきます。

クラスメソッドあり

class User

   def initialize(name)
      @name = name
   end

   def self.create_users(names)
      names.map {|name| User.new(name)}

   end

   def hello
      "Hello #{@name}"
   end
end

names = ['Alice','Bob','Mike']
users = User.create_users(names)
users.each do |user|
   p user.hello
end

クラスメソッドなし

class User

   def initialize(name)
      @name = name
   end

   def hello
      "Hello #{@name}"
   end
end

names = ['Alice','Bob','Mike']
users = names.map {|name| User.new(name)}
users.each do |user|
   p user.hello
end
  • クラスメソッドを使用しないとオブジェクトを生成する際に冗長なコードになってしまう。

  • クラスメソッドを使用しないとコードの意図が読み取りにくくなり可読性が下がる。

まとめ

  • クラスメソッドはインスタンスに含まれるデータに依存しないメソッドを定義するときに使用する。

  • クラス全体に関連する操作を行う際に使用する。

  • クラスメソッドを使用することでコードの意図が読み取りやすくなり可読性が上がる。

感想

量と質ともにかなりハードなので読み終えるまでに忘れている内容や理解できないことなどが多く
1回読んだだけではほとんどエッセンスを吸収することはできなかったです。
しかし作者のエンジニアとしてのプロ基準の高さに触れることができ自分の目標とすべき基準が作られRubyをもっと学びたい、もっと理解したいと思うようになりました。
自分は器用でないので何回も読まないと理解できないし、実際の場で生かすことはできないと思うので、できるまで何度もこの本に戻りエンジニアとして成長していきたいと思います。