Thư viện phần mềm nhỏ của tôi có nên tránh sử dụng các thư viện khác không?


13

Tôi vừa phát hành một thư viện Java nhỏ chỉ cung cấp một vài lớp và phương thức. Kể từ khi tôi xây dựng dự án với Maven, tôi đã ngay lập tức sử dụng một số thư viện của bên thứ ba để đạt được mục tiêu của mình, cụ thể:

  • commons-lang3 (đối với một số công cụ Java chung)
  • slf4j-api (để đăng nhập)
  • commons-io (đối với một chút công cụ tệp - tôi thực sự đọc một tệp một lần)

Tôi không muốn thư viện của mình xuất hiện bồng bềnh trong mắt người khác. Tôi có nên cố gắng loại bỏ sự phụ thuộc của mình vào các thư viện này để giảm thiểu dấu chân của tôi không? Bạn có lời khuyên nào về loại thư viện nào là tốt nhất để tránh khi xem xét sử dụng nhiều hơn trong tương lai không?


1
phần cụ thể của câu hỏi của bạn có vẻ có thể trả lời được: dự án của bạn cộng với libs cụ thể cộng với việc nó có ổn không. Vấn đề là, bạn đánh vần nó cùng với phần chung "nên ... nhỏ ... tránh". Vì hiện tại, câu hỏi này không phù hợp với định dạng Hỏi và Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời sẽ được hỗ trợ bởi các sự kiện, tài liệu tham khảo hoặc chuyên môn cụ thể, nhưng câu hỏi này có thể sẽ thu hút tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy câu hỏi này có thể được cải thiện, hãy xem Câu hỏi thường gặp để được hướng dẫn.
gnat

1
@gnat Xin lỗi tôi. Là một người dùng Stack Overflow thông thường, tôi có xu hướng cho rằng các câu hỏi hơi chủ quan được chấp nhận trên các lập trình viên. Có một trang web Stack Exchange nơi các vấn đề như vậy là OK? Trong lúc này, tôi sẽ xóa mọi mơ hồ khỏi câu hỏi của tôi.
Duncan Jones

2
@gnat Câu hỏi này là tốt, ngay cả ở dạng ban đầu của nó.
Thomas Owens

@ThomasOwens với tất cả sự tôn trọng, tôi không nghĩ vậy; đối với phiên bản gốc, tôi nhanh chóng tìm ra hai câu trả lời với các khuyến nghị trái ngược nhau, cả hai đều hợp lý: trò chơi bỏ phiếu chào mừng
gnat

1
@gnat Chỉ có hai? Tốt rồi. Hãy để họ được đăng và bỏ phiếu trên. Hai câu trả lời có khả năng đúng với sự biện minh và lý luận trái ngược nhau không làm cho câu hỏi trở nên tồi tệ. Không phải 3 hay 4 hay thậm chí 5. Đó là một câu hỏi được đặt ra rõ ràng mà một nhà phát triển thư viện có vấn đề phải giải quyết, và sau đó gánh nặng được đặt lên câu trả lời để trở thành câu trả lời hay .
Thomas Owens

Câu trả lời:


8

Tôi đang trả lời điều này xem xét tình hình cụ thể của bạn. Tôi sẽ nói rằng nó tốt để sử dụng các thư viện. Chỉ cần đảm bảo slf4j-api của bạn không mang theo việc thực hiện với nó. Do đó, ý tôi là đánh dấu sự phụ thuộc thực hiện là "kiểm tra". VÍ DỤ:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.2</version>
    <scope>test</scope>
</dependency>

Điều này được mô tả chi tiết trên Câu hỏi thường gặp về SLF4j.

Đối với hai cái còn lại, IME, chúng luôn tương thích ngược. Do đó, nếu 5 năm nữa tôi cần sử dụng thư viện của bạn nhưng bạn đang sử dụng phiên bản cũ của những thứ đó, tôi chỉ có thể loại trừ các phụ thuộc của bạn và mã của chúng tôi vẫn sẽ hoạt động. Nói cách khác, bằng cách sử dụng các thư viện cụ thể này, bạn sẽ không giới thiệu jar-hell cho những người khác.

Nếu tôi sử dụng thư viện của bạn thông qua maven, tôi sẽ không nhận ra liệu thư viện của bạn có bị cồng kềnh hay không. Tôi sẽ chỉ phụ thuộc vào bạn và sử dụng nó. Tôi nghĩ điều quan trọng hơn là mã của bạn hoạt động chính xác hơn mã có dấu chân nhỏ hơn. Tôi thích bạn sử dụng commons-io thay vì phát minh lại bánh xe có lỗi trong đó.


Cảm ơn bạn đã phản hồi, tôi nghĩ rằng chúng tôi đồng ý rộng rãi về cách tiếp cận tôi nên thực hiện. Chỉ cần sửa một bit - cách người ta nên bao gồm slf4j trong dự án thư viện là chỉ cần bao gồm slf4j-apivà không có các tạo phẩm liên quan khác, được cung cấp hoặc nếu không. Xem slf4j.org/manual.html#projectDep .
Duncan Jones

Tôi nhớ lại một số bài tập gây tổn thương não (zillions of excludes iirc) mà tôi đã phải thực hiện khi các mô-đun cụ thể trong phần phụ thuộc của tôi không thể "đồng ý" trên phiên bản slf4j. Từ câu trả lời của bạn, có vẻ như nếu các nhà thiết kế mô-đun sẽ phơi bày nó ra provided, sẽ không có vấn đề như vậy, đúng không?
gnat

2
@gnat Thông thường điều đó sẽ được giải quyết (ít nhất là trong Maven), bằng cách khai báo một phiên bản ưa thích trong POM của bạn. Maven lấy phiên bản "gần nhất" được xác định cho một vật phẩm và POM ngay lập tức vượt xa các phụ thuộc bắc cầu. Có thể đây là một sự thay đổi hành vi trong phiên bản Maven 2.x.
Duncan Jones

1
+1 để chỉ định slf4j là provided- rất không phô trương.
Gary Rowe

@DuncanJones cảm ơn, có lẽ tôi đã bỏ lỡ điều này rồi. Phiên bản maven của tôi là 2.2 hoặc 2.3, không thể nhớ lại phiên bản nào (mặc dù tôi chắc chắn đã nhớ cách mvn dependency:analyzemang phiên bản tào lao cho đến khi bị loại trừ :)
gnat

1

Không.

"Bloat" là một huyền thoại. Cho dù có bao nhiêu mã trong thư viện của bạn, nếu một số mã đó không bao giờ được sử dụng, nó sẽ không được phân trang - nó sẽ không ảnh hưởng gì đến hiệu suất hoặc dấu chân bộ nhớ.

Mặt khác, nếu bạn cần thêm chức năng đó, bạn có hai lựa chọn. Bạn có thể tự viết nó và dành nhiều thời gian và nỗ lực để giải quyết các vấn đề mà những người khác đã giải quyết trước đó hoặc bạn có thể chọn sử dụng giải pháp đã tồn tại (và đã được thử nghiệm / gỡ lỗi / v.v.).

Điều đó khiến chúng tôi có kích thước tải xuống và dung lượng ổ đĩa, và trừ khi bạn nói những con số ngớ ngẩn, vào năm 2013, chúng là hai yếu tố gần với danh sách những điều bạn cần lo lắng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.