2009-07-16 42 views
10

Tôi có một chương trình vẽ hình trên một hình ảnh. Tôi có một không gian tên riêng cho từng hình dạng và chúng nằm trong các tệp riêng biệt.Tổ chức Mã Clojure


com/name/box.clj -> có không gian tên com.name.box.
com/name/triangle.clj -> có không gian tên com.name.triangle.

Tất cả đều dùng chung một chức năng gọi là tạo ra chúng vẽ trên màn hình, vì vậy nếu tôi sử dụng use, xung đột tên hàm.

Hiện tại, tôi tải chúng với load-file. Có cách nào tốt hơn để làm điều này? Nhìn qua API Clojure, có vẻ như có nhiều cách để bao gồm các tệp. Cái nào là một lựa chọn tốt hơn cho một dự án có nhiều tệp?

Trả lời

9

Tôi cũng bắt đầu bằng cách sử dụng load-file. Theo Clojure documentation on libs,

Clojure định nghĩa ước để đặt tên và cấu trúc libs:
        * Một tên lib là một biểu tượng mà thường sẽ chứa hai hoặc nhiều phần tách bằng dấu chấm.
        * chứa A của lib là một nguồn tài nguyên Java mà classpath-Đường dẫn tương đối có nguồn gốc từ tên lib:
                o Con đường là một chuỗi
                o Các khoảng thời gian trong tên lib được thay thế bằng dấu gạch chéo trong đường dẫn
                o dấu gạch nối trong tên lib được thay thế bằng dấu gạch dưới trong đường dẫn
                o Đường dẫn kết thúc với ".clj"
        * Một lib bắt đầu bằng biểu mẫu "ns" mà
                o tạo không gian tên Clojure có chung tên gọi của nó, và
                o tuyên bố của nó phụ thuộc vào các lớp Java, cơ sở vật chất cốt lõi Clojure, và/hoặc libs khác

Các tài liệu Clojure tiếp tục cung cấp khai báo không gian tên mẫu sau đây (mà tôi chắc chắn rằng bạn đã biết, nhưng tôi đang cung cấp nó ở đây để hoàn thành):

(ns com.my-company.clojure.examples.my-utils 
    (:import java.util.Date) 
    (:use [clojure.contrib.def :only (defvar-)]) 
    (:require [clojure.contrib.shell-out :as shell])) 

Vì vậy, một nswer sẽ sử dụng libs cho dự án của bạn - nó sẽ giúp đơn giản hóa tất cả các thư mục đó.Để "bao gồm" một lib, bạn sẽ sử dụng đòi hỏi, như thế này:

(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql) 
(require '(clojure.contrib def except sql)) 

Chừng nào các tài liệu là chính xác và dự án của bạn là classpath-tương đối, tất cả mọi thứ hạnh phúc nên tải. Hy vọng rằng câu trả lời câu hỏi của bạn. : D

6

Cùng với việc sử dụng lib không gian tên như đã được đề xuất, có lẽ chức năng 'tạo' chung của bạn là một ứng cử viên cho đa phương thức? http://clojure.org/multimethods

Điều này sẽ giúp tránh xung đột tên chức năng và thêm trừu tượng chung cho 'hình dạng' của bạn, tôi đoán nó phụ thuộc vào việc có thể tìm thấy chức năng gửi thích hợp hay không.