Sesuai aturan nomor 4 dari Object Calisthenics oleh Jeff Bay (RTF) dalam The ThoughtWorks Anthology, direkomendasikan bahwa seseorang harus " Menggunakan koleksi kelas satu ".
Aturan 4: Koleksi kelas satu
Penerapan aturan ini sederhana: setiap kelas yang berisi koleksi tidak boleh mengandung variabel anggota lainnya. Setiap koleksi dibungkus dalam kelasnya sendiri, jadi sekarang perilaku yang berhubungan dengan koleksi memiliki rumah. Anda mungkin menemukan bahwa filter menjadi bagian dari kelas baru ini. Juga, kelas baru Anda dapat menangani kegiatan seperti bergabung dengan dua grup bersama atau menerapkan aturan untuk setiap elemen grup.
Apa yang bisa saya pahami dari ini adalah bahwa kita harus menggunakan kelas terpisah yang membungkus koleksi dan dengan metode untuk menambah, menghapus data modifikasi dari koleksi itu.
dan Kami membutuhkan ini sehingga kami yakin tentang tipe data yang masuk ke dalam koleksi dan apa yang keluar.
Jika kita menggunakan koleksi generik (dalam bahasa di mana itu berlaku), apakah kita perlu mengikuti aturan ini?
Jika saya kehilangan arti penting, mohon klarifikasi.
sumber
Jawaban:
Keamanan jenis adalah alasan yang sangat kecil untuk menggunakan koleksi kelas satu. Dari tautan Anda:
Idenya di sini adalah jika Anda menemukan diri Anda mencari, memfilter, memvalidasi, atau apapun selain menambah / menghapus / mengulangi semantik pada koleksi, kode meminta Anda untuk meletakkannya di kelasnya sendiri. Jika Anda perlu memperbarui hanya satu nilai (setelah pencarian), itu mungkin masuk dalam kelas koleksi.
Alasan untuk ini cukup sederhana, koleksi cenderung untuk diedarkan. Tak lama kemudian, 4 kelas yang berbeda memiliki
SearchByID()
metode mereka sendiri . Atau Anda mendapatkan nilai kembali sepertiMap<Integer, String>
dengan konteks apa yang disimpan di peta itu dihapus. Koleksi kelas satu adalah solusi sederhana dengan biaya satu file sumber. Dalam praktiknya, begitu semuanya sudah ada (mereka juga sangat mudah untuk menulis tes unit), setiap perubahan yang berhubungan dengan koleksi mudah ditangani, seperti ketikaSearchByID
perlu menggunakan GUID, bukan int.sumber
Ini tidak lebih dari menjamin jenis objek yang disimpan dalam koleksi, tetapi juga menjamin setiap invarian koleksi.
Pohon (merah-hitam, AVL dll.) Peka terhadap pemesanan dan perilakunya tergantung pada penyeimbangan kembali saat yang tepat. Kinerja tabel hash juga akan tergantung pada re-hashing yang tepat. Apakah Anda ingin mengingat untuk memeriksa load factor setiap kali Anda memasukkan ke dalam peta hash?
FWIW, teksnya cukup jelas tentang ini (dan saya akan mengedit semuanya menjadi pertanyaan Anda, jadi tidak ada orang lain yang perlu mengunduh RTF itu):
Tidak ada hubungannya dengan tipe (atau karena itu obat generik), semuanya berkaitan dengan mengaitkan perilaku koleksi dengan data itu.
sumber
Jawaban sederhananya adalah "Tidak" jika Anda menggunakan bahasa yang mendukung Generics. Karena tidak perlu memeriksa jenis karena fitur bahasa itu sendiri melakukan pekerjaan yang cukup baik (Dari pengalaman generik Java saya).
Tetapi jika Anda memiliki situasi di mana Anda ingin menyesuaikan struktur data yang diberikan dari bahasa, Anda dapat membuat kelas wrapper di sekitar struktur data asli dan mengekspos API Anda sendiri dan masih menggunakan implementasi yang mendasari struktur data asli.
sumber