Saya memiliki fungsi yang mengambil set parameter, kemudian berlaku untuk mereka sebagai syarat untuk query SQL. Namun, sementara saya memilih array argumen tunggal yang berisi kondisi itu sendiri:
function searchQuery($params = array()) {
foreach($params as $param => $value) {
switch ($param) {
case 'name':
$query->where('name', $value);
break;
case 'phone':
$query->join('phone');
$query->where('phone', $value);
break;
}
}
}
Rekan saya lebih suka mendaftarkan semua argumen secara eksplisit sebagai gantinya:
function searchQuery($name = '', $phone = '') {
if ($name) {
$query->where('name', $value);
}
if ($phone) {
$query->join('phone');
$query->where('phone', $value);
}
}
Argumennya adalah bahwa dengan mendaftar argumen secara eksplisit, perilaku fungsi menjadi lebih jelas - sebagai lawan harus mempelajari kode untuk mencari tahu apa argumen misterius $param
itu.
Masalah saya adalah ini menjadi sangat bertele-tele ketika berhadapan dengan banyak argumen, seperti 10+. Apakah ada praktik yang disukai? Skenario terburuk saya akan melihat sesuatu seperti berikut:
searchQuery('', '', '', '', '', '', '', '', '', '', '', '', 'search_query')
php
functions
switch-statement
parameters
xiankai
sumber
sumber
foreach
ini tidak perlu, Anda bisa menggunakanif(!empty($params['name']))
alih-alihforeach
danswitch
.!empty($params['name'])
untuk menguji parameter - misalnya, string "0" akan kosong. Lebih baik digunakanarray_key_exists
untuk memeriksa kunci, atauisset
jika Anda tidak pedulinull
.Jawaban:
IMHO kolega Anda sudah benar untuk contoh di atas. Preferensi Anda mungkin singkat, tetapi juga kurang dapat dibaca dan karenanya kurang dapat dipertahankan. Ajukan pertanyaan mengapa repot-repot menulis fungsi di tempat pertama, apa fungsi Anda 'bawa ke meja'- Saya harus memahami apa fungsinya dan bagaimana melakukannya, secara sangat rinci, hanya untuk menggunakannya. Dengan contohnya, meskipun saya bukan seorang programmer PHP, saya dapat melihat cukup detail dalam deklarasi fungsi sehingga saya tidak perlu khawatir dengan implementasinya.
Sejauh sejumlah besar argumen, itu biasanya dianggap sebagai bau kode. Biasanya fungsi ini mencoba melakukan terlalu banyak? Jika Anda benar-benar menemukan kebutuhan untuk sejumlah besar argumen, kemungkinan mereka terkait dalam beberapa cara dan termasuk bersama dalam satu atau beberapa struktur atau kelas (bahkan mungkin berbagai item terkait seperti baris dalam alamat). Namun, melewatkan array yang tidak terstruktur tidak menyebabkan bau kode.
sumber
where
argumen, satu untukjoin
penspesifikasi dll. Dengan memberi nama mereka dengan tepat yang masih akan mendokumentasikan diri.Jawaban saya kurang lebih agnostik bahasa.
Jika satu-satunya tujuan pengelompokan argumen dalam struktur data yang kompleks (tabel, catatan, kamus, objek ...) adalah meneruskannya secara keseluruhan ke suatu fungsi, lebih baik menghindarinya. Ini menambah lapisan kompleksitas yang tidak berguna dan membuat niat Anda menjadi tidak jelas.
Jika argumen yang dikelompokkan memiliki makna sendiri, maka lapisan kompleksitas membantu memahami keseluruhan desain: sebagai gantinya beri nama layer abstraksi.
Anda mungkin menemukan bahwa alih-alih selusin argumen individual atau satu array besar, desain terbaik adalah dengan dua atau tiga argumen yang masing-masing mengelompokkan data yang berkorelasi.
sumber
Dalam kasus Anda, saya lebih suka metode kolega Anda. Jika Anda menulis model dan saya menggunakan model Anda untuk mengembangkannya. Saya melihat tanda tangan metode kolega Anda dan dapat segera menggunakannya.
Sementara, saya harus melalui implementasi
searchQuery
fungsi Anda untuk melihat parameter apa yang diharapkan oleh fungsi Anda.Saya lebih suka pendekatan Anda hanya dalam kasus ketika
searchQuery
terbatas hanya mencari dalam satu tabel, sehingga tidak akan ada bergabung. Dalam hal ini fungsi saya akan terlihat seperti ini:Jadi, saya segera tahu bahwa elemen-elemen array sebenarnya adalah nama-nama kolom dari tabel tertentu yang diwakili oleh kelas yang memiliki metode ini dalam kode Anda.
sumber
Lakukan keduanya, semacam.
array_merge
memungkinkan daftar eksplisit di bagian atas fungsi, seperti yang disukai rekan kerja Anda, sambil menjaga agar parameter tidak menjadi berat, seperti yang Anda inginkan.Saya juga sangat menyarankan menggunakan saran @ chiborg dari komentar pertanyaan - itu jauh lebih jelas apa yang Anda inginkan.
sumber
Anda juga bisa melewatkan string yang menyerupai string kueri, dan menggunakan
parse_str
(karena sepertinya Anda menggunakan PHP, tetapi solusi lain mungkin tersedia dalam bahasa lain) untuk memprosesnya menjadi array di dalam metode:dan menyebutnya seperti
Anda dapat menggunakan
http_build_query
untuk mengonversi dari array asosiatif ke string (kebalikan yangparse_str
terjadi).sumber