obj.id
tampaknya cukup umum dan juga tampaknya berada dalam jangkauan sesuatu yang bisa diketahui objek tentang dirinya sendiri. Saya mendapati diri saya bertanya mengapa objek saya harus tahu idnya sendiri?
Tampaknya tidak punya alasan untuk memilikinya? Salah satu alasan utama keberadaannya adalah mengambilnya, dan repositori saya perlu mengetahuinya, dan karenanya menggunakannya untuk interaksi basis data.
Saya juga pernah mengalami masalah ketika saya ingin membuat serialisasi objek ke JSON untuk API RESTful di mana id sepertinya tidak cocok dengan payload, tetapi hanya URI dan memasukkannya ke objek membuatnya menjadi lebih sulit.
Haruskah suatu objek tahu itu id sendiri? mengapa atau mengapa tidak?
pembaruan : Ketentuan
- id: Atribut pengidentifikasi pada suatu objek. dalam hal basis data, kunci pengganti bukan kunci alami.
- Objek: Entitas, atau objek unik yang dapat diidentifikasi dalam sistem.
object-oriented
object-oriented-design
xenoterracide
sumber
sumber
Jawaban:
Jawaban Singkat: Termasuk pengidentifikasi objek dalam objek adalah suatu keharusan jika akan dirujuk.
Untuk skenario di mana Anda berencana untuk menggunakan kumpulan objek dan memiliki rencana untuk merujuk objek / entitas individu maka pengidentifikasi harus dimasukkan. Namun, mungkin ada kasus-kasus di mana kunci alami / pengidentifikasi seperti
DateTime
dapat secara artifisial memenuhi kebutuhan itu.Selain itu, Anda mungkin memiliki DTO Anda sebagai wadah ringan dari objek Anda, yang dapat melompati / menyertakan pengidentifikasi objek itu sendiri. Sungguh semua pilihan ini benar-benar tergantung pada kasus dan kebutuhan penggunaan bisnis Anda .
Sunting: jika Anda ingin mengidentifikasi objek, Anda harus memiliki pengenal. Pengidentifikasi itu bisa menjadi pengganti pengganti, tanggal-waktu, panduan, dll ... pada dasarnya, apa pun yang mengidentifikasi objek Anda dari orang lain dengan cara yang unik.
sumber
id
(atau setidaknya saya tidak akan)Dalam upaya untuk meninggalkan jawaban saya yang abstrak seperti pertanyaan Anda, saya pikir Anda telah benar-benar menjawab pertanyaan Anda sendiri.
Objek harus tahu ID-nya sendiri jika perlu.
Suatu objek seharusnya tidak mengetahui ID-nya (atau bahkan memilikinya) jika tidak perlu.
Seperti yang Anda tunjukkan, ada beberapa kasus di mana objek tidak nyaman atau tidak perlu disimpan atau diketahui apakah ID-nya. Tetapi ada kasus lain di mana lebih mudah bagi objek untuk mengetahui ID-nya. Beri kode objek Anda sesuai dengan penggunaannya.
sumber
obj.id
bertentangan dengan rendering koleksi itu sendiri.Ini cukup umum untuk memasukkan ID, tetapi juga umum untuk menggunakan kamus, yaitu struktur data di mana setiap objek dikaitkan dengan ID-nya dengan cara yang Anda dapat dengan mudah mengambil objek ini mengetahui ID yang sesuai, tetapi objek tidak tahu saya t.
Misalnya, jika Anda membuat API dengan dua metode:
http://api.example.com/products/
Memuat daftar ID produk.
http://api.example.com/product/452/
Memuat produk ID 452.
Maka Anda tidak perlu mengirim ulang ID 452 dalam respons JSON dari permintaan kedua. Pengguna API sudah mengetahui ID.
sumber
Saya pikir ini subjektif dan tergantung pada desain Anda.
Sebagian besar meskipun ini tampaknya merupakan desain yang berasal dari rekaman aktif . Dalam catatan aktif, entitas Anda memiliki metode untuk melakukan operasi basis data dan karenanya juga harus mengetahui pengenal basis datanya.
Saat menggunakan pola lain seperti repositori dengan mapper data, menyimpan data ini di objek menjadi tidak perlu dan mungkin tidak pantas.
Ambil contoh sebuah
Person
objek. Saya diberi nama yang mungkin unik atau tidak unik di dalam keluarga. Seiring bertambahnya populasi, nama-nama yang lebih besar tidak lagi unik sehingga kami telah membuat pengidentifikasi pengganti untuk sistem yang semakin besar. Contohnya termasuk: SIM saya, dan nomor jaminan sosial. Saya tidak terlahir untuk diberi id, semua id ini harus dilamar.Sebagian besar tidak membuat kunci primer yang baik untuk perangkat lunak, karena tidak universal. Setidaknya tidak di luar sistem spesifik mereka, SSN jelas unik, dan konsisten, untuk Administrasi Jaminan Sosial. Karena kami biasanya bukan penyedia informasi ini, Anda tidak akan memanggil mereka
id
melainkan data yang mereka wakili, misalnyaSSN
. Kadang-kadang bahkan berisi objek yang dikomposisikan penuh sepertiDriversLicense
yang bisa berisi semua informasi yang dilakukan SIM.Oleh karena itu, semua id umum adalah kunci pengganti dalam sistem, dan dapat diganti dengan dalam referensi memori, hanya berisi id untuk memudahkan pencarian dan penyimpanan catatan.
Karena sebuah
id
bukan bagian dari data konseptual, saya ragu bahwa itu (umumnya) termasuk dalam objek, karena tidak berasal dari domain. Sebaliknya itu harus dipertahankan untuk tujuannya yaitu untuk mengidentifikasi objek yang tidak memiliki cara lain untuk mewakili identitas yang unik. Ini bisa dilakukan dalam repositori / koleksi dengan mudah.Dalam perangkat lunak jika Anda perlu mewakili objek sebagai daftar, atau bertahan, Anda dapat melakukannya dari objek repositori / koleksi, atau objek lain yang terkait dengannya. Saat meneruskan ke Pemeta Data (jika terpisah), Anda bisa lewat
.update( id, obj )
.Penafian : Saya belum mencoba membangun sistem yang tidak mengandung id di dalam entitas dan dengan demikian dapat membuktikan bahwa saya salah.
sumber
Seperti yang dicatat oleh GlenH7 dalam komentar, ini pertanyaan yang bagus, karena menantang apa yang diterima begitu banyak orang. Namun yang saya ambil adalah bahwa meskipun membiarkan id keluar mungkin tampak murni secara konseptual, hal yang pragmatis untuk dilakukan adalah menjaga id dengan objek melintasi sebanyak mungkin lapisan sistem. Biayanya sedikit, tetapi bisa berguna ketika segalanya mulai rusak.
Entitas mungkin tidak perlu tahu idnya, sama seperti seseorang tidak perlu mengetahui nomor identifikasi pribadinya, nomor SIM atau pengenal lain yang mungkin digunakan di lokasi Anda. Anda tentu bisa melakukannya tanpa sebagian besar waktu. Namun bijaksana untuk membawa semacam identifikasi pada Anda, untuk berjaga-jaga.
Hal yang sama dapat dikatakan tentang suatu objek. Terlepas dari seluk-beluk lapisan akses data, objek akhirnya memetakan ke entri database tertentu. Entri ini mungkin hanya dapat diidentifikasi secara unik oleh id objek. Jika demikian, maka saya lebih suka untuk memiliki informasi ini tersedia bagi saya kapan saja, terlepas dari apakah saya men-debug beberapa kode UI, angka yang berderak di lapisan bisnis, repositori itu sendiri atau sistem dependen di seluruh layanan web. Atau apakah saya sedang menelusuri log kesalahan dalam hal ini.
Dalam kasus Anda, jika Anda hanya mengambil data dari db dan mendorongnya melalui layanan web, membiarkan id keluar mungkin merupakan hal yang tepat untuk dilakukan. Saya hanya tidak percaya bahwa itu lebih masuk akal daripada menyimpannya dalam kasus umum.
sumber
Anda benar, Anda tidak perlu menyimpan id di objek, selama Anda hanya perlu mengetahuinya dalam konteks repositori Anda.
Situasi berubah ketika Anda meneruskan objek ke kode di luar konteks itu, kode yang tidak meminta objek dengan id (dan karena itu belum mengetahuinya), tetapi membutuhkan id untuk tujuan apa pun (mis. Untuk meletakkannya di daftar id yang akan diminta dari repositori nanti, dengan kode lain).
Dalam situasi itu, Anda memiliki dua opsi:
perkenalkan argumen fungsi baru 'id' di seluruh rantai fungsi antara konteks repositori dan fungsi tempat id diperlukan
sertakan id di objek
Dalam sebagian besar kasus ini, menyimpan id di dalam objek akan menjadi solusi yang lebih baik. Ini juga akan mengurangi perubahan kode ketika id diperlukan di tempat-tempat yang tidak terduga, ditambah lagi mungkin membantu dengan debugging pada waktu-waktu tertentu.
Itu sebabnya saya melakukannya ketika saya melakukannya.
sumber