2014-06-24 4 views
3

잠시 전에 나는 simple polymorphic schemas에 대해 물었습니다. 그 대답은 한동안 잘 수행되었습니다.프리즘 스키마를 사용하여 여러 다형성 값 확인

이제 유효성을 검사하려는지도에는 다른 키의 값에 따라 추가 값이 있습니다.

객체의 인위적인 예 : 여기

{:type  :foo   {:type  :bert  {:type  :foo 
:foo-param :bar   :bert-size :medium  :foo-param :bar 
:method :baz   :method :baz   :method :bang 
:baz-rate :max}   :baz-rate :max}   :bangness :considerable} 

판별 자의 유효 블링 키 및 값 자체의 세트를 각각 갖는 :type:method이다.

는 이전에만 :type가 존재하고,이 일을 다음

(def ^:private test-base-schema {:type (s/enum :foo :abc :banana)}) 

(def test-schema 
    (s/conditional #(= (:type %) :foo) 
       (merge test-base-schema {:foo-param s/Keyword}) 
       ; other conditions here 
       )) 

을 그러나 지금은 하나 이상의 판별이 있다는 것을, 조건 분기의 수를 조합 할 것이다.

하나의 옵션은 s/both을 사용하여 {s/Any s/Any}을 허용하지만 예기치 않은 키/값이 유효하지 않은 것으로 간주되므로 스키마가 '느슨하게'허용 할 수 없습니다.

또한이 라이브러리를 사용하여 유효성 검사를 허용하기 위해 유효성 검사중인 맵의 구조를 변경하고 싶지 않습니다.

여러 조건부 하위 스키마가있는지도의 엄격한 유효성 검사를 수행하는 훌륭한 방법이 있습니까?

답변

6

snarky 대답은이 데이터 모델이 이상적이지 않은 냄새가 될 수 있다는 것입니다, 당신은

{:type-info {:type :foo :foo-param :bar} 
:method-info {:method :baz :baz-rate :max}} 

A (아마도) 더 도움이 답이 있다는 것입니다 같은 중첩 구조를 가지고 그것을 리팩토링 고려해야한다 유효성 검사를 위해 사용자 지정 조건부를 작성하는 것 외에도 즉시 사용할 수있는 스키마 세트로는 이것이 쉽지 않다고 생각합니다.

바람직하지 않은 경우 새 스키마 유형을 도입해야합니다. 다행히도 이것은 사용자 코드 (또는 제 3 자 라이브러리)에서 쉽게 수행 할 수 있습니다. 불행하게도이 두 개념 (엄격한 통합 및 조건부지도 구조)을 선명하고 직교하는 방식으로 표현할 수있는 쉬운 방법은 없습니다 (단일 조건부 결합 스키마로 결합하지 않거나 조건부 인식을 사용하지 않음). 나는 방법이 있다고 생각하지만, 처음에는 나에게 분명하지 않다.