가장 큰 "번역 문제"는 아마도 Java / OOP 방법론에서 Clojure / 함수 프로그래밍 패러다임으로 갈 것입니다.
특히, "Clojure 방식"은 객체 내에 변경 가능한 상태를 갖는 대신 변경 가능한 상태를 명확하게 분리하고 순수 (부작용없는) 기능을 개발하는 것입니다. 이 모든 것을 이미 알고있을 것입니다. :-)
어쨌든,이 철학은 문제를 해결하기위한 올바른 도구 세트를 구축하는 데 초기 노력을 집중 한 다음 마지막에 이들을 연결하는 "상향식"개발 스타일로 이어지는 경향이 있습니다. 이것은 다음과 같이 보일 수 있습니다.
주요 데이터 구조를 식별하고 변경 불가능한 Clojure 맵 또는 레코드 정의로 변환합니다. 많은 불변 맵을 중첩하는 것을 두려워하지 마십시오. Clojure의 지속적인 데이터 구조 덕분에 매우 효율적입니다. 이 비디오를 볼 가치가 있습니다.자세한 내용은 를 있습니다.
이러한 불변 구조에서 작동하는 순수하고 비즈니스 로직 지향 기능의 작은 라이브러리를 개발하십시오 (예 : "장바구니에 항목 추가"). 나중에 추가하기가 쉽기 때문에이 모든 작업을 한 번에 수행 할 필요는 없지만 테스트를 용이하게하고 데이터 구조가 작동하고 있음을 증명하기 위해 초기에 몇 가지 작업을 수행하는 것이 도움이됩니다. REPL에서 실제로 유용한 내용을 대화식으로 작성할 수 있습니다.
필요에 따라 데이터베이스 나 네트워크 또는 레거시 Java 코드간에 이러한 구조를 유지할 수있는 데이터 액세스 루틴을 별도로 개발하십시오. 이를 매우 별도로 유지하는 이유는 "비즈니스 논리"기능과 연결된 지속성 논리를 원하지 않기 때문입니다. ClojureQL 을보고 싶을 수도 있습니다. 위해 있지만 원하는 Java 지속성 코드를 래핑하는 것도 매우 쉽습니다.
위의 모든 사항을 다루는 단위 테스트 (예 : clojure.test 사용 )를 작성 합니다. 이것은 Clojure와 같은 동적 언어에서 특히 중요합니다. a) 정적 유형 검사의 안전망이 많지 않고 b) 너무 많이 빌드하기 전에 하위 수준 구조가 잘 작동하는지 확인하는 데 도움이되기 때문입니다. 그들 위에
Clojure의 참조 유형 (vars, refs, agent 및 atom)을 사용하여 각 부분의 변경 가능한 애플리케이션 수준 상태를 관리하는 방법을 결정합니다. 그들은 모두 비슷한 방식으로 작동하지만 수행하려는 작업에 따라 트랜잭션 / 동시성 의미 체계가 다릅니다. Refs는 아마도 기본 선택이 될 것입니다. (dosync ...) 블록에 코드를 래핑하여 "정상적인"STM 트랜잭션 동작을 구현할 수 있습니다.
적절한 전체 웹 프레임 워크를 선택하세요. Clojure는 이미 꽤 많은 것을 가지고 있지만 Ring을 강력히 추천 합니다. 템플릿 철학에 따라 Fleet , Enlive 또는 Hiccup 과 함께이 훌륭한 비디오 " One Ring To Bind Them " 을 참조하세요. 그런 다음이를 사용하여 프레젠테이션 레이어를 작성합니다 ( "이 장바구니를 적절한 HTML 조각으로 번역"과 같은 기능 포함).
마지막으로 위의 도구를 사용하여 애플리케이션을 작성하십시오. 위의 단계를 제대로 수행했다면, 이것은 매우 적은 상용구로 다양한 구성 요소를 적절하게 구성하여 전체 응용 프로그램을 빌드 할 수 있기 때문에 실제로 쉬운 부분이 될 것입니다.
이것은 코드의 종속성 순서를 광범위하게 나타내므로 "상향식"개발 노력에 적합하기 때문에 대략적으로 문제를 공격 할 순서입니다. 물론 민첩한 / 반복적 인 스타일이 좋지만 초기에 시연 가능한 최종 제품으로 이동 한 다음 필요에 따라 기능을 확장하거나 리팩토링하기 위해 이전 단계로 상당히 자주 돌아갈 수 있습니다.
추신 위의 접근 방식을 따르면 50,000 라인의 Java 기능과 일치하는 데 필요한 Clojure 라인 수를 듣고 매료 될 것입니다.
업데이트 :이 게시물이 원래 작성 되었기 때문에 "반드시 체크 아웃"범주에있는 몇 가지 추가 도구 / 라이브러리가 나타났습니다.
- Noir -Ring 위에 구축되는 웹 프레임 워크입니다.
- Korma -SQL 데이터베이스에 액세스하기위한 아주 좋은 DSL입니다.