Không bao giờ nói không bao giờ"
Tôi không nghĩ nó thực sự xấu, nó chỉ tệ nếu bạn làm điều đó tồi tệ và lạm dụng nó.
Tất cả chúng ta đều cần các công cụ và tiện ích
Để bắt đầu, tất cả chúng ta đều sử dụng một số thư viện đôi khi được coi là gần như phổ biến và phải có. Ví dụ, trong thế giới Java, Google ổi hoặc một số Apache Commons ( Apache Commons Lang , Apache Commons Bộ sưu tập , vv ...).
Vì vậy, rõ ràng là cần một thứ này.
Tránh các lỗi khó, trùng lặp và giới thiệu lỗi
Nếu bạn suy nghĩ về những được khá nhiều chỉ là một bó rất lớn của những Util
lớp học mà bạn mô tả, ngoại trừ một người nào đó đã trải qua độ dài lớn để có được chúng (tương đối) đúng, và họ đã được thời gian - thử nghiệm và nặng nề mắt cuộn lại bởi những người khác.
Vì vậy, tôi muốn nói rằng quy tắc đầu tiên khi cảm thấy ngứa khi viết một Util
lớp là kiểm tra xem Util
lớp đó thực sự không tồn tại.
Đối số duy nhất tôi từng thấy đó là khi bạn muốn giới hạn sự phụ thuộc của mình vì:
- bạn muốn giới hạn dung lượng bộ nhớ của các phụ thuộc của bạn,
- hoặc bạn muốn kiểm soát chặt chẽ những gì các nhà phát triển được phép sử dụng (xảy ra trong các nhóm lớn ám ảnh hoặc khi một khung cụ thể được biết là có lớp siêu siêu kỳ quặc để tránh tuyệt đối ở đâu đó).
Nhưng cả hai điều này có thể được giải quyết bằng cách đóng gói lại lib bằng ProGuard hoặc tương đương hoặc tự tách nó ra (đối với người dùng Maven , maven-bóng-plugin cung cấp một số mẫu lọc để tích hợp phần này vào bản dựng của bạn).
Vì vậy, nếu nó ở dạng lib và phù hợp với trường hợp sử dụng của bạn và không có điểm chuẩn nào cho bạn biết khác, hãy sử dụng nó. Nếu nó thay đổi một chút so với những gì bạn, hãy mở rộng nó (nếu có thể) hoặc mở rộng nó, hoặc trong phương án cuối cùng viết lại nó.
Quy ước đặt tên
Tuy nhiên, cho đến nay trong câu trả lời này, tôi đã gọi họ Util
giống như bạn. Đừng gọi tên họ như vậy.
Đặt cho họ những cái tên ý nghĩa. Lấy Google Guava làm ví dụ (rất, rất) tốt về những việc cần làm và chỉ cần tưởng tượng rằng com.google.guava
không gian tên thực sự là util
gốc của bạn .
Gọi gói của bạn util
, lúc tồi tệ nhất, nhưng không phải là các lớp. Nếu giao dịch với String
các đối tượng và thao tác với các cấu trúc chuỗi, hãy gọi nó Strings
, không StringUtils
(xin lỗi, Apache Commons Lang - Tôi vẫn thích và sử dụng bạn!). Nếu nó làm một cái gì đó cụ thể, chọn một tên lớp cụ thể (như Splitter
hoặc Joiner
).
Kiểm tra đơn vị
Nếu bạn phải dùng đến việc viết các tiện ích này, hãy đảm bảo kiểm tra đơn vị chúng. Điểm hay của các tiện ích là chúng thường là các thành phần khá khép kín, có các đầu vào cụ thể và trả về các đầu ra cụ thể. Đó là khái niệm. Vì vậy, không có lý do gì để không kiểm tra đơn vị chúng.
Ngoài ra, kiểm tra đơn vị sẽ cho phép bạn xác định và ghi lại hợp đồng API của họ. Nếu các bài kiểm tra bị hỏng, hoặc bạn đã thay đổi điều gì đó sai, hoặc điều đó có nghĩa là bạn đang cố gắng thay đổi hợp đồng API của mình (hoặc các bài kiểm tra ban đầu của bạn là tào lao - hãy học hỏi từ đó và đừng làm lại) .
Thiết kế API
Quyết định thiết kế mà bạn sẽ đưa ra cho các API này sẽ theo bạn trong một thời gian dài, có thể. Vì vậy, trong khi không dành hàng giờ để viết một văn bản Splitter
, hãy cẩn thận về cách bạn tiếp cận vấn đề.
Hãy tự hỏi mình một vài câu hỏi:
- Phương thức tiện ích của bạn có tự bảo đảm một lớp hay là một phương thức tĩnh đủ tốt, nếu nó có ý nghĩa đối với nó là một phần của một nhóm các phương thức hữu ích tương tự?
- Bạn có cần các phương thức xuất xưởng để tạo các đối tượng và làm cho API của bạn dễ đọc hơn không?
- Nói về khả năng đọc, bạn có cần API thông thạo , trình tạo , v.v ... không?
Bạn muốn những dụng cụ này bao gồm một số lượng lớn các trường hợp sử dụng, phải mạnh mẽ, ổn định, được ghi chép đầy đủ, theo nguyên tắc ít gây bất ngờ nhất và phải khép kín. Lý tưởng nhất, mỗi gói phụ của dụng cụ của bạn, hoặc ít nhất là toàn bộ gói sử dụng của bạn, sẽ có thể được xuất thành một gói để dễ dàng sử dụng lại.
Như thường lệ, học hỏi từ những người khổng lồ ở đây:
- Lướt qua những cái này, sau đó phân tích và so sánh, và quay lại với chúng thường xuyên để làm lại (lưu ý rằng tôi không đưa ra bất kỳ phán xét nào về việc chúng hoàn toàn hay một phần tốt hay xấu, nhấn mạnh vào phân tích và so sánh bit) :
- Xem Cách thiết kế API tốt của Josh Bloch và lý do tại sao vấn đề ( slide ).
- Đọc và xem một số tài liệu Bloch bổ sung:
- Đọc các vấn đề thiết kế API .
Có, nhiều trong số này nhấn mạnh vào các bộ sưu tập và cấu trúc dữ liệu, nhưng đừng nói với tôi rằng đó không phải là nơi hoặc những gì mà bạn thường có khả năng thực hiện hầu hết các tiện ích của mình, trực tiếp hoặc gián tiếp.
Util
tên của lớp bạn. Vấn đề được giải quyết.