2011-08-12 31 views
17

Tôi có một cabal package xuất một loại NBT có thể hữu ích cho các nhà phát triển khác. Tôi đã trải qua những rắc rối trong việc xác định một cá thể Arbitrary cho kiểu của tôi, và nó sẽ là một sự xấu hổ khi không cung cấp cho các nhà phát triển khác để kiểm tra mã của họ tích hợp công việc của tôi.Trường hợp các trường hợp QuickCheck thuộc về gói cabal?

Tuy nhiên, tôi muốn tránh các tình huống mà trường hợp của tôi có thể cản trở. Có lẽ nhà phát triển khác có số different idea đối với trường hợp của Arbitrary. Có lẽ sự phụ thuộc của gói của tôi trên một phiên bản cụ thể của QuickCheck có thể gây trở ngại hoặc không mong muốn trong các phụ thuộc của dự án khách hàng.

ý tưởng của tôi, không theo thứ tự đặc biệt, bao gồm:

  • Rời khỏi dụ Arbitrary bên cạnh các định nghĩa của các loại, và để cho khách hàng đối phó với shadowing sơ thẩm hoặc trọng số phiên bản QuickCheck.
  • Làm ví dụ Arbitrary một trường hợp trẻ mồ côi trong một mô-đun riêng biệt trong cùng một gói, giả sử Data.NBT.Arbitrary. Sự phụ thuộc vào QuickCheck cho gói tổng thể vẫn còn.
  • Cung cấp ví dụ Arbitrary trong gói hoàn toàn riêng biệt, để nó có thể được liệt kê dưới dạng phụ thuộc thử nghiệm riêng biệt cho các dự án của khách hàng.
  • Điều kiện bao gồm cả trường hợp Arbitrary và phụ thuộc QuickCheck trong gói chính, nhưng chỉ khi một cờ như -ftest được đặt.

Tôi đã thấy sự kết hợp của tất cả những điều này được sử dụng trong các thư viện khác, nhưng chưa tìm thấy bất kỳ sự đồng thuận nào hoạt động tốt nhất. Tôi muốn thử và làm cho nó ngay trước khi tải lên Hackage.

+1

Có lẽ thực tế là bạn * đã * nhìn thấy tất cả các phương pháp này được sử dụng cho thấy rằng thực sự * không phải là * một sự đồng thuận? Hoặc ít nhất không phải là một giải pháp một kích thước phù hợp. –

+4

@C. A. McCann: chắc chắn, và đó sẽ là một câu trả lời hợp lệ. Có vẻ như đáng để thảo luận. – acfoltzer

Trả lời

2

Sự cố xảy ra: khả năng ai đó sử dụng thư viện của bạn sẽ muốn chạy kiểm tra QuickCheck bằng loại NBT của bạn?

Nếu có thể, và trường hợp tùy ý được chi tiết (và do đó không có khả năng thay đổi cho những người khác nhau), có lẽ tốt nhất là gửi nó với gói của bạn, đặc biệt nếu bạn định đảm bảo cập nhật các gói (như cho việc sử dụng một lá cờ hay không, mà đi xuống đến một chút sở thích cá nhân). Nếu cá thể là tương đối đơn giản tuy nhiên (và do đó nhiều khả năng là mọi người sẽ muốn tùy chỉnh nó), sau đó nó có thể là một ý tưởng để chỉ cung cấp một ví dụ mẫu trong tài liệu.

Nếu loại chủ yếu là nội tại và không có khả năng được sử dụng bởi những người khác muốn chạy thử nghiệm, thì sử dụng cờ để điều kiện QuickCheck có thể là cách tốt nhất để tránh phụ thuộc không cần thiết. là chỉ có vậy bạn có thể kiểm tra gói).

Tôi không phải là người hâm mộ có gói QuickCheck chỉ nói chung, mặc dù nó có thể hữu ích trong một số trường hợp.

+2

+1 - trong trường hợp cụ thể này "ví dụ mẫu trong tài liệu" có vẻ phù hợp. Ngoài ra, nếu bạn có bộ thử nghiệm riêng của mình đi kèm với gói (sử dụng các tính năng thử nghiệm cabal mới) thì doc có thể trỏ tới cá thể trong nguồn của chính gói đó (chỉ được biên dịch để kiểm tra chứ không phải để cài đặt) – sclv

3

Trên cơ sở không có nhiều kinh nghiệm cụ thể, nhưng một mong muốn chung của mạnh mẽ, nguyên tắc hướng dẫn cho gói phụ thuộc có lẽ nên

Từ mỗi theo khả năng của họ; cho mỗi người theo nhu cầu của họ.

Bạn nên duy trì sự phụ thuộc của gói với mức tối thiểu cần thiết cho chức năng thiết yếu của nó. Điều đó gợi ý tùy chọn 3 hoặc tùy chọn 4 cho tôi. Tất nhiên, đó là một nỗi đau để cắt gói lên rất nhiều. Nếu các tùy chọn có khả năng thể hiện điều kiện liên quan, thì tùy chọn 4 có vẻ giống như một cách tiếp cận hợp lý, dựa trên việc sử dụng ngôn ngữ hiệu quả để nói những gì bạn muốn nói. Nó sẽ là thực sự tốt nếu một sự đồng thuận nổi lên về một chuyển đổi chúng ta cần phải flick để có được bộ kiểm tra cũng như các chức năng cơ bản.

Cũng rõ ràng là có chỗ cho sàng lọc ở đây. Thật tuyệt vời khi Cabal hoạt động tốt, nhưng nó có thể cho phép các khái niệm phức tạp hơn về "gói", có lẽ sau cách thức của hệ thống mô-đun SML. Dịch phụ thuộc vào loại chức năng, chúng tôi về cơ bản có được viết

simplePackage :: (Dependency1, .., Dependencyn) -> Deliverable 

nhưng người ta có thể tưởng tượng sự kết hợp phức tạp hơn các sản phẩm và chức năng, như

fancyPackage :: BasicDependency -> (BasicDeliverable, HelpfulExtras -> Gravy) 

Cho đến lúc đó, chọn tùy chọn đó phản ánh chính xác nhất thực tế thỏa thuận. Và cho chúng tôi biết về nó, vì vậy chúng tôi có thể xây dựng sự đồng thuận đó.

+0

Cảm ơn các ý tưởng, đặc biệt là bản dịch phụ thuộc; nó chắc chắn là một ý tưởng hấp dẫn cho việc phát triển cabal trong tương lai. Trong thời gian này, tôi sẽ thử kết hợp tùy chọn 4 với đề xuất của bạn về văn xuôi hiệu quả và đề xuất của @ ivanm. – acfoltzer

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