Jadi saya memiliki layanan web yang memiliki sesuatu seperti di getAccount
mana ia akan mengembalikan pengenal ke akun jika mendapatkannya, selain melemparkan pengecualian. Klien akan selalu ingin membuat akun jika pengecualian dilemparkan dengan info yang sama dengan yang dilakukan.
Saya membuat perpustakaan praktis untuk klien yang akan menangani semua panggilan layanan web di dalamnya sehingga mereka tidak perlu tahu bagaimana melakukan panggilan itu sendiri.
Apa yang saya pikirkan adalah di perpustakaan ini jika saya membuat akun getAccount(accountName)
yang akan mendapatkan akun jika ada, dan jika tidak maka buatlah dan kembalikan info, apakah itu hal yang buruk untuk dilakukan? Haruskah saya serahkan pada klien untuk menangani pengecualian atau cukup beri nama seperti getOrCreateAccount? Apakah itu penting?
Apakah praktik yang buruk untuk membuat sesuatu dalam operasi dapatkan?
sumber
getOrCreateAccount
atau serupa.acquire
, likeacquireAccount
. Itu tidak memiliki makna yang ada dalam protokol utama yang saya temui, dan memiliki cincin imperatif yang cocok untuknya. "Lakukan apa yang harus kamu lakukan untuk mendapatkan salah satu dari ini untukku. Minta, buat, buat palsu, curi, aku tidak peduli, ambilkan aku satu atau mati coba."getSomething()
adalah untuk getter, dansetSomething()
untuk setter. Imo apa pun yang melakukan sesuatu yang lebih intelektual harus dipanggil sesuatu yang lain, yaitufetchSomething
,obtainSomething
,computeSomething
, ataudoSomethingElse
dllJawaban:
Ya itu penting. Menurut pendapat saya, pada umumnya merupakan praktik yang buruk untuk menciptakan sesuatu dalam prosedur yang tidak didokumentasikan memiliki kekuatan penciptaan. Baik nama prosedur
getOrCreate...
atau memilikicreate...
prosedur terpisah dan kemudian jika Anda benar - benar ingin, cobalahgetOrCreate...
yang pertamaget...
, dan jika itu gagal, panggilancreate...
dan panggilanget...
.Pengguna perpustakaan mungkin tidak akan mengharapkan
get...
prosedur untuk membuat jika operasi gagal. Jika mereka tiba-tiba mengetahui bahwa panggilan tes mereka untukget...
menciptakan seluruh data, mereka mungkin akan agak terkejut. Dan bagaimana mereka membersihkannya? Bagaimana jika mereka menulis kode berpikir bahwa mereka akan mendapatkan kesalahan jikaget...
gagal dan mereka ingin mengatasinya dengan cara mereka ?sumber
get...
create...
get...
hanya dua yang pertama. Saya akan berbicara dengan klien tentang apakah mereka akan memerlukan kemampuan untuk sekadar memanggilget
tanpa ingin membuatcreate
dalam nama, hanya untuk menjadi 100% jelas tentang apa yang terjadi.getOrCreate
memiliki prioritas dalam kerangka kerja web yang populer: docs.djangoproject.com/en/1.10/ref/models/querysets/…Tidak, ini bukan 'praktik buruk'. Selama Anda dan pengembang lain sepakat bahwa itulah yang Anda inginkan, itu baik-baik saja. Bagaimanapun, itu akan mengembalikan akun, yang Anda inginkan. Bahwa akun dibuat 'di bawah tenda' tidak relevan bagi penelepon.
sumber
Jika
getAccount()
selalu dapat mengembalikan akun, maka dari sudut pandang penelepon, akun itu memang ada, dan selalu ada. Tidak perlu untukgetAccount()
'membuat' apa pun. Akun tidak harus disimpan di mana pun sampai berbeda dari akun default.sumber
GetOrCreate
adalah semantik yang salah tetapi mendapatkan objek yang mungkin "secara logis" ada apakah secara fisik ada atau tidak ada. Sebagai contoh, sejumlah kecil item yang bisa berubah mungkin tidak memiliki penyimpanan yang dialokasikan untuk elemen 1.841.533, tetapi masih memungkinkan elemen itu untuk "diambil" dengan membuat objek baru, menyimpannya, dan mengembalikan referensi.Masuk akal untuk membuat 3 metode:
getAccount -> Yang baru saja mendapatkan akun.
createAccount -> Membuat akun.
getAccountAndCreateIfNeeded -> Pilih nama Anda sendiri;)
Mengapa pemisahan: Anda memiliki metode sederhana untuk mendapatkan dan membuat. Itu adalah metode yang dapat diuji jelas untuk keduanya. Untuk getAccount bukan pengecualian untuk tidak menemukan akun. Jadi kembalikan saja yang salah atau yang seperti itu, itu yang diharapkan.
Kemudian Anda dapat menggunakan nilai kembali itu dalam fungsi yang dikelompokkan: getAccountAndCreateIfNeeded yang sekarang juga dapat diuji, itu harus selalu mengembalikan akun. Apapun yang kamu minta.
Ketiga metode ini jelas, jelas apa yang mereka lakukan dan apa yang mereka kembalikan. Anda dapat membuat perjanjian sekarang dengan tim Anda, tetapi pengecualian semacam ini mengerikan dalam jangka panjang. Cukup jelaskan dan Anda tidak akan mengalami masalah.
sumber
getAccountIfExists
yang akan mendapatkan akun atau menunjukkan bahwa itu tidak ada tanpa membuat yang baru. ThegetAccount
metode itu sendiri harus mengandaikan bahwa akun itu ada, dan melemparkan pengecualian jika tidak.Itu tergantung keadaan.
Sebagai contoh, Anda dapat menggunakannya untuk melakukan lazy loading / instantiation, menunda pemuatan data atau pembuatan instance hingga benar-benar dibutuhkan. Ini biasanya masuk akal karena menghemat sumber daya yang mungkin tidak Anda butuhkan (jika kelas / data tidak pernah dibutuhkan maka tidak pernah dimuat).
Namun, dalam kasus khusus ini, saya akan mengatakan bahwa memiliki metode yang disebut getAccount yang akan membuat akun baru jika tidak ada tidak akan menjadi praktik yang baik. Jika pengguna telah memberikan beberapa kredensial untuk mengidentifikasi akun tertentu dan akun itu tidak dapat ditemukan, apakah itu berarti bahwa pengguna belum menjadi pelanggan dan harus memiliki akun yang dibuat untuk mereka, atau apakah itu berarti bahwa kredensial salah ketik dan pengguna perlu diminta untuk memverifikasi bahwa mereka telah memasukkan apa yang mereka maksudkan untuk masuk?
Jika Anda memiliki metode getAccount yang memang membuat akun baru jika tidak dapat mengidentifikasi satu, maka Anda tidak punya pilihan dalam masalah ini. Jika Anda membagi pembuatan akun dan menggunakan metode terpisah, maka Anda memiliki lebih banyak fleksibilitas dalam memutuskan apa yang harus dilakukan jika upaya untuk mendapatkan akun gagal.
sumber