2017-03-09 7 views
1

필자는 종종 자신이 네임 스페이스 외부에서 사용할 def 또는 defn을 통해 만든 하나의 var 만 포함하는 클로저 스크립트에 네임 스페이스를 정의하는 것을 발견합니다.clojure/clojurescript의 단일 var 네임 스페이스에 대한 명명 규칙은 무엇입니까?

을 사용할 때 특히 많이 사용되는데, 여기서 구성 요소를 별도의 파일/네임 스페이스로 정의하고 이러한 단일 구성 요소를 네임 스페이스 외부에서만 사용합니다.

(ns project.components.component-name) 
(defn component-name ...) 

그래서 나는 그들에게이 방법을 가져온 네임 스페이스와 구성 요소 모두에 사용할 하나의 이름이있는 한 나는 그것이 매우 반복적이고 명확하지 :

project.components.component-name :as [component-name] 

component-name/component-name 

또는 열등가 : 참조 (덜 분명하기 때문에

012 : 그 VAR는 다른 네임 스페이스에서의) 나는 ECMAScript를이 유용한 패턴이 있다는 것을 알고

project.components.component-name :refer [component-name] 

component-name 

export default function() { ... }; 

Clojure에는 이와 비슷한 것이 있습니까? 아니면 이것에 대한 몇 가지 규정이 있습니까?

아래는 최근에 사용하기 시작한 컨벤션입니다.

(ns project.components.component-name) 
(defn _ ...) 

project.components.component-name :as [component-name] 

그리고 그래서 당신은 함수 이름으로 _의 사용을 피하기 제안 강하게 것 일반적으로는 Clojure의에 신경 쓰지 않는 값에 사용되는

component-name/_ 

답변

1

밑줄로 사용합니다. 예를 들어, 당신은 종종이 같은 야생에서 코드를 볼 수 있습니다 :

;; Maybe when destructuring a let. Kinda contrived example. 
(let [[a _ _ d] (list 1 2 3 4)] 
    (+ a d 10)) 

;; Quite often in a protocol implementation where we don't care about 'this'. 
(defrecord Foo [] 
    SomeProtocol 
    (thing [_ x] 
    (inc x))) 

기능의 합리적인 덩어리가있을 때 내가 아마 단지 네임 스페이스를 소개 것이지만 네임 스페이스에서 하나의 VAR을 가지고 아무 문제가 없습니다. my-app.components과 같은 네임 스페이스를 시도해 볼 수 있습니다. 네임 스페이스는 전용 공간을 확보하기에 충분할 때까지 모든 작은 비트를 유지합니다. 이의 라인을 따라 뭔가 :

(ns my-app.components 
    ;; The profile stuff is really big lets say. 
    (:require [my-app.components.profile :as profile])) 

(defn- items->ul 
    [items] 
    [:ul (map #(vector :li (:text %)) items)]) 

(defn- render-nav 
    [state] 
    [:nav (-> state deref :nav-items items->ul)]) 

(defn- render-footer 
    [state] 
    [:footer (-> state deref :footer-items items->ul)]) 

(defn render-layout 
    [state] 
    [:html 
    [:head [:title (:title @state)]] 
    [:body 
    [:main 
    (render-nav state) 
    (profile/render-profile (-> state deref :current-user)) 
    (render-footer state)]]]) 
1

나는 네임 스페이스 당 하나 개의 구성 요소가 가장 좋은 방법입니다 확실하지 않다. 결과적으로 많은 수의 네임 스페이스와 상당한 반복에서 이 발생합니다. 그러나 이것은 clojure이며 모두 다른 스타일을 가지고 있습니다. 내 접근 방식은 기능을 따라 것들을 나누기 위해 네임 스페이스를 사용하는 것입니다. 가장 간단한 것만 다를 뿐이지 만 구성 요소는 다른 구성 요소도 다른 구성 요소를 사용하지 않는 경우가 매우 다양하다는 것을 알고 있습니다. 특정 기능에서 사용되는 모든 구성 요소를 함께 그룹화하는 경향이 있으며 대부분의 다른 구성 요소에 사용되는 다양한 하위 구성 요소에는/유틸리티/또는/base/네임 스페이스가 있습니다. 예를 들어, 내가 는이 네임 스페이스의 각에서

project --| 
      src --| 
       my-app --| 
         core.cljs 
         interface --| 
            base.cljs 
            navbar.cljs 
            sidebar.cljs 
            tabber.cljs 

뭔가를해야 할 수도 있습니다, 여러 구성 요소가있을 수 있습니다. 그들 중 일부는 을 해당 네임 스페이스에 대해 비공개로 정의 할 수 있으며 나머지는 코어 구성 요소 인 이 core.cljs에서 참조하는 엔트리 구성 요소입니다.네임 스페이스가 섹션을 필요로하지 않는다는 사실을 발견했습니다. 크거나 반복적이어서 다른 파일에서 점프 할 필요가 없습니다. YMMV.