CodeIQでRubyの作法を教わった

CodeIQ|ITエンジニアのための実務スキル評価サービス」の問題を解いた際にいただいたフィードバックが、Ruby初心者の自分にはとてもためになりましたので、Rubyの作法に関する部分をまとめました。

 

解いた問題

コピペシステム社の粗悪システムを改修

問題掲載は終了となっているので、詳細は公開できず。。。

 

フィードバック反映後のコード

githubにまとめました。

after/tmgen.rb を実行すると、before/lib/xxx_developer.rbから情報を取得して、after/lib/xxx_developer.rbに変換したコードを出力してくれます。

問題の内容がわかりづらいですが、、今回の主題はこの後!フィードバックでいただいたRubyの作法です。

  

フィードバックの内容

1. 命名について

Rubyのメソッド名はスネークケースを使用する。

createFile

のようなメソッド名は

create_file

等とすると良い。

 

2. 文字列の変数展開

#{変数名}とすることで、ダブルクォートの中に変数の内容を展開できる。

 

cur = File.dirname(__FILE__)

before_dir = cur + "/../before/lib/"
after_dir = cur + "/lib/"

 

のようなコードは、

 

cur = File.dirname(__FILE__)

before_dir = "#{cur}/../before/lib/"
after_dir = "#{cur}/../lib/"

 

として、変数の内容を文字列の中に展開することで可読性があがります。

 

3. if文を1行にまとめる

if文の実行文が以下のように1行の場合

if a == b
  p "a == b"
end

p "a == b" if a == b

とすることで1行にまとめることができます。

 

4. Booleanを返却するメソッド名

Booleanを返却するメソッドの名前は、その属性を表す名称+クエスチョンマークで命名する。

 

is_comment_or_empty_line のようなBooleanを返すメソッドは

comment_or_empty_line? のように?を付けた形にするのが一般的。

 

5. ファイル処理時のブロックの利用

 

f = File.open(file, "w")

f.write(@output)
f.close

等で行う、ファイル処理はブロックを利用することでファイルのクローズを標準ライブラリが受け持ってくれる。

ブロックを利用した場合の例

File.open(file, "w") {|f|f.puts @output}

close処理の明記を省略でき、さらに例外が起こった場合等もファイルのクローズを意識せずに済みます。

 

6. インデント

自分は何も考えず、タブキー(半角4文字分)を使用していましたが、

Rubyは「半角スペース2」でのインデントが主流のようです。

 

 

7. 重複を省く

これは、プログラミング全般で大事ですね。

 

generater.create_file("#{before_dir}lazy_developer.rb")
generater.save_file("#{after_dir}lazy_developer.rb")
generater.create_file("#{before_dir}normal_developer.rb")
generater.save_file("#{after_dir}normal_developer.rb")
generater.create_file(""#{before_dir}star_developer.rb")
generater.save_file("#{after_dir}star_developer.rb")

 

のように、同じ処理が数回続く場合は、Arrayとeachを使うことで重複を省きます。

ここだと、対象のファイル名はXXX_developer.rbのXXXの部分のみ可変なので、可変部分をArrayにまとめてeach文で処理を記述します。

 

["lazy"、 "normal"、 "star"].each do |type|
  file_name = "#{type}_developer.rb"
  generater.create_file("#{before_dir}#{file_name}")
  generater.save_file("#{after_dir}#{file_name}")
end

 

とする。なるほど!とってもすっきりします。

 

 

8. return処理

Rubyはメソッドの最後に実行された行が自動的に戻り値として判断されるので、

def test
  a = 10
  b = 5
  return a + b
end

 

の最後の行は

 

a + b    

 

とすることができます。

 

改めて見直すと、丁寧なフィードバックだ。。。ありがたや