나는 루비에서 작업 중이며 일부 작업자의 막대한 작업이 필요합니다. 대부분의 비즈니스 논리는 이러한 작업자에 포함되어 있으며 매우 복잡해졌습니다. 내가 고안 한 기술은 메소드 작성 패턴을 모델링하지만 상태를 유지하기 위해 인스턴스 변수에 크게 의존합니다. 내가 설정 한 방법은 논리적 인 것처럼 보이지만, 이것이 틀린 지 또는 내가 이것을 설정할 수있는 가장 깨끗한 방법이 아닌지에 대한 의견을 커뮤니티로부터 받고 싶다. 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)하십시오. 내 테스트는 인터페이스 대신 구현을 알고 있기 때문에 이것이 코드 냄새라는 것을 알고 있습니다. 즉, 나는이 메소드의 깨끗한 인터페이스가 마음에 들면, 소스를 스캔하여 정확히 무슨 일이 일어나는지 알 수 있다고 생각합니다.
내가 잘못하고 있다면 누군가가 시간을 내서 올바른 방법 (또는 적어도 다른 방법)을 설명해 주시겠습니까? 나는 항상 서로를 기반으로하는 많은 작은 단계를 수행해야하는 객체를 다루는 방법을 파악하는 데 문제가있었습니다.
작업자에서 설정 한 처음 세 개의 인스턴스 변수는 어떻게 사용합니까? '@ campaign','match_str','options'은 무엇을 위해서 사용 되나요? 시작하기 위해, 나는'has_starter_tag'를 만들고 다른 메소드는 그들 각각이 필요로하는 매개 변수를 받아 들일 것이다. 이렇게하면 인스턴스 변수를 사용하지 않고 분리를 테스트 할 수 있습니다. –
예제 메서드를 사용하여 더 나은 예제를 제공합니다. 처음 세 변수는 본질적으로 대부분의 메서드가 데이터에 사용하는 상수입니다. 아마 이것을 지정 했어야하지만 대부분의 작업은 메서드 외부에서 has_starter_tag라는 메서드 내에서 호출됩니다. 그것들은 인스턴스 변수에 접근하지 않고 단위 테스트를 거친다. – rabidpraxis