19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AtraeAdvent Calendar 2015

Day 22

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

Posted at

アンチパターンとは?

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

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

###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
Bar.value = 2
Bar.value # => 2
Foo.value # => 1

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

19
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?