Tim kami mengadakan diskusi berikut:
Katakanlah kita memiliki dua metode berikut:
public Response Withdraw(int clubId, int terminalId,int cardId, string invoice, decimal amount);
public Response Withdraw(Club club, Terminal terminal,Card card, string invoice, decimal amount);
apa yang dikirim over-the-wire hanyalah id.
satu pihak mengatakan bahwa metode pertama benar, karena kita hanya memiliki id terminal dan klub, dan harus jelas bahwa kita tidak memiliki yang lain, ini adalah pendekatan saya.
pihak lain mengatakan bahwa metode kedua benar karena lebih fleksibel.
Kita terbiasa dengan gagasan parameter objek, di sisi lain juga berpikir bahwa parameter objek harus memiliki objek sebagai properti.
Mana pendekatan yang benar?
Mungkin ada pendekatan ketiga yang lebih baik?
Jawaban:
Jawabannya tergantung konteks.
Jika klien diharapkan sudah memiliki semua objek tersebut , saya akan menggunakan parameter objek. Kalau tidak, kode mereka akan terlihat lebih berbelit-belit daripada yang seharusnya. (Misalnya, mereka akan memiliki panggilan seperti
club.getId()
, misalnya.)Jika klien hanya akan memiliki id yang tersedia dengan mudah, maka mungkin pendekatan kedua lebih baik, karena Anda mungkin tidak ingin klien harus merakit / memuat semua objek jika Anda benar-benar hanya membutuhkan id.
Opsi adalah untuk menyediakan kedua metode , sehingga klien dapat memilih mana yang akan digunakan (mengingat bahwa ini tidak mengacaukan API Anda)
Secara umum parameter objek lebih dapat diperluas, karena jika di masa depan Anda membutuhkan data lain untuk melakukan pekerjaan, Anda tidak perlu memperkenalkan metode lain yang mengambil info tambahan.
Terakhir, tanda tangan metode Anda tidak boleh ditentukan oleh hal-hal spesifik yang dilakukan metode tersebut (dalam kasus Anda, apa yang sebenarnya terjadi di atas kawat). API harus masuk akal secara abstrak sehingga jika implementasi berubah, Anda tidak kacau.
sumber
Pendekatan pertama adalah indikasi Obsesi Primitif . Karena Anda melewatkan int dan string, sangat mudah bagi programmer untuk membuat kesalahan (misalnya mengirimkan clubId ke parameter terminalId). Ini akan menghasilkan bug yang sulit ditemukan.
Dalam contoh kedua, tidak mungkin untuk lulus klub ketika terminal diharapkan - ini akan memberi Anda kesalahan waktu kompilasi.
Meski begitu, saya masih akan melihat
string invoice
. Apakah faktur benar-benar sebuah string? Apaamount
artinya Ini lebih cenderung nilai moneter.Anda menyebutkan dalam pertanyaan Anda "apa yang dikirim lewat kabel hanyalah id.". Ini benar, tetapi jangan biarkan persyaratan ini memperkeruh domain Anda.
Penjelasan terbaik yang saya lihat dalam mendukung pendekatan ini adalah dalam aturan 3 dari Object Calisthenics :
sumber
Tidak ada jawaban yang tepat untuk ini. Pilihan mana pun bisa tepat untuk pekerjaan itu. Yah hampir bagaimanapun, argumen faktur mengangkat alis di alis saya, saya tidak tahu apa itu dari membaca kode.
Jika Anda mengirim id, maka kedua sistem harus dipasangkan dengan erat pada apa yang diwakilinya. ClubID adalah kunci dalam tabel klub. Lebih penting lagi, baik penelepon dan callee perlu menyetujui apa yang disebut tabel Clubs dan basis data yang mana. Jika Anda tidak ingin atau tidak dapat memaksakan kendala itu, maka Anda akan meneruskan objek menggunakan beberapa deskripsi umum, asli, serial, xml, nama = nilai apa pun, file ini :)
Bahwa ketika Anda mengidentifikasi akan dikenakan biaya "melalui kabel". Menghindari itu hanya dengan mengirimkan biaya pengidentifikasi Anda di tempat lain. Jadi yang mana yang paling tidak menyakitimu, sekarang (atau mungkin nanti ...) adalah indikator baik vs buruk.
sumber