2010-06-17 23 views
11

Tôi quan tâm đến cách mọi người cấu trúc mã nguồn Clojure của họ.Cách tiếp cận thành ngữ để cấu trúc mã nguồn Clojure

Được sử dụng để Java, tôi khá quen thuộc với mô hình của một lớp cho mỗi tập tin mã nguồn, bundling tất cả các định nghĩa dữ liệu và phương pháp với ý kiến ​​và chú thích, vv

thích hợp Tuy nhiên Clojure cung cấp linh hoạt hơn rất nhiều , và tôi không chắc chắn làm thế nào tôi nên cấu trúc dự án của tôi (có khả năng kết thúc như là một ứng dụng có kích thước trung bình, có lẽ 5.000 dòng với ba hoặc bốn hệ thống con khác nhau)

Đặc biệt tôi đang vật lộn với:

  • Tôi nên sử dụng những nguyên tắc nào để xác định xem mã có nên ở trong một không gian tên duy nhất so với tách ra thành các không gian tên khác nhau không?
  • Mỗi giao thức/kiểu dữ liệu có không gian tên + tệp nguồn riêng với tập hợp các hàm liên quan không?
  • Khi nào tôi nên yêu cầu so với sử dụng các không gian tên khác?

Trả lời

8

Tôi cũng thuộc nền Java, cùng với một chút Ruby và một chút Go. Đây là những gì tôi đang làm vào lúc này, khoảng một tháng vào Clojure:

  • Tôi đang nghĩ về một không gian tên như một đơn vị ngữ nghĩa, mã của nó đi cùng nhau cho một mục đích cụ thể, như một kiểu dữ liệu và các hoạt động trên đó.

Tôi có hai ước cho không gian tên vs file:

  • Đối với đơn vị smallish mà gọn gàng trong một tập tin (Tôi đang sử dụng ~ 1000 dòng như giới hạn nơi một tập tin nên được chia) Tôi có một không gian tên trên mỗi tệp, với đường dẫn thư mục cộng với tên tệp giống như không gian tên. Đây là một điều tốt trong Java, tôi nghĩ rằng, nó làm cho việc tìm kiếm không gian tên từ tập tin hoặc ngược lại một cách dễ dàng.
  • Đối với các đơn vị lớn hơn cần nhiều tệp, tôi đang sử dụng quy ước Go: Không gian tên khớp với đường dẫn thư mục và tất cả các tệp trong thư mục dùng chung một không gian tên. Trong những trường hợp này, tôi thường gán một tệp chính với một tên cố định ('main') để tải và tương tác với những người khác.

Ví dụ về không gian tên, tôi có trình phân tích cú pháp đọc định dạng và chuyển đổi nó thành HTML. Tôi có một không gian tên duy nhất cho trình phân tích cú pháp (đơn vị ngữ nghĩa) và một số tệp trong thư mục được chia thành chức năng phụ: Lexer, phân tích cú pháp, chuyển đổi HTML và tệp chính chứa API công khai chính để sử dụng trình phân tích cú pháp.

Tôi sẽ không tự động sử dụng một vùng tên trên mỗi kiểu dữ liệu, nó phụ thuộc vào phạm vi của kiểu dữ liệu. Nếu đó là một lớn, có lẽ. Nhưng đối với một kiểu dữ liệu như Point, với hai trường và một vài hàm, tôi muốn đưa nó vào một không gian tên chung hơn như Hình học.

Yêu cầu so với sử dụng:

  • Yêu cầu với một bí danh cho phù hợp ngắn gần như ở khắp mọi nơi.
  • Điều này cũng cho phép sử dụng lại tên lõi: Kiểu dữ liệu cây đặc biệt của tôi có hoạt động "lấy" để phù hợp với bản đồ; sử dụng yêu cầu không có xung đột: "get" là lõi của Clojure, "tree/get" là một đối với kiểu dữ liệu của tôi.
  • Tôi đang sử dụng "sử dụng" chỉ cho những gì tôi xem xét "tiện ích mở rộng cốt lõi", như khi tôi tạo "map-if" của riêng mình, bản đồ và bộ lọc được cuộn thành một.
+0

cảm ơn - điều đó có vẻ rất có ý nghĩa, tuyệt vời để có được quan điểm của bạn! – mikera

Các vấn đề liên quan