Ruby

Rubyコーディングアンチパターン

More than 1 year has passed since last update.


アンチパターンとは?

人間が読みやすいコードを書く為に、避けるべき書き方


なぜアンチパターンを定義しておく必要があるのか?


Rubyは書き方の自由度が高い言語 = 同じ処理でも人によって書き方がバラバラ = 読みずらい!

を防ぐ為。


引数を囲む括弧を省略しない。

#悪い

dog = Dog.find 101

#良い
dog = Dog.find(101)


and、or、not を使わない

論理積: ==, and

論理和: ||, or

否定: !, not

やっていることは同じだが、書き方によってはインタプリタの解釈が異なってしまう場合がある。

#&&の場合

result = 1 && 2

puts result # => 2
#result = (1 && 2) と解釈された

#andの場合
result = 1 and 2
puts result # => 1

# (result = 1) and 2 と解釈された

object = 'BAR'

foo = 'FOO'
bar = 'BAR'

#&&の場合
if object.eql? foo && bar
# この節は実行される
end

#andの場合
if object.eql? foo and bar
# この節は実行されない
end


クラス変数を使わない

@@valiable: クラス変数

@valiable: インスタンス変数

valiable: ローカル変数

class Foo

# クラス変数は宣言(代入)を行っておく必要がある
@@variable = nil

def self.value
@@variable
end

def self.value=(value)
@@variable = value
end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => (1 スーパークラスFooの影響を受けてしまう)
Bar.value = 2

Bar.value # => 2
Foo.value # => (2 サブクラスBarの影響を受けてしまう)

class Foo

def self.value
@variable
end

def self.value=(value)
@variable = value
end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => nil (スーパークラスFooの影響を受けてしまう)
Bar.value = 2
Bar.value # => 2
Foo.value # => 1 (サブクラスBarの影響を受けてしまう)


Enumerableモジュールのメソッドの別名


Enumerableモジュールとは?

Rubyにおいて繰り返し処理のメソッド群

そのなかでも、別名が付けられているものがある。 あくまでも別名が付いているだけなので、どちらを使っても処理に違いはありません。具体的には次の4種。

・map と collect

・reduce と inject

・find と detect

・find_all と select

動作は同じだが、チームもしくはPJ内でどちらを使うべきかを決めておくと、ベター!


複数行の文字列の連結

長い文字列リテラルを記述する際、1行が長くなりすぎるとソースコード上で読みづらくなるため、複数行に分けて記述することがあります。

文字列リテラルを連結する方法はいくつかある。

string = 'loooooooooooooooooong ' +

'text'

string = 'loooooooooooooooooong ' <<
'text'

string = 'loooooooooooooooooong ' \
'text'
# '\'はメソッドではない。


複数行のメソッドチェインのドット位置

#改行後の行頭にドットを置く場合

string.downcase
.gsub(' ', '_')

#改行前の行末にドットを置く場合
string.downcase.
gsub(' ', '_')


改行後の行頭に置くメリットとデメリット

メリット

・ソースコードを上から下にざっと眺めた際の可読性に優れる

デメリット

・コードをirbやpryなどにコピー&ペーストした際に、1行目のみ実行されてしまい、後続の行がエラーになってしまう。


改行前の行末に置くメリットとデメリット

*メリット

該当の行を単独で読んでいるときに、行末まで読んだ段階で次の行を見なくともメソッドチェインしていることがわかる。


おまけ

スタイルガイド

Ruby Style Guide

Cookpad

Github

Ruby Style Guideに則しているかをチェックしてくれるツール

RuboCop