"Vấn đề dịch thuật" lớn nhất có lẽ sẽ chuyển từ phương pháp luận Java / OOP sang mô hình lập trình chức năng / Clojure.
Đặc biệt, thay vì có trạng thái có thể thay đổi bên trong các đối tượng, "cách Clojure" là tách biệt rõ ràng trạng thái có thể biến đổi và phát triển các chức năng thuần túy (không có tác dụng phụ). Bạn có thể biết tất cả những điều này rồi :-)
Dù sao, triết lý này có xu hướng hướng tới một thứ gì đó theo phong cách phát triển "từ dưới lên", nơi bạn tập trung nỗ lực ban đầu vào việc xây dựng bộ công cụ phù hợp để giải quyết vấn đề của mình, sau đó kết hợp chúng lại với nhau ở phần cuối. Cái này có thể trông giống như thế này
Xác định các cấu trúc dữ liệu chính và chuyển chúng thành bản đồ Clojure bất biến hoặc các định nghĩa bản ghi. Đừng ngại lồng nhiều bản đồ bất biến - chúng rất hiệu quả nhờ cấu trúc dữ liệu bền bỉ của Clojure. Đáng xem video này để tìm hiểu thêm.
Phát triển các thư viện nhỏ gồm các chức năng thuần túy, theo hướng logic nghiệp vụ hoạt động trên các cấu trúc bất biến này (ví dụ: "thêm một mặt hàng vào giỏ hàng"). Bạn không cần phải thực hiện tất cả những điều này cùng một lúc vì việc bổ sung thêm sau này rất dễ dàng, nhưng thực hiện một số việc sớm để tạo điều kiện thuận lợi cho việc kiểm tra và chứng minh rằng cấu trúc dữ liệu của bạn đang hoạt động ..... theo cách này điểm bạn thực sự có thể bắt đầu viết nội dung hữu ích một cách tương tác tại REPL
Phát triển riêng biệt các quy trình truy cập dữ liệu có thể duy trì các cấu trúc này đến / từ cơ sở dữ liệu hoặc mạng hoặc mã Java kế thừa nếu cần. Lý do để giữ điều này rất riêng biệt là bạn không muốn logic liên tục bị ràng buộc với các chức năng "logic nghiệp vụ" của bạn. Bạn có thể muốn xem xét ClojureQL cho điều này, mặc dù nó cũng khá dễ dàng để bọc bất kỳ mã bền vững Java nào mà bạn thích.
Viết các bài kiểm tra đơn vị (ví dụ: với clojure.test ) bao gồm tất cả những điều trên. Điều này đặc biệt quan trọng đối với một ngôn ngữ động như Clojure vì a) bạn không có nhiều lưới an toàn từ việc kiểm tra kiểu tĩnh và b) điều đó giúp đảm bảo rằng các cấu trúc cấp thấp hơn của bạn đang hoạt động tốt trước khi bạn xây dựng quá nhiều hàng đầu của họ
Quyết định cách bạn muốn sử dụng các loại tham chiếu của Clojure (vars, refs, agent và nguyên tử) để quản lý từng trạng thái cấp ứng dụng có thể thay đổi của từng phần. Tất cả chúng đều hoạt động theo cách tương tự nhưng có ngữ nghĩa giao dịch / đồng thời khác nhau tùy thuộc vào những gì bạn đang cố gắng thực hiện. Refs có thể sẽ là lựa chọn mặc định của bạn - chúng cho phép bạn thực hiện hành vi giao dịch STM "bình thường" bằng cách gói bất kỳ mã nào trong một khối (dosync ...).
Chọn khung web tổng thể phù hợp - Clojure đã có khá nhiều nhưng tôi thực sự khuyên bạn nên sử dụng Ring - hãy xem video xuất sắc này " One Ring To Bind Them " cùng với Fleet hoặc Enlive hoặc Hiccup tùy thuộc vào triết lý tạo mẫu của bạn. Sau đó, sử dụng nó để viết lớp trình bày của bạn (với các chức năng như "dịch giỏ hàng này thành một đoạn HTML thích hợp")
Cuối cùng, viết ứng dụng của bạn bằng các công cụ trên. Nếu bạn đã thực hiện các bước trên đúng cách, thì đây thực sự sẽ là một việc dễ dàng bởi vì bạn sẽ có thể xây dựng toàn bộ ứng dụng bằng thành phần thích hợp của các thành phần khác nhau với rất ít bảng tạo sẵn.
Đây đại khái là trình tự mà tôi sẽ tấn công vấn đề vì nó đại diện cho thứ tự của các phần phụ thuộc trong mã của bạn và do đó phù hợp với nỗ lực phát triển "từ dưới lên". Tất nhiên, mặc dù theo phong cách nhanh nhẹn / lặp đi lặp lại tốt, bạn có thể thấy mình đang thúc đẩy sớm đến một sản phẩm cuối cùng có thể trình diễn và sau đó quay lại các bước trước đó khá thường xuyên để mở rộng chức năng hoặc cấu trúc lại nếu cần.
ps Nếu bạn làm theo cách trên, tôi sẽ rất thích thú khi nghe cần bao nhiêu dòng Clojure để phù hợp với chức năng của 50.000 dòng Java
Cập nhật : Vì bài đăng này ban đầu được viết, một số công cụ / thư viện bổ sung đã xuất hiện nằm trong danh mục "phải kiểm tra":
- Noir - khuôn khổ web được xây dựng dựa trên Ring.
- Korma - một DSL rất tốt để truy cập cơ sở dữ liệu SQL.