2017-11-16 6 views
0

컨트롤러에 다음 방법이 있습니다. lint을 실행하면 오류가 발생합니다. Cyclomatic complexity for some_method is too highsome_method에 대한 순환 복잡도가 너무 높습니다.

나는 온라인을 통해 방법을 쓴 것처럼 보입니다. 어떻게하면 lint 오류가 발생하지 않도록이 메서드를 다시 작성할 수 있습니까?

def customer_order 
    if params[:customer_id].present? && !params[:order_id].present? 
     render_error :not_found, 'No info found for given customer id' \ 
     unless @info.customer_id == params[:customer_id] 
    elsif params[:order_id].present? && !params[:customer_id].present? 
     render_error :not_found, 'No info found for given order id' \ 
     unless @info.order_id == params[:order_id] 
    elsif params[:customer_id].present? && params[:order_id].present? 
     render_error :not_found, 'No info found for given customer id and order id’ \ 
     unless @info.customer_id == params[:customer_id] && 
       @info.order_id == params[:order_id] 
    end 
    end 
+0

! params [: customer_id] .present? params [: customer_id] .blank로 읽기가 쉽습니다. – s1mpl3

답변

1

Yikes! 너무 높습니다!

이 linting 메시지는 본질적으로 개발자가 직선으로 유지하기가 어렵다는 것을 의미하는 많은 수의 if을 가지고 있음을 의미합니다.

if 문 내용을 자체 방법으로 리팩터링하는 것이 좋습니다.

def customer_order 
    if params[:customer_id].present? && !params[:order_id].present? 
    no_order_error 
    elsif params[:order_id].present? && !params[:customer_id].present? 
    no_info_error 
    ... 
end 

def no_order_error 
    return if @info.customer_id == params[:customer_id] 
    render_error :not_found, 'No info found for given customer id' 
end 

def no_info_error 
    ... 
end 
0

하나의 접근법은 각각의 조건부를 고유 한 방법으로 만드는 것입니다. 예를 들면 다음과 같습니다.

def customer_without_order(params) 
    params[:customer_id].present? && !params[:order_id].present? 
end 

오류를 렌더링 할 때를 결정하는 조건은이 처리를 보증합니다.

0

이렇게 중복성을 줄일 수 있습니다.

def customer_order 
    msg = case [params[:customer_id].present?, params[:order_id].present?] 
    when [true, false] 
    @info.customer_id == params[:customer_id] ? 
     nil : 'No info found for given customer id' 
    when [false, true] 
    @info.order_id == params[:order_id] ? 
     nil : 'No info found for given order id' 
    when [true, true] 
    @info.customer_id == params[:customer_id] && @info.order_id == params[:order_id] ? 
     nil : 'No info found for given customer id and order id’ 
    else 
    nil 
    end 
    render_error(:not_found, msg) if msg 
end