アンチパターンとは?
人間が読みやすいコードを書く為に、避けるべき書き方
なぜアンチパターンを定義しておく必要があるのか?
###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