Saat memberikan metode logika bisnis untuk mendapatkan entitas domain, haruskah parameter menerima objek atau ID? Sebagai contoh, harus kita lakukan ini:
public Foo GetItem(int id) {}
atau ini:
public Foo GetItem(Foo foo) {}
Saya percaya pada melewatkan objek di sekitar, secara keseluruhan, tetapi bagaimana dengan kasus ini di mana kita mendapatkan objek dan kita hanya tahu ID? Haruskah penelepon membuat Foo kosong dan mengatur ID, atau haruskah itu hanya meneruskan ID ke metode? Karena Foo yang masuk akan kosong, kecuali untuk ID, saya tidak melihat manfaat dari pemanggil harus membuat Foo dan mengatur ID-nya ketika hanya bisa mengirim ID ke metode GetItem ().
sumber
Apakah ini akan melewati kawat (serial / deserialized) kapan saja sekarang atau di masa depan? Pilih tipe ID tunggal daripada objek penuh yang tahu-bagaimana-besar.
Jika Anda mencari tipe-keamanan ID untuk entitasnya, maka ada solusi kode juga. Beri tahu saya jika Anda membutuhkan contoh.
Sunting: memperluas jenis-keamanan ID:
Jadi, mari kita ambil metode Anda:
Kami hanya berharap bahwa bilangan bulat
id
yang diteruskan adalah untukFoo
objek. Seseorang dapat menyalahgunakannya dan memasukkanBar
ID integer suatu objek atau bahkan hanya dengan mengetik tangan812341
. Ini bukan tipe aman untukFoo
. Kedua, bahkan jika Anda menggunakan passFoo
versi objek , saya yakinFoo
memiliki bidang IDint
yang dapat dimodifikasi seseorang. Dan terakhir, Anda tidak bisa menggunakan metode overloading jika ini ada di kelas bersama karena hanya tipe pengembalian bervariasi. Mari kita tulis ulang metode ini sedikit agar terlihat aman di C #:Jadi saya telah memperkenalkan sebuah kelas bernama
IntId
yang memiliki bagian generik untuknya. Dalam kasus khusus ini, saya inginint
yang terkait denganFoo
saja. Saya tidak bisa begitu saja mengenakan pakaian telanjangint
dan saya tidak bisa memberikannya secaraIntId<Bar>
tidak sengaja. Jadi di bawah ini adalah bagaimana saya telah menulis pengidentifikasi tipe-aman ini. Apakah mengambil catatan bahwa manipulasi yang mendasari sebenarnyaint
adalah hanya di lapisan akses data Anda. Apa pun di atas yang hanya melihat tipe kuat dan tidak memiliki (langsung) akses keint
ID internalnya . Seharusnya tidak ada alasan untuk itu.Antarmuka IModelId.cs:
Kelas dasar ModelIdBase.cs:
IntId.cs:
dan, demi kelengkapan basis kode saya, saya juga menulis satu untuk entitas GUID, GuidId.cs:
sumber
Origin
properti: ini sangat mirip skema dalam bahasa SQL Server. Anda mungkin memilikiFoo
yang digunakan dalam perangkat lunak Akuntansi Anda dan yang lainFoo
untuk Sumber Daya Manusia dan ada sedikit bidang untuk membedakannya pada lapisan akses data Anda. Atau, jika Anda tidak memiliki konflik, abaikan seperti saya.Saya tentu setuju dengan kesimpulan Anda. Melewati id lebih disukai karena beberapa alasan:
Foo
objek hanya untuk id berarti membuat nilai yang salah. Seseorang dapat membuat kesalahan dan menggunakan nilai-nilai ini.int
lebih platform-lebar dan dapat dinyatakan secara asli dalam semua bahasa modern. Untuk membuatFoo
objek dengan pemanggil metode, Anda mungkin perlu membuat struktur data yang kompleks (seperti objek json).sumber
Saya pikir Anda akan lebih bijaksana untuk membangun pencarian pada pengidentifikasi objek seperti yang disarankan Ben Voigt.
Namun, ingat bahwa jenis pengidentifikasi objek Anda dapat berubah. Karena itu, saya akan membuat kelas pengidentifikasi untuk masing-masing item saya, dan hanya memungkinkan mencari item melalui instance pengidentifikasi ini. Lihat contoh berikut:
Saya menggunakan enkapsulasi, tetapi Anda juga bisa membuatnya
Item
dariItemId
.Dengan begitu, jika jenis id Anda berubah di sepanjang jalan, Anda tidak perlu mengubah apa pun di
Item
kelas, atau dalam tanda tangan metode GetItem. Hanya dalam implementasi layanan Anda harus mengubah kode Anda (yang merupakan satu-satunya hal yang berubah dalam semua kasus)sumber
Tergantung pada apa metode Anda.
Umumnya untuk
Get methods
, itu adalah akal sehat untuk lulusid parameter
dan mendapatkan objek kembali. Sementara untuk pembaruan atauSET methods
Anda akan mengirim seluruh objek untuk diatur / diperbarui.Dalam beberapa kasus lain di mana Anda
method is passing search parameters
(sebagai kumpulan dari jenis primitif individu) untuk mengambil satu set hasil, mungkin bijaksana untukuse a container to hold
parameter pencarian Anda. Ini berguna jika dalam jangka panjang jumlah parameter akan berubah. Jadi, Andawould not need
harus mengubahsignature of your method, add or remove parameter in all over the places
.sumber