2010-02-20 2 views
5

그래서 우리는 중복 (DRY) 및 기타 냄새를 줄이고 최대한 코드를 깨끗하게 유지하려고 노력하고 있습니다. Ruby 코드의 경우 냄새를 감지 할 수있는 도구가 많이 있습니다 (예 : 꽤 좋은 Caliber 서비스).Rails/Ruby에서 "코드 중복"냄새를 처리하는 방법

그러나 코드 중복에 대한 정의가 도구와 다른 것으로 보입니다. 이 방법은 루비의 일을하는 방식과 관련이 있습니다. 변수를 직접 액세스하지는 않지만 대신 메서드 호출을 사용하는 방식입니다. 레일 컨트롤러에서이 조각을 고려해

def update_site_settings 
    SiteSettings.site_name = params[:site_name] 
    SiteSettings.site_theme = params[:site_theme] 
    expire_fragment('layout_header') 
    flash[:notice] = t(:Site_settings_updated) 
    redirect_to :controller => 'application', :action => 'edit_site_settings' 
end 

이는 때문에 "PARAMS"방법 두 통화의, 코드 중복 경고를 받았습니다. 그래서 내 질문은, 정말 로컬 변수에 params 할당하는 개선 될 것이라고? 이것이 가장 명확하고 간결한 방법으로 쓰여진 것으로 생각합니다. 그리고 params은 변수이고, 루비에서는 단순한 "비즈니스 비용"이 아닙니다.

나는 이것을 잘못보고 있습니까?

편집 :이 경우 더 좋은 방법은 SiteSettings.update_attributes(params) 스타일 업데이트를하는 것입니다. 당신이 경우 다른 코드에서, 같은 문제를 고려

def update 
    @mailing_list = MailingList.find(params[:id]) 

    if @mailing_list.update_attributes(params[:mailing_list]) 
    flash[:notice] = t:Mailing_list_updated 
    redirect_to(mailing_lists_path) 
    ... 
+1

감사합니다. 나는 "냄새 보고서를 지침으로 사용하고 세세한 부분까지 땀을 흘리지 말라"는 일반적인 대답으로 갈 것입니다. –

답변

1

Feature Envy 코드 냄새의 작은 인스턴스를 선언 할 수도 있지만 실제로는 다소 사소한 것입니다. 컨트롤러 방법은

def update 
    if @mailing_list = MailingList.update_attributes_by_id(params) 
    ... 

class MailingList 
    def self.update_attributes_by_id(params) 
    id = params.delete(:id) 
    find(id).update_attributes(params) 
    ... 

같은 것이

내가 실제 생활에서 방해겠습니까 (때문에 취급에주의 테스트하지)가되도록

아마 메일 링리스트에 수업 방법을 도입 할 수 있을까? 아마도 두 부분으로 된 발견/업데이트 일은 사람들이 즉시 이해할 수있을 것입니다. 위와 같이 코드를 작성하는 누군가는 완벽하게 표현 된 이름을 가지고 있더라도 조금만 멈추고 생각해야합니다.

이러한 분석기 (필자는 Kevin Rutherford의 reek을 자체 코드로 실행 함)는 훌륭하지만 컨텍스트를 이해하지 못하기 때문에 거의 완벽한 정보를 제공하지는 않습니다. 주의를 통해 도움을 얻을 수있는 영역을 식별하는 데 유용하지만 오탐 (false positive)이 많으며 물건을 놓치기 때문에 인식에 익숙해 져야합니다.

3

한 가지 DRY 및 코드 냄새의 개념에 대해 기억하는 것은 그들이 지침는 점이다. 여기에는 나무에 대한 포용력으로 코드를 구성하고 단순화하는 방법을 생각하는 데 도움이됩니다. 이러한 개념을 항상 염두에 두는 것이 좋지만,이 작은 레벨에서 코드 반복을 간과하는 것은 종종 불필요한 복잡성이나 불명료를 코드에 도입하게 만듭니다. 코드의 이해 가능성도 중요해야하며, 가장 명확하고 간결한 코드는 모든 마지막 추적 흔적이 제거 된 코드와 다를 수 있습니다.