2009-07-22 2 views
2

우리는 프로젝트의 일부로 잠시 동안 reek 코드 품질 도구를 실행합니다. 이 도구는 기본적으로 코드 냄새를 찾아보고합니다. 여기서 우리는 params에있는 키에 두 번 이상 액세스하려고 할 때마다 "Duplication"이라는 냄새가 나는 것을 관찰했습니다 (같은 매개 변수로 메서드 호출을 두 번 수행하거나 if 조건을 복제하는 것처럼). 그러나 paramsHash 일뿐입니다. 다른 해시는 키가 두 번 이상 액세스 될 때 중복 된 냄새를 맡지 않습니다.params를 액션의 로컬 변수에 캐시하면 도움이 될까요?

왜 이렇게됩니까? 정확히 params은 무엇입니까? 로컬 변수에 params을 캐시 한 다음 사용하는 것이 합리적입니까? 도움이 될 것인가? 아니면 도구에 문제가 있습니까? 도움!

답변

3

현재 버전에서는 뷰와 컨트롤러에 대해 오 탐지 (false positives)가 발생하기 때문에 app/models 폴더에서만 Reek을 실행하는 것이 가장 좋습니다.

params는 시스템 경계에 가까운 DTO (데이터 전송 개체)의 일종으로, 특성이 일반 코드와 달라야합니다. 하지만 리크는 (아직) 그것을 모릅니다. Reek을 가까운 장래에 개선하여 레일스에서 ​​더 잘 재생할 계획입니다. 현재로서는, 최선의 방법은 앱/모델 (어쩌면 앱/헬퍼 및 lib)을 보는 것으로 제한하는 것입니다.

0

params[:foo]Hash#[]에 대한 메소드 호출이므로 올바른 값입니다. 나는 냄새에 익숙하지 않아 다른 해시 액세스가 왜 똑같이 계산되지 않는지 말할 수 없습니다. Hash#[]은 코드에서 매우 중요한 부분을 차지하지 않는 한 로컬 변수에 저장할 필요가없는 속도를 가져야합니다.

해시와 일반 해시의 유일한 차이점은 with_indifferent_access을 사용한다는 것입니다. 즉, 문자열이나 기호로 모든 키에 액세스 할 수 있습니다.

2

PARAMS는 않는 메소드 호출하는 @params ||= @request.params

그것은 당신이 시도하고 변수에 캐시하고 싶어하므로, 복잡한 방법입니다 PARAMS 생각하는 것이 될 수 있지만, 그 가치가있을 것 같아요 수 (레일스 2.2의 rack_process.rb 기반)

+0

고마워요. 오마르. Kevin이 지적했듯이, params는 DTO의 일종이며 다른 객체와는 다른 Reek은 아직 알지 못합니다. – Chirantan

0

저는 params를 호출 할 때마다 메소드 호출을 생성하는 초기화 단계가 있다고 믿습니다. 매개 변수를 만들고 호출 수를 확인할 수 있다고 가정합니다. 이것은 눈먼 추측 일 수 있습니다. :-)

관련 문제