Java to Clojure 재 작성


97

우리 회사에서 Clojure에서 거대한 (5 만 줄의 코드) Java 응용 프로그램 (JSP 및 서블릿을 사용하는 웹 응용 프로그램)을 다시 작성하라는 요청을 받았습니다. 내가주의해야 할 사항에 대한 팁을받은 사람이 있습니까?

Java와 Clojure를 모두 잘 알고 있음을 명심하십시오.

최신 정보

재 작성을했고 프로덕션에 들어갔습니다. 재 작성이 너무 빨라서 약 6 주 만에 완료 되었기 때문에 매우 이상합니다. 많은 기능이 여전히 필요하지 않았기 때문에 Clojure의 3000 라인에 가깝습니다.

나는 그들이 시스템에 만족하고 그들이 원하는 것을 정확히 수행한다고 들었습니다. 유일한 단점은 시스템을 유지 관리하는 사람이 Clojure를 처음부터 배워야했고, 그는 차고 비명을 지르며 끌려 갔다는 것입니다. 요 전날 그가 Lisp를 사랑한다고 전화를 받았는데 .. 웃기 네요 :)

또한 Vaadin에 대해 좋은 언급을해야합니다. Vaadin을 사용하는 것은 Clojure가했던 것처럼 절약 된 시간과 코드의 부족을 설명했을 것입니다. Vaadin은 여전히 ​​제가 사용해 본 최고의 웹 프레임 워크입니다. 비록 지금은 분노 속에서 ClojureScript를 배우고 있습니다! (Vaadin과 ClojureScript는 모두 Google의 GUI 프레임 워크를 사용합니다.)


55
나는 당신의 회사에서 일하고 싶습니다.
mtyaka 2011 년

4
글쎄, 유럽의 일부 방위 회사는 Clojure를 사용하기 시작했습니다. 하지만 이름이 기억 나지 않습니다. :)
appshare.co 2011 년

1
@Zubair : 50,000 Java LOC는 "큰"근처에 없습니다. 이것은 매우 작은 프로젝트입니다. 여기에 250KLOC ~ 300KLOC Java 프로젝트가 있는데 중간 크기입니다. 기껏해야합니다.
SyntaxT3rr0r 2011 년

5
실제로 코드 크기를 줄이는 것이 재 작성의 목표가 아니라고 코드베이스의 크기를 언급하여 실수를 저질렀을 수 있습니다. 목표는 두 가지입니다. 1) 코드베이스를 더 이해하기 쉽고 코드 유지 비용이 더 저렴합니다. do in Java)
appshare.co 2011 년

1
이봐 요 ...이 오래된 질문을 봤는데 재 작성이 어떻게 진행되는지 궁금 했나요?
levand

답변:


82

가장 큰 "번역 문제"는 아마도 Java / OOP 방법론에서 Clojure / 함수 프로그래밍 패러다임으로 갈 것입니다.

특히, "Clojure 방식"은 객체 내에 변경 가능한 상태를 갖는 대신 변경 가능한 상태를 명확하게 분리하고 순수 (부작용없는) 기능을 개발하는 것입니다. 이 모든 것을 이미 알고있을 것입니다. :-)

