그래서, 나는 더 깊은 곳에서 다이빙을하고 있습니다. Clojure.Spec.Clojure의 스펙을 어디에 넣을 것인가?
내가 우연히 발견 한 한 가지는 인 입니다. 주요 네임 스페이스에 요구됩니다 하나 개의 큰 spec.clj
파일이, 내가 온라인을 발견,
글로벌 규격은 대부분의 예에서
파일 : 나는 세 가지 옵션을 참조하십시오. 모든 "데이터 유형"및 기능에 대해 모두 (s/def)
및 (s/fdef)
입니다. 프로
:
- 이 파일은 클 수는
- 단일 Responsibliy 원리을 위반 :
- 하나의 파일이 그들에게 모든
콘트라을 지배하는? 생산 네임 스페이스
에서
사양 당신은 넣을 수있는 당신의 (s/def)
및 (s/fdef)
바로 옆에 생산 코드. 따라서 구현과 사양이 동일한 네임 스페이스에 공존합니다.
프로 : 구현 및 사양의
- 코 로케이션
- 네임 스페이스 - 하나 우려?
콘트라 :
- 생산 코드가 지저분
- 네임 스페이스 얻을 수 -이 문제를?
가 그런 생각 전용 사양 공간 구조, 어쩌면 사양 (다음 생산 및 테스트에 대한) 코드의 세 번째 종류입니다.그래서 어쩌면 그들은이 같은 네임 스페이스의 자신의 구조를받을 자격 :
├─ src
│ └─ package
│ ├─ a.clj
│ └─ b.clj
├─ test
│ └─ package
│ ├─ a_test.clj
│ └─ b_test.clj
└─ spec
└─ package
├─ a_spec.clj
└─ b_spec.clj
프로 :
-
사양에 대한
- 전용 (하지만 관련) 네임 스페이스
콘트라 :
- 올바른 네임 스페이스를 소스로 지정해야합니다.
접근 방법 중 하나를 경험 한 사람은 누구입니까?
다른 옵션이 있습니까?
다양한 옵션에 대해 어떻게 생각하십니까?
[별도의 네임 스페이스에있을 때 구조 변경에 대한 사양 사용에 대한 귀하의 조언은 무엇입니까?] (http://stackoverflow.com/q/38024650/5044950)? –
@levand Sam Estep은 자신의 ns가 필요하다면 스펙 ns를 요구할 수 없기 때문에 구문 분석에 사용하기 위해로드되는 스펙에 의존 할 수 없다는 점에서 좋은 지적입니다. 그러므로 ns가없는'(load "my/app/foo_specs")/(in-ns 'my.app.foo) ('[clojure.spec : as s] '가 필요합니다)가 바람직한 패턴 일 것입니다. 가독성을 위해 별도의 파일에 사양을 넣으십시오. –
좋은 지적입니다 ... 구현 네임 스페이스가 스펙 네임 스페이스에 종속되기를 원하는 상황이 있습니다. 이는 스펙 ns *가 impl ns에 종속 될 수 없음을 의미합니다. 현재이 문제를 해결할 좋은 방법이 없습니다. 사양에 정규화 된 네임 스페이스 이름을 입력하는 것이 가장 좋습니다. 다행히도 아직로드/필요하지 않은 네임 스페이스를 별칭으로 지정할 수있는 몇 가지 변경 사항이 있으므로이 문제를 깔끔하게 해결해야합니다. – levand