Mengapa kita sebaiknya menggunakan koleksi kelas satu?


15

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.


1
Amogh Talpallikar Saya telah mengubah aturan 8 ke aturan 4, karena aturan 8 sebenarnya "Tidak ada kelas dengan lebih dari dua variabel instan".
yannis

Tampaknya mengatakan Aturan 8 dalam daftar isi, dan kemudian menyebutnya Aturan 4 dalam tubuh.
berguna


6
Apakah hanya saya, atau aturan ini tidak dapat diterapkan seperti yang tertulis? Maksud saya, Anda memiliki kelas dengan koleksi di dalamnya, jadi Anda mengambil yang lainnya. Sekarang kelas Anda adalah koleksi. Jadi jika Anda memiliki kelas lain, dengan kelas itu di dalamnya, ia memiliki koleksi di dalamnya, dan ... busa, bilas, ulangi.
mjfgates

@ mjfgates: hmm ... Poin bagus! sesuatu untuk dipikirkan!
Amogh Talpallikar

Jawaban:


12

Keamanan jenis adalah alasan yang sangat kecil untuk menggunakan koleksi kelas satu. Dari tautan Anda:

Aturan 4: Koleksi kelas pertama Penerapan aturan ini sederhana: kelas apa pun 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.

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 seperti Map<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 ketika SearchByIDperlu menggunakan GUID, bukan int.


8

... gunakan kelas terpisah yang membungkus koleksi dan dengan metode untuk menambah, menghapus, memodifikasi data koleksi itu

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):

Setiap koleksi dibungkus dalam kelasnya sendiri, jadi sekarang perilaku yang berhubungan dengan koleksi memiliki rumah

Tidak ada hubungannya dengan tipe (atau karena itu obat generik), semuanya berkaitan dengan mengaitkan perilaku koleksi dengan data itu.


1

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.


Saya juga memikirkan hal yang sama. tetapi harus ada sesuatu, contoh yang saya lihat untuk ini adalah di Jawa dan C # dan keduanya mendukung koleksi generik.
Amogh Talpallikar

@ AmoghTalpallikar: Maksud saya adalah membuatnya sederhana. Kecuali saya tidak perlu mengganti perilaku spesifik dari struktur data, saya tidak akan menyesuaikan.
java_mouse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.