Rubyistビギナーが最近Rubyを書いてて思ったこと

Ruby、どんなに汚くても動くけど、翌日その書いたコードを見ると理解するまでに時間がかかることがよくある。
たぶんこれって可読性がないから。

コードの消費期限をあげるためとか最近自分が意識していること

適切なメソッドを使う

イテレータは、論理判定とかぐちゃっと書けば割とメソッドの種類を知らなくても書ける。でもこれだと可読性が息してない。
レコードを取り除きたい場合はreject。レコードを選びたい時はselect。オブジェクトから配列を作りたい時はpluck。とか使い分ける。

Word.all.map{ |v| v.id }

Wod.pluck(:id)

とか。
適切なメソッドを書いていけばとても直感的なコードになる。

肯定系の条件分岐

unlessを使わないようにする。
自分はunlessが苦手。偽の時に真になるってええっと、、、ってことがよくあって最近ifだけを使うようにしている。
式がnilになるのであれば、nil?メソッドを使う。もちろん『!』の論理反転は使わない。
present?、new_record?、empty?、blank?とかから適切なのを選ぶ。
ifだけにすれば考えずにコードが読める。

配列の要素番号を指定しない

前までは、csvで読み込む時に配列の要素番号をしていたけど、
最近はhashに変換してから、キーでカラムを読み込んでる。
こうすることで、配列に何が格納されているかコードを遡らなくていいし読みやすさ上がる。

tag_csv = CSV.open('lib/tasks/csv/0521/tag_for_book.csv')
header = tag_csv.shift

tag_csv.each do |row_array|
  row = Hash[header.zip(row_array)]
  book = Book.find(row["ID"])
end
ActiveRecordインスタンスを作る時はブロックを使う

最近のお気に入り。

Word.create do |word|
  word.name = "名前"
  word.body  = "本文"
end
コメントはとにかく書く

この時に何を思考していたのか書くことでリファクタリングする時に安心してコードを消せるとか、
同じ二の舞を踏む可能性が減らせる。そして、命名やメソッドの選択がばっちりいった時にコメントを消していく。
最初から良いコードは書けないと思っていて、
時間を開けた時にふと舞い降りることが自分には多いのでこういうことをしています。
時間の無駄と言われればその通りかと思います。

ユニットテストを書く

以前に作ったメソッドの動作確認という意味でも大事だけど、
一番メリットなのはメソッドのブレを確かめれることだと思っています。

現時点でざっくり上記のことを考えてコード書いています。
二ヶ月後とかになると少し変わっていそう。