リーダブルコードを読みました

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

素晴らしい本だった!!
印象に残ったところを中心にまとめておく。


名前大事。超大事。

大事なことなので二回言いました。


抽象的な名前よりも具体的な名前を使う

下のコードでは誤解が生じる。

引数の単位は何だろう?
秒?ミリ秒?


実装を読めばわかるだろうけど、そうしなくてもいいようにすべきだ。


単位が明らかになった。


どれくらいの抽象度で書くべきかは都度判断するしかない。


誤解されない名前

下のコードでは2通りの解釈が生まれてしまう。

  • 問題があった場合に true が返る
  • 問題がなかった場合に true が返る


これはよくない。
曖昧さを残さない名前をつける必要がある。


これならば解釈の違いは生まれない。


テストコードに状況を書く

こういうテストは書くべきではない。


テストコードはプロダクト自体のコードと比べて雑に扱いがち。
さほど複雑でないメソッドのテストならなおさら。
上のコードのように一つのメソッドに詰め込んでしまうこともある。


でも大抵の場合、複雑さは後々増していく。
後でテストコードを追うのは至難のワザ。 なので初めからテストコードが想定する状況を名前に書くようにするのがベター。


自分以外の誰かがメンテナンスする場合にこの基準に合わせてコードを書いてくれることも期待できる。


最後に

気軽に読める分量で、この本自体がリーダブル。
Kindle 版がないのが唯一の不満。


プログラマーならば必読といっていい。
デブサミの技術書大賞にあがったのもうなずけた。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)


Ruby を始めて2日目の僕が驚いたこと

驚いた

photo credit: Kmark via photopin cc


Ruby を初めて 2日目。
Railsチュートリアル第4章Ruby の基本的な使い方を学んだ。


Ruby を使って驚いたことがいくつかあったのでまとめておく。
(プログラミング経験はそれなりにある。C#JavaScript, PHP など)


Rubyist の方は、初めて Ruby に触れたときのことを思い出すきっかけに。
Rubyist の方は、Ruby に興味を持ってもらえるきっかけになれば。


なお、いくつかのコードは Railsチュートリアルから抜粋している。


end はあるけど begin しない

多くの言語では関数やブロックを中括弧で括る。
Pascal 系言語では begin 〜 end で括る。

Ruby では begin なしで急に end が出てくる。

if string.empty?
  "string is empty!"
else
  "string is not empty!"
end


考えてみれば begin のきっかけになる if 文や for 文(Ruby では each)が目印になる。
だから begin がなくても成り立つのか、と納得させられた。


配列のインデックスにマイナスが入る

配列にマイナスのインデックスでアクセスすると、今までの言語ではエラーとなったり、メモリの怪しいところにアクセスする。


これが Ruby では -1 は配列の最後、-2 ならその手前、-3なら・・・となる。

>> a = [1..5]
=> [1, 2, 3, 4, 5]
>> a[2..(a.length-1)]
=> [3, 4, 5]
>> a[2..-1]
=> [3, 4, 5]


インデックスで落ちないための設計というわけではなく、array[array.length] にアクセスすると nil が返る。(デフォルトの場合)


array[0..-1] とすればすべての値を取得できる。
length を取る手間が省けて嬉しい。


関数に丸かっこがいらない

今までの言語では、メソッドには丸かっこがつきもの。
丸かっこがなければプロパティという切り分けだった。


これが Ruby では丸かっこを省略できる。

def string_message(string)
  if string.empty?
    "string is empty!"
  else
    "string is not empty!"
  end
end

>> string_message("test")
=> "string is empty!"
>> string_message "test"
=> "string is empty!"


これは・・・微妙な気がする。
前向きに捉えれば丸かっこはキーの位置からすると打ちづらいし、なければ早く書けるのかも。


まだ Ruby 界隈がよく分かってないけど、省略は基本的に使うべきではないのかも。
Rubyコーディング規約


既存のクラスに関数を追加できる

JavaScript では prototype の拡張がこれに当たる。
C# で言えば拡張メソッド。


class String
  # 文字列が回文であればtrueを返す
  def palindrome?
    self == self.reverse
  end
end


僕のようなアプリケーションエンジニアは使うべきではないと思う。
使うとすれば「 JavaScript でよくあるブラウザバージョンの挙動の違いを吸収したい」みたいなケース。


Railsチュートリアルでもこれを注意喚起した文章が書いてあった。

組み込みクラスの変更はきわめて強力なテクニックですが、大いなる力には大いなる責任が伴います (訳注: 「スパイダーマン」の名台詞)。従って、真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています。
Railsチュートリアル - 4.4.3組込みクラスの変更


インスタンス変数にアットマークがついてる

インスタンス変数=メンバ変数。
Rubyインスタンス変数を扱うときはアットマークが先頭につくことになる。


class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@name} <#{@email}>"
  end
end


これは嬉しい。
変数名で見分けが付くようにしようなどと考える手間が省ける。


最後に

新しい言語を学ぶってやっぱりワクワクする。
多くの OSS 界隈のプログラマを虜にする Ruby & Rails のことだから、まだまだ驚かされることになるんだろう。
期待しよう。


Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング