Tidak pernah berkata tidak"
Saya tidak berpikir itu selalu buruk, itu hanya buruk jika Anda melakukannya dengan buruk dan menyalahgunakannya.
Kita Semua Membutuhkan Alat dan Utilitas
Sebagai permulaan, kita semua menggunakan beberapa perpustakaan yang kadang-kadang dianggap hampir di mana-mana dan harus dimiliki. Misalnya, di dunia Java, Google Guava atau beberapa Apache Commons ( Apache Commons Lang , Apache Commons Collections , dll ...).
Jadi jelas ada kebutuhan untuk ini.
Hindari Kata-Kata Sulit, Duplikasi, dan Perkenalan Bug
Jika Anda berpikir tentang ini cukup banyak hanya sekelompok besar dari Util
kelas - kelas ini Anda jelaskan, kecuali seseorang berusaha keras untuk membuat mereka (relatif) benar, dan mereka telah diuji - waktu dan sangat terbelalak oleh orang lain.
Jadi saya akan mengatakan aturan pertama ketika merasakan gatal untuk menulis Util
kelas adalah untuk memeriksa bahwa Util
kelas sebenarnya belum ada.
Satu-satunya argumen balasan yang saya lihat adalah ketika Anda ingin membatasi dependensi Anda karena:
- Anda ingin membatasi jejak memori dependensi Anda,
- atau Anda ingin mengontrol dengan ketat apa yang diizinkan untuk digunakan pengembang (terjadi dalam tim besar yang obsesif, atau ketika kerangka kerja tertentu dikenal memiliki kelas super-jelek yang benar-benar dihindari di suatu tempat).
Tetapi kedua hal ini dapat diatasi dengan mengemas ulang lib menggunakan ProGuard atau yang setara, atau memisahkannya sendiri (untuk pengguna Maven , plugin maven-shade-plugin menawarkan beberapa pola penyaringan untuk mengintegrasikan ini sebagai bagian dari build Anda).
Jadi, jika itu dalam lib dan cocok dengan use case Anda, dan tidak ada tolok ukur yang memberi tahu Anda sebaliknya, gunakan itu. Jika sedikit berbeda dari apa yang Anda miliki, perluas (jika mungkin) atau perluas, atau dalam upaya terakhir tulis ulang.
Konvensi Penamaan
Namun, sejauh ini dalam jawaban ini saya menyebut mereka Util
seperti Anda. Jangan sebutkan itu.
Beri mereka nama yang berarti. Ambil Google Guava sebagai (sangat, sangat) contoh yang baik dari apa yang harus dilakukan, dan bayangkan bahwa com.google.guava
namespace sebenarnya adalah util
root Anda .
Panggil paket Anda util
, paling buruk, tetapi bukan kelas. Jika berurusan dengan String
objek dan manipulasi konstruksi string, sebut saja Strings
, bukan StringUtils
(maaf, Apache Commons Lang - Saya masih suka dan menggunakan Anda!). Jika itu melakukan sesuatu yang spesifik, pilih nama kelas tertentu (seperti Splitter
atau Joiner
).
Unit-Test
Jika Anda harus menggunakan utilitas ini untuk menulis, pastikan untuk mengujinya. Hal yang baik tentang utilitas adalah bahwa mereka biasanya merupakan komponen yang mandiri, yang mengambil input spesifik dan mengembalikan output spesifik. Itulah konsepnya. Jadi tidak ada alasan untuk tidak mengujinya.
Selain itu, pengujian unit akan memungkinkan Anda untuk menentukan dan mendokumentasikan kontrak API mereka. Jika tes gagal, Anda mengubah sesuatu dengan cara yang salah, atau itu berarti Anda mencoba mengubah kontrak API Anda (atau bahwa tes awal Anda adalah omong kosong - belajarlah darinya, dan jangan lakukan lagi) .
Desain API
Keputusan desain yang akan Anda ambil untuk API ini akan mengikuti Anda sejak lama, mungkin. Jadi, meski tidak menghabiskan berjam-jam untuk menulis Splitter
-kloning, berhati-hatilah dengan cara Anda mendekati masalah ini.
Tanyakan kepada diri Anda beberapa pertanyaan:
- Apakah metode utilitas Anda menjamin kelas sendiri, atau apakah metode statis cukup baik, jika masuk akal untuk menjadi bagian dari kelompok metode yang sama berguna?
- Apakah Anda memerlukan metode pabrik untuk membuat objek dan membuat API Anda lebih mudah dibaca?
- Berbicara tentang keterbacaan, apakah Anda memerlukan API Lancar , pembangun , dll ...?
Anda ingin utilitas ini mencakup banyak kasus penggunaan, menjadi kuat, stabil, terdokumentasi dengan baik, mengikuti prinsip paling tidak mengejutkan, dan mandiri. Idealnya, setiap sub-paket utilitas Anda, atau setidaknya seluruh paket utilitas Anda, dapat diekspor ke bundel agar mudah digunakan kembali.
Seperti biasa, pelajari dari para raksasa di sini:
- Telusuri semua ini, kemudian analisis dan bandingkan, dan kembali ke mereka sering untuk melakukannya lagi (perhatikan bahwa saya tidak membuat keputusan apakah ini benar atau sebagian baik atau buruk, penekanannya adalah pada menganalisis dan membandingkan bit) :
- Saksikan Josh Bloch's Bagaimana Merancang API yang Baik dan Mengapa Itu Penting ( slide ).
- Baca dan tonton beberapa bahan Bloch tambahan:
- Baca Masalah Desain API .
Ya, banyak dari ini memiliki penekanan pada koleksi dan struktur data, tapi jangan bilang itu bukan di mana atau untuk apa Anda biasanya akan menerapkan sebagian besar utilitas Anda, secara langsung atau tidak langsung.
Util
atas nama kelas Anda. Masalah terpecahkan.