Java에서 Clojure로 리라이트
회사로부터 Clojure의 Java 어플리케이션(JSP와 servlet을 사용한 웹 앱)을 재작성해 달라는 요청을 받았습니다.내가 조심해야 할 것에 대한 팁을 아는 사람이 있나요?
저는 Java와 Clojure를 잘 알고 있습니다.
갱신하다
다시 썼더니 생산에 들어갔어요.개서가 6주 정도 만에 끝날 정도로 빨리 끝나 버려서 매우 이상합니다.많은 기능이 필요하지 않았기 때문에 Clojure는 3000 라인 정도 되었습니다.
나는 그들이 원하던 바로 그 시스템과 그것이 하는 것에 만족한다고 들었다.유일한 단점은 시스템을 유지하는 사람이 처음부터 클로쥬어를 배워야 했고 그는 그 속으로 끌려들어갔다는 것이다.며칠 전에 그에게서 전화를 받았는데 지금은 리스프를 사랑한다고 하더군요.웃기다 :)
그리고 바딘을 잘 언급해야겠다.Vaadin을 사용하는 것은 Clojure와 마찬가지로 많은 시간을 절약하고 코드를 짧게 만들었을 것입니다.지금은 화가 나서 ClojureScript를 배우고 있지만, Vaadin은 여전히 내가 사용해 본 최고의 웹 프레임워크이다. (Vaadin과 ClojureScript는 모두 구글의 GUI 프레임워크를 사용하고 있다.)
가장 큰 "번역 문제"는 Java/OOP 방법론에서 Clojure/기능 프로그래밍 패러다임으로 넘어가는 것입니다.
특히 "클로저 방식"은 객체 내에 가변 상태를 갖는 대신 가변 상태를 명확하게 분리하여 순수(부작용이 없는) 기능을 개발하는 것입니다.이 모든 것은 이미 알고 있을 것입니다. :-)
어쨌든, 이 이념은, 문제를 해결하기 위한 적절한 툴 세트를 구축하는 것에 초기 노력을 집중한 후, 최종적으로 그것들을 조합하는 「상향형」개발 스타일을 지향하는 경향이 있습니다.이렇게 생겼을 수도 있어요.
주요 데이터 구조를 식별하고 이를 불변의 Clojure 맵 또는 레코드 정의로 변환합니다.Clojure의 지속적인 데이터 구조 덕분에 많은 불변의 맵을 내포하는 것을 두려워하지 마십시오.자세한 내용을 보려면 이 비디오를 볼 가치가 있습니다.
이러한 불변의 구조(예: "장바구니에 아이템 추가")에서 작동하는 순수 비즈니스 로직 지향 함수의 작은 라이브러리를 개발합니다.나중에 추가하는 것이 쉽기 때문에 이 모든 것을 한꺼번에 할 필요는 없습니다.다만, 테스트를 용이하게 해, 데이터 구조가 기능하고 있는 것을 증명하기 위해서, 몇개의 작업을 조기에 실시하는 것이 도움이 됩니다.이 시점에서는, 어느 쪽이든, 실제로 유용한 내용을 대화식으로 쓰기 시작할 수 있습니다.
필요에 따라 데이터베이스 또는 네트워크 또는 레거시 Java 코드에서 이러한 구조를 유지할 수 있는 데이터 액세스 루틴을 별도로 개발합니다.이 문제를 분리하는 이유는 지속 논리를 "비즈니스 논리" 기능과 연계시키고 싶지 않기 때문입니다.클로쥬어를 보는 게 좋을 거야QL을 사용하면 원하는 Java 지속성 코드를 쉽게 래핑할 수 있습니다.
위의 모든 내용을 포함하는 단위 테스트(예: clojure.test)를 작성합니다.이것은 Clojure와 같은 동적 언어에서 특히 중요합니다.a) 정적 타입 체크에 의한 안전망이 충분하지 않기 때문입니다.b) 그 위에 너무 많은 것을 구축하기 전에 하위 레벨의 구조가 제대로 기능하고 있는지 확인하는 데 도움이 됩니다.
Clojure의 참조 유형(vars, ref, 에이전트 및 atom)을 사용하여 각 부품의 변동 가능한 응용 프로그램 수준 상태를 관리하는 방법을 결정합니다.이러한 시멘틱스는 모두 유사한 방식으로 작동하지만, 하려는 작업에 따라 트랜잭션/통화 시멘틱스가 다릅니다.참조는 기본 선택이 될 수 있습니다.이것에 의해, 임의의 코드를 (dosync...)블록에 랩 하는 것으로, 「통상적인」STM 트랜잭션 동작을 실장할 수 있습니다.
적절한 전체적인 웹 프레임워크를 선택합니다.Clojure는 이미 많은 것을 가지고 있지만 Ring을 강력히 추천합니다.템플릿 철학에 따라서는 이 뛰어난 비디오 "One Ring To Bind Them"과 함께 Fleet 또는 Enlive 또는 Hickup 중 하나를 참조하십시오.그런 다음 이를 사용하여 프레젠테이션 레이어를 작성합니다('이 장바구니를 적절한 HTML 단편으로 변환합니다'와 같은 기능 포함).
마지막으로 위의 도구를 사용하여 지원서를 작성하십시오.위의 단계를 올바르게 완료하면 실제로 매우 적은 수의 보일러 플레이트로 다양한 컴포넌트를 적절히 구성함으로써 애플리케이션 전체를 구축할 수 있기 때문에 이 작업은 매우 간단합니다.
This is roughly the sequence that I would attack the problem since it broadly represents the order of dependencies in your code, and hence is suitable for a "bottom up" development effort. Though of course in good agile / iterative style you'd probably find yourself pushing forward early to a demonstrable end product and then jumping back to earlier steps quite frequently to extend functionality or refactor as needed.
p.s. If you do follow the above approach, I'd be fascinated to hear how many lines of Clojure it takes to match the functionality of 50,000 lines of Java
Update: Since this post was originally written a couple of extra tools/libraries have emerged that are in the "must check out" category:
- Noir - web framework that builds on top of Ring.
- Korma - a very nice DSL for accessing SQL databases.
What aspects of Java does your current project include? Logging, Database transactions, Declarative transactions/EJB, web layer (you mentioned JSP, servlets) etc. I have noticed the Clojure eco-system has various micro-frameworks and libraries with a goal to do one task, and do it well. I'd suggest evaluate libraries based on your need (and whether it would scale in large projects) and make an informed decision. (Disclaimer: I am the author of bitumenframework) Another thing to note is the build process - if you need a complex setup (dev, testing, staging, prod) you may have to split the project into modules and have the build process scripted for ease.
I found the most difficult part was thinking about the database. Do some tests to find the right tools you want to use there.
ReferenceURL : https://stackoverflow.com/questions/5232654/java-to-clojure-rewrite
'itsource' 카테고리의 다른 글
도커 볼륨 MariaDB Windows (0) | 2022.09.11 |
---|---|
Google Chrome JavaScript 콘솔에서 디버깅 메시지를 인쇄하려면 어떻게 해야 합니까? (0) | 2022.09.11 |
스칼라 변환 방법java.util.List에 목록 표시? (0) | 2022.09.11 |
형제 결과에서 매개 변수에 대한 행 값을 일치시키는 방법은 무엇입니까? (0) | 2022.09.11 |
어레이의 한 속성에 대해 어레이 내의 개체를 알파벳 순으로 정렬합니다. (0) | 2022.09.11 |