2017-04-24 5 views
1

내 앱이 다른 방법으로 전달됩니다 (json_element). 키가 다르거 나 비어있는 경우가 있습니다.ruby를 사용하여 DRY 방식으로 해시 값을 추출합니다.

def act_on_ruby_tag(json_element) 

begin 

    # logger.progname  = __method__ 
    logger.debug    json_element 

    code     = json_element['CODE']['$'] unless json_element['CODE'].nil? 
    predicate    = json_element['PREDICATE']['$'] unless json_element['PREDICATE'].nil? 
    replace    = json_element['REPLACE-KEY']['$'] unless json_element['REPLACE-KEY'].nil? 
    hash     = json_element['HASH']['$'] unless json_element['HASH'].nil? 

내가 값을 하드 코딩 제거하고 싶습니다 어떻게 확신하지 :

그것을 처리하기 위해, 나는 다음과 같은 샘플 코드 추출을 하드 코딩되어있다.

keys = json_element.keys 
keys.each do |k| 
     set_key = k.downcase 
     instance_variable_set("@" + set_key, json_element[k]['$']) unless json_element[k].nil? 
     end 

을 그리고 방법의 나머지 부분에서, 예를 들어 @code를 사용

나는 다음과 같이 그것을 통해 생각하기 시작했다.

나는이 하드 코드 된 코드를 모두 대체 한 다음 메서드로 바꾸려고했습니다.

그러나 이것이 좋은 경로인지는 확실하지 않았습니다.

답변

3

임의 인스턴스 변수를 설정하는 대신 { code: ... }과 같은 방법을 사용하는 방법에서 해시 구조를 반환하는 것이 거의 항상 좋습니다. 일관된 컨테이너로 돌려 보내면 발신자가 올바른 위치로 배달하거나, 나중에 저장하거나, 원하는 것을 골라 내고 나머지는 폐기하는 것이 더 쉽습니다.

작은 작고 가벼운 일련의 작업으로 크고 단조로운 단계를 시도해 보는 것도 좋은 생각입니다.

extract(
    'TEST' => { '$' => 'value' }, 
    'CODE' => { '$' => 'code' }, 
    'NULL' => nil 
) 
# => {"test"=>"value", "code"=>"code"} 

당신이 인스턴스 변수로이 모든 일을 지속 할 경우, 즉 상당히 일반적인 패턴입니다,하지만 :

def extract(json) 
    json.reject do |k, v| 
    v.nil? 
    end.map do |k, v| 
    [ k.downcase, v['$'] ] 
    end.to_h 
end 

그럼 당신이 얻을 :이 쉽게 많이 따라 코드를 만든다 당신이 소비하는 임의의 JSON 문서의 자비가 아닌 예측 가능한 이름을 갖게 될 것입니다.

KEYS = %w[ CODE PREDICATE ... ] 

그럼 대신에를 사용하거나 한 단계 더 나아가, 당신은 읽기의 수 구성의 YAML 또는 JSON 파일에 그 정의 :

대안은 하드 코드에 일정한 같은에서 키입니다 목적. 이러한 변화의 빈도와 입력의 불규칙성에 대한 어떤 기대감에 달려 있습니다.

+0

감사합니다 ... 나는 "코브라브 스 몽구스 젬"을 실제로 사용하는 예술품임을 깨달았습니다.하지만 ... 진짜 문제는 당신이 논의하고있는 것입니다. 열쇠를 빼고 확인하는 것입니다. 오류가없는 값이 있거나없는 경우. 때때로 키 중 하나에 값이 없습니다. 비어 있습니다. 그것이 내가 'nil?'수표를 가지고있는 이유입니다. – Angela

+0

빈과'nil? '은 다른 두 가지입니다. 단지 명심하십시오. 네가 탐색 할 수있는 것을 찾고 있다면, v 대 테스트만으로 충분하다. 최소 코드는 일반적으로 디버그하기가 쉽습니다. 이러한 경우에 – tadman

0

원래 코드의 기능을 약간 간결하게 할 수 있습니다.

code, predicate, replace, hash = json_element.values_at *%w{ 
    CODE PREDICATE REPLACE-KEY HASH 
}.map { |x| x.fetch("$", nil) if x } 
+0

키가 '코드, 술어, 대체 ... 등'이라는 사실을 알아야 할 필요가 있습니다. 이러한 변경은 매번 바뀝니다 ... 미리 시간을 알고 도움이되는지 생각해보십시오. .... – Angela

+0

이걸 어떻게 해석 할 수 있습니까?'$ '이슈없이 이걸 만들 수 있습니다. – Angela

+0

이것은 메타 프로그래밍을 사용하지 않고 4 개의 특정 키를 최상위 변수로 추출하는 방법입니다. 루비에서는 종종 같은 일을하는 여러 가지 방법이 있습니다. –