우리 회사에서 Clojure에서 거대한 (5 만 줄의 코드) Java 응용 프로그램 (JSP 및 서블릿을 사용하는 웹 응용 프로그램)을 다시 작성하라는 요청을 받았습니다. 내가주의해야 할 사항에 대한 팁을받은 사람이 있습니까?
Java와 Clojure를 모두 잘 알고 있음을 명심하십시오.
최신 정보
재 작성을했고 프로덕션에 들어갔습니다. 재 작성이 너무 빨라서 약 6 주 만에 완료 되었기 때문에 매우 이상합니다. 많은 기능이 여전히 필요하지 않았기 때문에 Clojure의 3000 라인에 가깝습니다.
나는 그들이 시스템에 만족하고 그들이 원하는 것을 정확히 수행한다고 들었습니다. 유일한 단점은 시스템을 유지 관리하는 사람이 Clojure를 처음부터 배워야했고, 그는 차고 비명을 지르며 끌려 갔다는 것입니다. 요 전날 그가 Lisp를 사랑한다고 전화를 받았는데 .. 웃기 네요 🙂
또한 Vaadin에 대해 좋은 언급을해야합니다. Vaadin을 사용하는 것은 Clojure가했던 것처럼 절약 된 시간과 코드의 부족을 설명했을 것입니다. Vaadin은 여전히 제가 사용해 본 최고의 웹 프레임 워크입니다. 비록 지금은 분노 속에서 ClojureScript를 배우고 있습니다! (Vaadin과 ClojureScript는 모두 Google의 GUI 프레임 워크를 사용합니다.)
답변
가장 큰 “번역 문제”는 아마도 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 라인 수를 듣고 매료 될 것입니다.
업데이트 :이 게시물이 원래 작성 되었기 때문에 “반드시 체크 아웃”범주에있는 몇 가지 추가 도구 / 라이브러리가 나타났습니다.
답변
현재 프로젝트에 Java의 어떤 측면이 포함되어 있습니까? 로깅, 데이터베이스 트랜잭션, 선언적 트랜잭션 / EJB, 웹 레이어 (JSP, 서블릿) 등. Clojure 에코 시스템에는 하나의 작업을 수행하는 것을 목표로하는 다양한 마이크로 프레임 워크와 라이브러리가 있으며 잘 수행됩니다. 필요에 따라 라이브러리를 평가하고 (그리고 대규모 프로젝트에서 확장 할 수 있는지 여부) 정보에 입각 한 결정을 내리는 것이 좋습니다. (면책 조항 : 저는 bitumenframework 의 작성자입니다 . ) 또 다른 주목할 점은 빌드 프로세스입니다. 복잡한 설정 (dev, testing, staging, prod)이 필요한 경우 프로젝트를 모듈로 분할하고 빌드 프로세스를 스크립팅해야 할 수 있습니다. 용이함.
답변
가장 어려운 부분은 데이터베이스에 대한 생각이었습니다. 거기에서 사용하려는 올바른 도구를 찾기 위해 몇 가지 테스트를 수행하십시오.