2012-05-23 3 views
2

나는 루비에서 작업 중이며 일부 작업자의 막대한 작업이 필요합니다. 대부분의 비즈니스 논리는 이러한 작업자에 포함되어 있으며 매우 복잡해졌습니다. 내가 고안 한 기술은 메소드 작성 패턴을 모델링하지만 상태를 유지하기 위해 인스턴스 변수에 크게 의존합니다. 내가 설정 한 방법은 논리적 인 것처럼 보이지만, 이것이 틀린 지 또는 내가 이것을 설정할 수있는 가장 깨끗한 방법이 아닌지에 대한 의견을 커뮤니티로부터 받고 싶다. I 본질적 작업자가 사용하고복잡한 방법을 다루는 객체 지향적 인 방법

는 스위치

def perform(transaction_id, data, account_id) 
    @transaction_id = transaction_id 
    @data   = data 
    @account  = Account.new(account_id) 

    @campaign_tag = nil 
    @match_str  = nil 
    @options  = nil 

    has_starter_tag  || return 
    find_campaign  || return 
    determine_options || return 
    find_active_option || return 
    reservation_over || return 
    already_filled  || return 

    send_to_inventory 
end 

각 방법은 동일한 논리를 다음의 일종 (Sidekiq) 방법을 수행한다. 만족스럽지 않으면 규칙을 검사하고, 조치를 수행하고 (이메일을 보내거나, 무엇이든간에) false를 반환하여 실행을 중지합니다. 만족 스럽다면 거래 완료에 필요한 일부 ivar 데이터를 저장하고 true를 반환하여 다음 단계로 넘어갑니다.

def has_starter_tag 
    result = true 

    @campaign_tag = find_starter_tag(@account, @data[:variable]) 
    if [email protected]_tag 
    result = false 
    send_email_about_badness 
    log_some_stuff 
    end 

    result 
end 

이 코드를 테스트하려면 각 메소드가 의존하는 인스턴스 변수를 스텁 (stub)하십시오. 내 테스트는 인터페이스 대신 구현을 알고 있기 때문에 이것이 코드 냄새라는 것을 알고 있습니다. 즉, 나는이 메소드의 깨끗한 인터페이스가 마음에 들면, 소스를 스캔하여 정확히 무슨 일이 일어나는지 알 수 있다고 생각합니다.

내가 잘못하고 있다면 누군가가 시간을 내서 올바른 방법 (또는 적어도 다른 방법)을 설명해 주시겠습니까? 나는 항상 서로를 기반으로하는 많은 작은 단계를 수행해야하는 객체를 다루는 방법을 파악하는 데 문제가있었습니다.

+0

작업자에서 설정 한 처음 세 개의 인스턴스 변수는 어떻게 사용합니까? '@ campaign','match_str','options'은 무엇을 위해서 사용 되나요? 시작하기 위해, 나는'has_starter_tag'를 만들고 다른 메소드는 그들 각각이 필요로하는 매개 변수를 받아 들일 것이다. 이렇게하면 인스턴스 변수를 사용하지 않고 분리를 테스트 할 수 있습니다. –

+0

예제 메서드를 사용하여 더 나은 예제를 제공합니다. 처음 세 변수는 본질적으로 대부분의 메서드가 데이터에 사용하는 상수입니다. 아마 이것을 지정 했어야하지만 대부분의 작업은 메서드 외부에서 has_starter_tag라는 메서드 내에서 호출됩니다. 그것들은 인스턴스 변수에 접근하지 않고 단위 테스트를 거친다. – rabidpraxis

답변

1

내 직감은 당신이 이것을 다소 과장하려고 시도하고 있다는 것입니다.

당신이 설명하는 것은 디자인 패턴으로 간주되지 않습니다. 단순히 필요한 기능을 여러 가지 별도의 방법으로 분리하는 것입니다. 문제는 메서드가 서로 밀접하게 결합되어있어이를 분리하면 기능을 "그룹화"하는 것 이외의 다른 목적을 달성하지 못한다는 것입니다. 함수가 공통적으로 가지고있는 유일한 것은 그들이 뭔가를 검사하고 수표의 작업을 취소하는 것이 실패한다는 것입니다. 반복 된 기능을 제쳐두고 한 코드에 모든 코드를 넣고 빈 줄을 사용하여 개별 부분을 분리하면 많은 효과를 얻을 수 있습니다.

일부 코드에서 사용할 OOP 솔루션이나 디자인 패턴을 찾는 것이 역효과를 낼 수 있습니다. 하루가 끝날 때 정말로 중요한 것은 이점입니까? 코드를 저장합니까? 코드를 쉽게 유지 보수하고 확장 할 수 있습니까? (코드 은 쉽게 확장 가능해야합니까?이 필요합니까?) OOP를 사용하기 위해 OOP를 사용하려하지 마십시오.

관련 문제