2013-04-08 2 views
4

나는 클로저에 모듈러 애플리케이션을 만들려고한다.Clojure 모듈 종속성

우리는 데이터베이스 모듈과 기사 모듈 (블로그 용 기사를 저장하는 것)과 같은 두 가지 모듈로 구성된 블로그 엔진이 있다고 가정 해 보겠습니다. 모든 구성 매개 변수가 포함되어 있습니다.

그래서 기사 모듈은 저장소에 달려 있으며 기사 모듈과 데이터베이스 모듈의 두 인스턴스 (매개 변수가 다름)를 사용하면 서로 다른 두 개의 데이터베이스에서 서로 다른 두 개의 블로그를 호스팅 할 수 있습니다.

초기화 된 각 모듈에 대한 새로운 네임 스페이스를 직접 작성하고 부분적으로 적용된 매개 변수를 사용하여이 네임 스페이스의 함수를 정의하려고했습니다. 하지만이 접근법은 일종의 해킹이라고 생각합니다.

어떻게해야할까요?

답변

2

'모듈'은 Steve Yegge의 'Kingdom of Nouns'에서와 같이 명사입니다.

추상화의 최상위 레벨을 제외하고 가능한 한 매개 변수 (동사)의 부작용이 없거나 순수한 함수에 집착하십시오. 원하는 기능을 정리할 수 있습니다. 최상위 레벨에서 일부 애플리케이션 상태를 관리 할 수있는 많은 방법이 있지만 가장 많이 사용하는 방법은 클로저 프로토콜 하에서 이러한 최상위 서비스를 숨긴 다음 클로저 레코드에 구현하는 것입니다. 데이터베이스 연결에 대한 참조 또는 일부 등).

이 접근법은 융통성을 최대화하고 사용자가 구석에 글을 쓸 수 없게합니다. 자바의 의존성 주입과 유사합니다. Stuart Sierra는 최근 Clojure/West 2013에서 이러한 주제에 대해 좋은 발언을했지만 비디오는 아직 제공되지 않습니다.

접근 방식과의 차이점에 유의하십시오. 라이프 사이클에서 오브젝트의 관리 및 분석을 분리해야합니다. 이들을 네임 스페이스에 연결하는 것은 액세스가 빠르지 만 코드를 사용하는 클라이언트로 작성한 모든 함수가 현재 전역 상태에 액세스하고 있음을 의미합니다. 프로토콜을 사용하면 전역 인터페이스의 구현 세부 사항을 액세스 인터페이스와 분리 할 수 ​​있습니다.

왜 이것이 유용한 지에 대한 동기 부여의 예가 필요한 경우 전 세계적으로 액세스 할 수있는 서비스에 대한 모든 액세스를 가로채는 방법을 고려해보십시오. 글쎄, 전체 구현을 밀어 넣고 엔트리 포인트를 래퍼 함수로 만들면 관련 세부 정보를 클라이언트 코드에 가깝게 푸시 할 수 있습니다. 코드의 일부 클라이언트에 대해 일부 동작을 원한다면 어떻게 할 수 있습니까? 이제 너는 붙어있다. 이것은 피할 수없는 상반 관계를 선제 적으로 생각하고 인생을 더 쉽게 만들어주기를 기대하는 것입니다.