初めに
ほぼ初学者の私が、プロを目指す人のための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をもっと学びたい、もっと理解したいと思うようになりました。
自分は器用でないので何回も読まないと理解できないし、実際の場で生かすことはできないと思うので、できるまで何度もこの本に戻りエンジニアとして成長していきたいと思います。