어쨌든,이 철학은 문제를 해결하기위한 올바른 도구 세트를 구축하는 데 초기 노력을 집중 한 다음 마지막에 이들을 연결하는 "상향식"개발 스타일로 이어지는 경향이 있습니다. 이것은 다음과 같이 보일 수 있습니다.

  1. 주요 데이터 구조를 식별하고 변경 불가능한 Clojure 맵 또는 레코드 정의로 변환합니다. 많은 불변 맵을 중첩하는 것을 두려워하지 마십시오. Clojure의 지속적인 데이터 구조 덕분에 매우 효율적입니다. 이 비디오를 볼 가치가 있습니다.자세한 내용은 를 있습니다.

  2. 이러한 불변 구조에서 작동하는 순수하고 비즈니스 로직 지향 기능의 작은 라이브러리를 개발하십시오 (예 : "장바구니에 항목 추가"). 나중에 추가하기가 쉽기 때문에이 모든 작업을 한 번에 수행 할 필요는 없지만 테스트를 용이하게하고 데이터 구조가 작동하고 있음을 증명하기 위해 초기에 몇 가지 작업을 수행하는 것이 도움이됩니다. REPL에서 실제로 유용한 내용을 대화식으로 작성할 수 있습니다.

  3. 필요에 따라 데이터베이스 나 네트워크 또는 레거시 Java 코드간에 이러한 구조를 유지할 수있는 데이터 액세스 루틴을 별도로 개발하십시오. 이를 매우 별도로 유지하는 이유는 "비즈니스 논리"기능과 연결된 지속성 논리를 원하지 않기 때문입니다. ClojureQL 을보고 싶을 수도 있습니다. 위해 있지만 원하는 Java 지속성 코드를 래핑하는 것도 매우 쉽습니다.

  4. 위의 모든 사항을 다루는 단위 테스트 (예 : clojure.test 사용 )를 작성 합니다. 이것은 Clojure와 같은 동적 언어에서 특히 중요합니다. a) 정적 유형 검사의 안전망이 많지 않고 b) 너무 많이 빌드하기 전에 하위 수준 구조가 잘 작동하는지 확인하는 데 도움이되기 때문입니다. 그들 위에

  5. Clojure의 참조 유형 (vars, refs, agent 및 atom)을 사용하여 각 부분의 변경 가능한 애플리케이션 수준 상태를 관리하는 방법을 결정합니다. 그들은 모두 비슷한 방식으로 작동하지만 수행하려는 작업에 따라 트랜잭션 / 동시성 의미 체계가 다릅니다. Refs는 아마도 기본 선택이 될 것입니다. (dosync ...) 블록에 코드를 래핑하여 "정상적인"STM 트랜잭션 동작을 구현할 수 있습니다.

  6. 적절한 전체 웹 프레임 워크를 선택하세요. Clojure는 이미 꽤 많은 것을 가지고 있지만 Ring을 강력히 추천 합니다. 템플릿 철학에 따라 Fleet , Enlive 또는 Hiccup 과 함께이 훌륭한 비디오 " One Ring To Bind Them " 을 참조하세요. 그런 다음이를 사용하여 프레젠테이션 레이어를 작성합니다 ( "이 장바구니를 적절한 HTML 조각으로 번역"과 같은 기능 포함).

  7. 마지막으로 위의 도구를 사용하여 애플리케이션을 작성하십시오. 위의 단계를 제대로 수행했다면, 이것은 매우 적은 상용구로 다양한 구성 요소를 적절하게 구성하여 전체 응용 프로그램을 빌드 할 수 있기 때문에 실제로 쉬운 부분이 될 것입니다.

이것은 코드의 종속성 순서를 광범위하게 나타내므로 "상향식"개발 노력에 적합하기 때문에 대략적으로 문제를 공격 할 순서입니다. 물론 민첩한 / 반복적 인 스타일이 좋지만 초기에 시연 가능한 최종 제품으로 이동 한 다음 필요에 따라 기능을 확장하거나 리팩토링하기 위해 이전 단계로 상당히 자주 돌아갈 수 있습니다.

추신 위의 접근 방식을 따르면 50,000 라인의 Java 기능과 일치하는 데 필요한 Clojure 라인 수를 듣고 매료 될 것입니다.

업데이트 :이 게시물이 원래 작성 되었기 때문에 "반드시 체크 아웃"범주에있는 몇 가지 추가 도구 / 라이브러리가 나타났습니다.

  • Noir -Ring 위에 구축되는 웹 프레임 워크입니다.
  • Korma -SQL 데이터베이스에 액세스하기위한 아주 좋은 DSL입니다.

4
Nitpick re : "각 부분 변경 가능한 응용 프로그램 수준 상태를 관리하는 데 사용할 Clojure의 STM 참조 유형을 결정하십시오.": STM 참조 유형은 하나뿐입니다. 다른 IRef는 STM을 포함하지 않습니다. 그렇지 않으면 확실한 조언처럼 보입니다.

