Cookpad Ruby style guide

June 14, 2017

Ruby style guide와는 다른 부분이 보여서 읽고 신경쓰이는 부분을 정리해보았습니다. 전체는 여기에서 확인하실 수 있습니다.

긴 메소드 체인의 마지막 부분이 블럭인 경우

이런 경우에는 앞 부분과 뒷 부분을 나누는 스타일을 권하고 있습니다.

# good
posts = Post.joins(:user).
  merge(User.paid).
  where(created_at: target_date)
posts.each do |post|
  next if stuff_ids.include?(post.user_id)
  comment_count += post.comments.size
end

# bad
posts = Post.joins(:user).
  merge(User.paid).
  where(created_at: target_date).each do |post|
    next if stuff_ids.include?(post.user_id)
    comment_count += post.comments.size
  end

체이닝중 문제가 생기는 경우 이런 형태로 고쳐서 코딩하는 경우는 꽤 있는데, 이대로 쓰는건 신선하네요. 유지보수 측면해서는 유용하지 않을까 싶기도 하고. 개인적으로는 다음처럼 체인 자체를 끌어내리는 쪽을 선호합니다만…

posts =
  Post.joins(:user).
    merge(User.paid).
    where(created_at: target_date).each do |post|
      next if stuff_ids.include?(post.user_id)
      comment_count += post.comments.size
    end

1행 최대 글자수는 128

80은 확실히 모자라겠구나, 싶긴한데 128이라는 미묘한 숫자는 어디서 나왔는지 궁금합니다[..] 이 길이면 새 레일즈 프로젝트에서 행 길이로 문제가 되는 경우는 없다는 장점은 있겠구나 싶네요.

숫자

숫자 관련이 의외로 자잘한 규칙이 많은데, 16진법이랑 분수는 어디서 쓰고 있는지…

문자열

작은 따옴표/큰 따옴표 중 하나를 사용한다고 룰을 정하지 않는 부분이 독특하구나 싶습니다. 이스케이프 기호를 최소화하기 위한 전략의 일부인건지, 그냥 자유로운건지…?

정규식

float_pat = /\A
  [[:digit:]]+ # 1 or more digits before the decimal point
  (\.          # Decimal point
      [[:digit:]]+ # 1 or more digits after the decimal point
  )? # The decimal point and following digits are optional
\Z/x

배열

해시

수식

대입

조건

함수 호출

# good
puts [1, 2, 3].map {|i|
  i * i
}

# bad
puts [1, 2, 3].map do |i|
  i * i
end

# good
[1, 2, 3].map {|n|
  n * n
}.each {|n|
  puts Math.sqrt(n)
}

# bad
[1, 2, 3].map do |n|
  n * n
end.each do |n|
  puts Math.sqrt(n)
end

모듈/클래스

class Foo
  # good
  def foo
  end
  private :foo

  # bad
  def foo
  end

  private :foo
end

메소드 정의

감상

큰 틀은 Ruby Style Guide와 다를 것이 없습니다만, 중간중간 스타일 가이드라기보단, 더 위의 레이어라고 생각되는 부분이 몇 개 있는게 특이했습니다. 예를 들어, 하나의 클래스에 여러 역할을 주지 말 것, 같은 것들인데요. 독자 레벨을 신입 개발자로 잡아서 그런건지, 그만큼 강조를 하고 싶은 건지는 판단이 어렵네요. 기회가 되면 다른 회사의 스타일 가이드를 읽어보는 것도 재미있을 것 같습니다.