3

많은 프로토콜 대 multimethods 비교가 있지만 더 높은 순서 함수를 사용하지 않는 이유는 무엇입니까? 예를 들어 보겠습니다. 데이터가 있습니다 (예 : 레코드). 그리고 우리는 을 직렬화하여을 직렬화합니다. 파일, json 및 데이터베이스에 저장하려고한다고 가정 해보십시오. 우리는 프로토콜이 SerializationMethod데이터베이스라는 기록, JSON, 파일을 구현라는 만들어야합니까? 그것은 프로토콜을 사용하기 위해서만 레코드를 만드는 해킹 같은 것 같습니다. 두 번째 해결책 - 다중 메소드 - 직렬화 출력으로 문자열 매개 변수를 취하여이를 수행하는 방법을 결정할 수 있습니다. 하지만 그게 올바른 방향인지 확신 할 수 없습니다. 세 번째 방법은 을 작성하여을 직렬화 한 다음 데이터와 직렬화 함수를 전달합니다. 하지만 지금은 직렬화와 같은 이름 (예 : FO JSON)과 방법을 역 직렬화 이름을 수 없습니다 어떻게 I (또는 어떻게해야) 이렇게Clojure : 프로토콜과 vs 프로토콜의 상위 순서 함수

(defn serialize [method data] 
    (method data)) 

(defn json[data] 
    (...)) 

질문입니다. 더 높은 차수 기능을 가진 일반적인 방법이 있습니까? 아니면 뭔가 잘 이해하지 못했을까요? 그건 내 첫 clojure 단계이므로 용납하시기 바랍니다.

답변

2

JSON으로 변환하는 것이 데이터베이스 또는 파일에 쓰기 작업과 다른 점은 후자가 IO 작업이므로 첫 번째 작업은 데이터를 순수하게 변환하는 것입니다. 이를 염두에두고 같은 인터페이스에서 구현하는 것을 권장하지 않습니다.

다양한 직렬화 구현이 있다고 가정하고 json과 fressian을 말하면, (디 - /) 직렬화하려는 모든 데이터 구조에 구현하는 것이 좋지 않을 것입니다. 그건 해킹이 될 것이라는 당신의 관찰이 맞습니다. 좀 더 간결하게 말하자면 레코드가 하나의 구현으로만 직렬화 (de-/)되도록 제한하는 것입니다.

대신, 각각 동일한 인터페이스를 구현, 다른 직렬 변환기를하는 것이 더 효과적 일 것입니다 :

(defrecord JSONSerializer [] 
    SerializationMethod 
    (serialize [this data] ...) 
    (deserialize [this data] ...)) 

(defrecord FressianSerializer [] 
    SerializationMethod 
    ...) 

우리가 하나를 요구하는 기능에 전달 될 수있는 몇 가지 시리얼 객체를 가진 결국이 방법. 이러한 기능은 구현에 신경 쓸 필요가 없습니다.

더 높은 순서의 함수가 대신 전달 될 수 있습니까?

(defn do-something 
    [params serialize deserialize] 
    ...) 

도 마찬가지입니다. 그러나이 스타일은 빠르게 성장할 수 있습니다. E. g. 한 형식의 데이터를 deserialize하고 다른 형식으로 serialize하는 함수를 작성해야하는 시나리오를 생각해보십시오.

+0

데이터베이스/파일에 대한 차별 json 및 writting에 대해서는 전적으로 동의합니다. 그러나 레코드가있는 솔루션은 필드가없는 레코드를 만드는 것입니다. 이는 저에게 해킹입니다. 그리고 데이터를 직렬화하고자 할 때마다 레코드의 인스턴스 (.serialize -> JSONSerializer 데이터)를 만들어야합니다. HOF에 관해서 내가 의미하는 바는 : (JsonSerialization 데이터를 직렬화). deserialization의 serialization : (FransianSerialization을 직렬화 (JsonDeserialization 데이터를 deserialize)) 또는 arrow makro를 사용합니다. – ravenwing

+0

예를 들어 필드를 두었습니다. e가 들어있는 필드가있는 좋은 이유가 있습니다. 지. 구성 매개 변수. SerializationMethod 프로토콜의 메소드를 호출 할 때마다 JSONSerializer를 작성할 필요가 없습니다.올바르게 구현 된 경우 다른 스레드에서 스레드를 안전하게 구현하면 한 레코드의 메서드를 여러 번 호출 할 수 있습니다. 주석의 HOF 예제에는 전달 된 함수 (???)가 포함되지 않습니다. –

+0

JsonSerialization도 FressianSerialization의 함수입니다. 하지만 지금은 솔루션이 얼마나 어리석은지 알 수 있습니다. 솔루션을 호출하는 것도 가치가 없습니다. – ravenwing