음 ... Refs, Agent, Atom을 모두 Clojure STM / 동시성 시스템의 일부로 간주합니다. 예를 들어 그들은 모두 유효성 검사기를 지원하고 에이전트는 트랜잭션 커밋과 조정됩니다. 그러나 나는 당신의 요점을 이해합니다. 심판은 "기본"트랜잭션 모델입니다. 빠른 수정을 할 것입니다.
mikera 2011 년

2
더 많은 +1을 줄 수만 있다면. 당신이 참조한 두 동영상을 모두 봤는데 정말 좋았습니다. 감사.
jdl 2011 년

1
이제 noir는 더 이상 사용되지 않습니다. 누아르 대신 구성에 대해 언급해야한다고 생각합니다.
hsestupin 2013

연결 고리 하나가 끊어졌습니다!
Adam Arold 2014

5

현재 프로젝트에 Java의 어떤 측면이 포함되어 있습니까? 로깅, 데이터베이스 트랜잭션, 선언적 트랜잭션 / EJB, 웹 레이어 (JSP, 서블릿) 등. Clojure 에코 시스템에는 하나의 작업을 수행하는 것을 목표로하는 다양한 마이크로 프레임 워크와 라이브러리가 있으며 잘 수행됩니다. 필요에 따라 라이브러리를 평가하고 (그리고 대규모 프로젝트에서 확장 할 수 있는지 여부) 정보에 입각 한 결정을 내리는 것이 좋습니다. (면책 조항 : 저는 bitumenframework 의 작성자입니다 . ) 또 다른 주목할 점은 빌드 프로세스입니다. 복잡한 설정 (dev, testing, staging, prod)이 필요한 경우 프로젝트를 모듈로 분할하고 빌드 프로세스를 스크립팅해야 할 수 있습니다. 용이함.


서블릿, JSP, 홈 빌드 지속성 프레임 워크 (10 년 전) 및 포조 (EJB 없음)
appshare.co

4
서블릿은 Ring + Compojure IMHO로 쉽게 대체 될 수 있으며 JSP는 아마도 StringTemplate (또는 FreeMarker / Velocity 템플릿)으로 대체 될 수 있습니다. Clojure의 지속성은 Java와 다를 것입니다. 관계형 매핑이 필요한 경우 Clj-Record 및 SQLRat (아직 성숙하지 않음)를 살펴볼 수 있습니다. ClojureQL은 현재 AFAICT에서 MySQL과 PostgreSQL 만 지원합니다. 열 이름에 밑줄을 허용하지 않는 ccsql의 현재 제한은 놀라운 일이 될 수 있습니다. Clojure 목록에서 필요에 따라 개발 측면을 논의하는 것이 유용 할 것이라고 생각합니다. 프로젝트에 행운을 빕니다!
Shantanu Kumar

그 프로젝트 이후로 저는 Clojure와 Clojurescript (nemcv.com)로 다른 애플리케이션을 만들었고 지금 Ring을 사용하고 있으며 ClojureQL을 시도했지만 데이터베이스 액세스를 위해 Korma로 전환했습니다. 당신은 최신의 작업을 볼 수 있습니다 github.com/zubairq/coils
appshare.co

4

가장 어려운 부분은 데이터베이스에 대한 생각이었습니다. 거기에서 사용하려는 올바른 도구를 찾기 위해 몇 가지 테스트를 수행하십시오.


1
글쎄요 저는 데이터 액세스를 위해 clojureql을 시도했지만 모든 객체 기반 인 Java 스타일의 데이터베이스 액세스와는 완전히 다릅니다. Java에 어떤 데이터베이스 액세스를 사용했고 Clojure에서 무엇을 사용 했습니까?
appshare.co 2011 년

1
클로저 데이터 구조의 지속성이 매우 자연 스러웠 기 때문에 우리는 많은 것들을 재고하고 mongodb와 함께하게되었습니다
LenW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.