Apa masalah desain dalam mengembalikan hashtable dari metode publik saat Anda ingin mengembalikan beberapa item alih-alih membuat kelas dan mengembalikan objek itu?
Jika memang ada masalah maka dalam keadaan apa masuk akal untuk melakukannya?
Bagaimana jawaban untuk pertanyaan ini berubah tergantung pada apakah bahasanya dinamis atau tidak?
Sunting: Ini untuk memperjelas bahwa kunci akan konstan dan merupakan bagian dari kode, bukan data. Sesuatu yang biasanya kita buat kelasnya. Pertanyaannya adalah mengapa salah menggunakan hashtable sebagai gantinya jika membuat kelas memang tampaknya merupakan pilihan yang tepat.
sumber
Salah satu masalah adalah bahwa dalam banyak kasus, kunci untuk tabel hash adalah string. Jadi konsumen metode harus tahu sebelumnya kunci mana yang digunakan untuk mengekstraksi data. Ini akan memberikan potensi kesalahan karena kesalahan ejaan saat mengakses data.
Kelemahan lain adalah refactorability. Jika Anda kemudian memutuskan untuk mengubah nama anggota, Anda kemudian memiliki banyak string sihir yang juga perlu diubah. Jauh lebih mudah untuk mengganti nama anggota kelas menggunakan alat refactoring yang disediakan oleh sebagian besar IDE yang bagus. Dengan tabel hash Anda mungkin harus melakukan operasi find / replace di semua file sumber yang mungkin bermasalah.
Terakhir, Anda akan kehilangan waktu kompilasi untuk memeriksa akses anggota - baik dari segi nama dan jenis. Yang terakhir ini tidak menjadi masalah jika tabel hash Anda hanya berisi satu jenis obejct, tetapi jika berisi banyak (bahkan dalam rantai hierarki yang sama) Anda benar-benar ingin memanfaatkan sistem tipe bahasa Anda dan mendapatkan waktu kompilasi memeriksa di sana. Di sebagian besar IDE, Anda akan memiliki beberapa fitur intellisense / autocomplete - ini bekerja dengan melihat pada sistem tipe, tetapi mereka tidak akan dapat membantu Anda dengan kunci tabel hash.
Adapun saat-saat ketika akan tepat untuk mengembalikan tabel hash (atau kumpulan pasangan nilai kunci lainnya), Anda akan menggunakan ini ketika nilai dan kunci tidak diketahui pada waktu kompilasi. Misalnya, jika Anda memiliki metode yang mem-parsing string kueri dan mengembalikan kunci & nilai yang sesuai, tabel hash akan menjadi pilihan yang baik. Dalam hal ini Anda juga ingin berpikir tentang mengembalikan semacam tabel hash yang tidak berubah atau hanya baca.
Sunting - Sebagian besar poin yang diangkat dalam jawaban ini berhenti berlaku ketika Anda berbicara tentang bahasa dinamis :)
sumber
Argumen paling penting yang menentang hal ini adalah Anda terlalu banyak mengungkapkan informasi kepada konsumen. Kode pengkonsumsi hanya perlu tahu bahwa itu semacam koleksi nilai-kunci (kamus); apakah itu diterapkan sebagai hashmap, daftar asosiasi, trie, atau apa pun, relatif tidak menarik. Jadi cara yang tepat adalah kembali dengan antarmuka yang sesuai (
IDictionary
, atau apa pun bahasa pilihan Anda menggunakan) bukan dengan tipe yang sebenarnya.Semua ini dengan asumsi bahwa Anda benar-benar membutuhkan kamus untuk mewakili data Anda, yaitu, data Anda terdiri dari pasangan kunci / nilai, di mana kunci tersebut unik di antara dataset, dan tidak dapat diperbaiki pada waktu kompilasi. Jika Anda memiliki kunci yang diketahui sebelumnya, Anda harus membuat jenis yang tepat (atau beberapa, sesuai kebutuhan) untuk data Anda. Itu tergantung pada apakah Anda menganggap kunci itu sendiri sebagai bagian dari data, atau bagian dari kode.
EDIT :
Untuk memperjelas, saya menggunakan kamus istilah yang berarti tipe paling umum dari struktur data nilai kunci di sini; Maksud saya bukan implementasi khusus bahasa seperti Python
dict
atau .NETDictionary
.sumber
Satu pertanyaan yang akan saya tanyakan pada diri saya adalah "apakah kunci berubah dalam kamus ini?" Jika mereka konstan maka Anda harus mengembalikan objek atau struktur data lain yang sesuai. Jika mereka dinamis maka Anda mungkin ingin mengembalikan semacam struktur gaya kamus. Akhirnya, jika ada beberapa kunci yang akan menjadi konstan dan beberapa set kunci dinamis yang tidak diketahui, Anda mungkin ingin mengembalikan struktur data hybrid termasuk beberapa nilai tetap dan semacam kamus untuk overflow.
sumber