ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

SoftwareDesign4月号を読んだ - 良いプログラムの書き方(Ruby編 お作法を意識して可読性や保守性を高めよう)

はじめに

SoftwareDesign4月号を買いました。SoftwareDesignは、入社直後に、何かに突き動かされ技術学習のモチベーションがさまよった結果購入したんですが、理解できる内容が乏しくほとんど消化できませんでした。

きっかけはニュースサイトからこの記事を読んだので。Rubyの特集だけでもささっとやるかぁと思いました。

blog.jnito.com

加えてOpenStack Swiftは社内でも触っているし、最近サーバルームに篭って結線いじってるので光ファイバ+ラック選定の特集、DevOps座談会と関心のある特集ばかりだったので買いました。今回は特集1の良いプログラムの書き方Ruby編を追っていきます。

今すぐ実践できる良いプログラムの書き方

他の言語も目は通しましたがRubyだけ動かしてみることにします。

Ruby編 お作法を意識して可読性や保守性を高めよう

以下は現在でも理解、実施ができていること * ソースコードのインデントは半角スペース2つ * メソッド名や変数名はスネークケース * 引数がない場合はメソッド呼び出しに丸括弧を使わない * メソッドの戻り値にはreturnは付けない

以降はひとつずつ見ていきます。

if修飾子を使って行数を減らす / if + 否定形の条件はunlessに置き換える

普通にif文を書くとこうなりますね。

MacBook-Air:work take$ cat test.rb 
name = "takeshi"
if name == "takeshi"
  puts "hello,takeshi!"
end
MacBook-Air:work take$ ruby test.rb 
hello,takeshi!

if修飾子、後置ifのことですね。これでソースコードを短くしましょうと言っています。

MacBook-Air:work take$ cat test.rb 
name = "takeshi"
puts "hello,takeshi!" if name == "takeshi"
MacBook-Air:work take$ ruby test.rb 
hello,takeshi!

確かに短くなります。条件がシンプルな場合はこれで良いと思います。

ただ、個人的にはunlessはあんまり好きじゃないです。人間の思考の流れと合わなくて混乱します。

MacBook-Air:work take$ cat test.rb 
name = "takeo"
puts "what's your name?" unless name == "takeshi"
MacBook-Air:work take$ ruby test.rb 
what's your name?

こんぐらいシンプルならいいですね。でもif + 否定形のほうが個人的には読みやすいです。(笑)

仕事で見ているコードでunless + 否定形があってさらにネストが深いコードがあって相当苛立ちましたね。unless + 否定形はやめましょうね。二重否定。

真偽値を返すメソッドの名前は"?"で終わらせる

is_adminよりはadmin?のほうがいいと。そのとおりですね。

"+"ではなく式展開(#{})を使って文字列を組み立てる

これもその通りかなと思います。シングルクォートだとダメです。

MacBook-Air:work take$ cat test.rb 
name = "takeshi"
puts "hello! #{name}"
puts 'hello! #{name}'
MacBook-Air:work take$ ruby test.rb 
hello! takeshi
hello! #{name}

ハッシュのキーにはなるべくシンボルを使う

これ、知らなかったです。2つの書き方があるのは知っていたけど明確な違いが分かってなかった。

MacBook-Air:work take$ cat test.rb 
ages = { 'takeshi' => 26, 'takuya' => 25 }
puts ages['takeshi']

ages = { takeshi: 26, takuya: 25 }
puts ages[:takeshi]
MacBook-Air:work take$ ruby test.rb 
26
26

これまではキーを文字列で書くことが多かった気がします。シンボルのほうが楽ですね。しかもシンボルは内部的には1つの名前に対して整数が割り当てられるので、文字列よりは高速に値の検索ができるそうです。今後はハッシュのキーはシンボルに統一します。

繰り返し処理ではforやwhileではなく、eachを使う

each便利ですよね。Cやbashから育ったのでついwhileやforを使いたくなってしまうのをやめたい。

配列の全要素を加工する場合はmapを使う

map、最近使い始めました。めっちゃ便利ですね。

MacBook-Air:work take$ cat test.rb 
numbers = [1,2,3]
triple_numbers = numbers.map do |num|
  triple_numbers = num * 3
end
puts triple_numbers
MacBook-Air:work take$ ruby test.rb 
3
6
9

配列から条件に合う要素だけを抜き出すときはselectを使う

これはじめて知りました。条件に合うものだけを取り出すシーンって結構多そうだし。以下は配列中から奇数だけを取り出す。

MacBook-Air:work take$ cat test.rb 
numbers = [1,2,3,4]
odd_numbers = numbers.select do |num|
  num.odd?
end
puts odd_numbers
MacBook-Air:work take$ ruby test.rb 
1
3

配列から条件に合致する最初の1件を取得するときはfindを使う

これも知らなかったですね。Railsのmodelに対するfindと同じですね。

おわりに

他にもRubyistとしての考え方が載っていてとても良い記事でした。

Rubyメソッドやクラスは全部覚えることはできませんが、知らないと使うこともできませんね。String、Array、HashクラスのAPIドキュメントは読んでおきます。

class String (Ruby 2.3.0) class Array (Ruby 2.3.0) class Hash (Ruby 2.3.0)

筆者のqiita記事。今回の内容もいくつか含まれてますね。

qiita.com

次はオブジェクトストレージ Swift編について書きます。