2013-03-20 4 views
5

나는 프로젝트에서 일하고있다. 현재 일부 입력 매개 변수에 따라 변수에 값을 할당하는 매우 큰 조건문이 있습니다. 그래서 나는 이와 같은 것을 가지고있다.조건부 변수 할당 리펙토링

if some condition 
    x = some value 
elsif another condition 
    x = a different value 
    ... 

리팩토링하는 가장 좋은 방법은 무엇입니까? 나는 마치 무언가로 끝날지도 모른다.

x = some value if some condition || another value if another condition 

이런 종류의 패턴이 있는가?

+0

리팩터링 방법을 알려주기 전에 리팩토링하는 이유를 알려 주어야합니다. 어떤 문제를 해결하려고합니까? –

+2

'refactor = nil이 아닌 한? (: unit_tests)' – dbenhur

답변

9

if를 외부에 지정하기 만하면됩니다.

x = if some condition 
    some value 
elsif another condition 
    a different value 

또는 해시를 사용할 수 있습니다.

x = dict[some condition] 
0

이것은 패턴이 아니라 운영자입니다. 여기

If Condition is true ? Then value X : Otherwise value Y 

이 예는 다음과 같습니다 : 당신이 언급하고있는 사람은 삼항 연산자입니다

speed = 90 
speed > 55 ? puts("I can't drive 55!") : puts("I'm a careful driver") 

삼항 문을 사용하여 달콤한, 짧고, 작업을 수행합니다.

+0

조건부가 if보다 길다. –

+0

그런 다음'if/elsif' 문을 사용합니다. 그것들을 사용하는 데는 아무런 문제가 없습니다. – BlackHatSamurai

+0

'puts (속도> 55)? "나는 55 세 운전할 수 없어!" : "나는 조심스럽게 운전 해요." " – ZiggidyCreative

0
x = some condition ? some value : 
    another condition ? a different value : ... 
+1

중첩? 좋은 연습이 아닙니다. –

1

조건문이 변수가 각 조건에서 동일한 경우, 그래서 또한 당신이 할 수있는 첫 번째 것들 중 하나의 표현이다입니다

x = if cond1 
    expr1 
elsif cond2 
    expr2 
.... 
end 

조건의 경우 단일 표현식의 모든 상태이므로 case 문을 사용하여 더 단순하게 만들 수 있습니다.

그러나 다음으로 가장 명백한 다시 고려해야 할 사항은 모든 조건과 표현식을 평가하는 데 필요한 최소한의 데이터를 제공해야하는 방법으로 큰 조건부를 격리시키는 것입니다.

예. 당신은 코드의 명확성과 유연성을 리팩토링하려면

# Where conditional is currently, and x assigned, assuming the conditionals 
# need a couple of variables . . . 
x = foo param1, param2 

# Elsewhere 
private 

def foo p1, p2 
    if cond1 
    expr1 
    elsif cond2 
    expr2 
    .... 
    end 
end 
0

replacing conditional with polymorphism 리팩터링을 고려하십시오.

귀하의 질문에 대한 자세한 내용은 권장 사항과 관련하여 자세히 설명되어 있지 않지만이 리펙토 러는 코드 기반을 변경하기가 훨씬 어려워 질 것입니다. 새로운 요구 사항을 받으면 조건부를 깨뜨리고 수정할 수있는 나쁜 형태입니다 (버그를 도입하는 경향이 있고,하기가 더 어렵습니다). 기존의 코드베이스에 연결할 수있는 새로운 객체를 만드는 것이 바람직합니다. Open/Closed Principle (SOLID 약자의 "O")이 설명하는 유연성.