0

필자는 내 통제를 벗어난 외부 요인에 따라 오류가 발생하기 쉬운 장기 실행 반복적 방법을 사용합니다. 메소드 호출이 성공적으로 완료되면 호출자는 오류 처리 및보고 기능의 일부로 성공적으로 완료된 반복 수를 사용할 수 있도록 호출자의 범위에서 성공적으로 완료된 반복 횟수를 유지하려고합니다. 루비는 엄격하게 (실제로 이것에 대해 논할 필요가 없다) 지나치게 가치가 있기 때문에, 나의 옵션은 카운터 객체 (자신의 객체를 소유하기에는 너무 기본적인 것처럼 보임) 또는 고안된 카운터 배열을 전달하는 것으로 제한되는 것처럼 보입니다.참조로 카운터를 전달하기 위해 선호되는 루비 관용어

counter = [0] 
begin 
    LongRunningStuff.error_prone_iterations(counter) 
    puts "success! completed #{counter[0]} iterations" 
rescue 
    puts "failed! completed #{counter[0]} iterations" 
end 

이것은 최악의 경우에는 기껏해야 어리석은 느낌을줍니다. 루비 같은 것이 더 있단 말인가?

답변

3

모든 객체 인의 루비에 두 개의 규칙 및 개체에 대한 참조와 같은 모든 변수 행위가 있다면. 이것은 약간 이상하게 보일지도 모르지만 실제로는 매우 일관성이 있습니다. 프리미티브와 객체, 참조 및 값을 혼합 한 다른 언어에서는 종종 더 혼란이 있습니다.

본질적인 의미가없는 까다로운 배열 대신 컨텍스트 개체를 만들어 전달해야하는 이유는 무엇입니까? 예 :

context = { 
    counter: 0 
} 

SomeModule.method_call(context) 
puts context[:counter] 

당신은 조금이라도이 정돈하는 OpenStruct 같은 것들을 사용할 수 있습니다 :이 작업을 수행하는

require 'openstruct' 
context = OpenStruct.new(counter: 0) 

SomeModule.method_call(context) 

puts context.counter 

더 많은 "루비"방법은 더 의미 론적 의미를 제공하는 상황에 맞는 클래스를 만드는 것입니다 당신이하고있는 일에 :

이 방법으로 약간의 가벼운 추상화로 레이어를 만들고 코드를 훨씬 쉽게 읽을 수 있습니다. 또한 count!과 같은 메서드를 사용하면 카운터가 증가 된 위치를 추적하는 대신 해당 메서드를 트리거하는 사람을 찾으려면 일부 디버깅 코드를 쉽게 스텁 할 수 있습니다.

+1

CS 관점에서 볼 때, 확실하다면. 이 답변을 정리하기 위해 모든 의견을 철회하고 적절하게 답변을 조정했습니다. – tadman

+0

문맥을 추가하는 데 도움이되는 제안에 감사드립니다. 우정의 정신으로 필자는 참고 문헌/by-value 주석도 삭제했다. 당신이 지적했듯이, 요리사가 요리의 관점에서 자신의 작업에 접근하는 것처럼 "CS 관점에서"작업을 통해 접근합니다. :-) –

관련 문제