Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

견고성 원칙으로 루비 코드 단순화

저는 원래 제가 가장 좋아하는 Ruby 책 중 하나인 Confident Ruby에서 이러한 아이디어를 많이 배웠습니다. 이 게시물이 마음에 들면 구매하여 전체를 읽어야 합니다. 그렇습니다 좋은 자료가 많이 있습니다.

귀하의 current_user 메소드는 User를 반환합니다. , 사용자가 없고 nil을 반환하는 경우를 제외하고. search 메소드는 Array을 반환합니다. 결과가 하나뿐인 경우를 제외하고 대신 해당 결과만 반환합니다. 합리적인 것 같죠? 어쩌면 편리할 수도 있습니다!

하지만 머지 않아 이러한 결정으로 인해 코드가 산더미처럼 쌓이게 될 것입니다. 아마도 if kind_of? 도처에 뿌렸다. 또는 모든 곳에서 nil을 확인해야 한다고 느낄 수도 있습니다. 또는 더 나쁜 경우, NoMethodError 새 기능을 출시할 때마다 표시되기 시작합니다. 또 다른 핫픽스를 할 때가 된 것 같아요!

하지만 이를 방지할 수 있는 방법이 있으며 약간의 주의가 필요합니다.

강건성 원칙

컴퓨팅에는 다음과 같은 원칙이 있습니다.

<블록 인용>

당신이 하는 일은 보수적이고, 다른 사람들로부터 받아들일 때는 자유로워야 합니다.

이 원칙을 Ruby 메서드에 적용할 수 있습니다. 작성하는 메소드는 합리적인 입력을 받아들여야 하고 일관된 출력을 반환해야 합니다.

마지막 부분에 집중하기:누군가 당신이 작성한 메소드를 호출할 때, 그들은 그 메소드가 무엇을 반환할지 정확히 알고 있어야 합니다.

출력에 대해 신중을 기하세요

Rails 2.1의 ActiveRecord::Errors#on 구현을 살펴보세요. :

# File activerecord/lib/active_record/validations.rb, line 212
def on(attribute)
  attribute = attribute.to_s
  return nil unless @errors.has_key?(attribute)
  errors = @errors[attribute].map(&:to_s)
  errors.size == 1 ? errors.first : errors
end

호출되면 Array String의 s, String , 또는 nil . 어떤 유형의 객체를 처리하는지 파악하는 것은 호출자에게 달려 있습니다. 잘못된 생각입니다.

  • 호출자는 눈에 띄는 유형 검사로 자신의 코드를 엉망으로 만들어야 합니다.

  • 발신자는 많이 알아야 합니다. 호출하는 메서드에 대해 최소한 메서드가 반환할 수 있는 모든 유형의 개체와 각 유형이 반환될 수 있는 시기를 알아야 합니다.

  • 테스트할 엣지 케이스가 더 있습니다. 코드가 제대로 작동하는지 확인하려면 세 가지 시나리오를 모두 시도해야 합니다.

방법은 반환되는 내용에 대해 일관성이 있어야 합니다. 일반적으로 Array를 반환하는 경우 , 해야 할 일을 항상 Array 반환 . 일반적으로 User를 반환하는 경우 , 그러나 때때로 nil을 반환하면 Null User 개체를 만들고 그것을 반환할 수 있습니다. nil 대신에.

덜 엄격할 수도 있습니다. "Taggable 기준 치수". 더 일반적으로 사용할 수 있습니다. "idname 속성." 중요한 것은 일관성을 유지하고 발신자가 무엇을 기대하는지 확인하는 것입니다.

jQuery는 흥미로운 예입니다. 대부분의 jQuery 메서드는 동일한 종류의 Array를 반환합니다. -같은 물건. 이 때문에 jQuery의 메서드는 믿을 수 없을 정도로 구성이 가능하고 한 줄의 코드로 엄청난 양의 작업을 수행할 수 있습니다.

그리고 궁금하신 점을 대비하여 Rails는 이후 버전에서 해당 방법을 수정했습니다.

# File activemodel/lib/active_model/errors.rb, line 133
def [](attribute)
  get(attribute.to_sym) || set(attribute.to_sym, [])
end

이제 항상 Array를 반환합니다. . 그들에게는 더 간단하고 우리에게도 더 간단합니다.

불일치 제거

다음에 "An Array 또는 nil ", Array을 반환하면 됩니다. . 코드베이스를 살펴보고 kind_of?를 사용 중인 위치를 확인하세요. 및 respond_to? . 단일 유형을 반환하도록 해당 코드에서 호출한 메서드를 리팩토링할 수 있는지 확인하세요.

그리고 반환 값에 대해 할 수 있는 가정이 프로젝트 전체에 파급되고 주변의 모든 코드를 단순화하는 것을 지켜보십시오.