Dalam aplikasi saya ada beberapa templat ekspresi yang telah ditentukan yang dapat digunakan untuk memfilter data. Salah satunya adalah " between x and y
". Seorang insinyur QA mengklaim bahwa ada cacat dalam definisinya, karena " between 100 and 200
" memberikan hasil yang berbeda dari " between 200 and 100
". Ekspresi diterjemahkan secara internal ke " value >= x and value <= y
", jadi jelas tidak ada hasil ketika batas kedua lebih rendah dari yang pertama. Saya telah memeriksa bahwa perilaku yang sama ada di SQL - " between x and y
" mengasumsikan bahwa y> = x atau tidak ada hasil. Ini berarti bahwa operator tidak komutatif, setidaknya dalam SQL.
Jadi, apakah QA benar bahwa " between x and y
" harus komutatif?
requirements
pkalinow
sumber
sumber
between
harus memasukkan atau mengecualikan nilai yang lebih rendah dan lebih tinggi. Orang QA mungkin bertele-tele tetapi selama ada ketidakpastian seseorang perlu mengklarifikasi cerita pengguna / persyaratan. Mungkin ternyata cara mereka dilakukan adalah seperti yang seharusnya, tetapi keputusan harus diambil.Jawaban:
Jika spec Anda saat ini tidak terdefinisi, perilaku ini sepenuhnya arbitrer, tidak ada definisi "benar" atau "salah". Jadi, jika insinyur QA Anda tidak dapat mengarahkan Anda ke paragraf yang tepat dalam spesifikasi di mana perilaku ini didefinisikan, Anda mungkin dapat menolak permintaannya (meskipun tampaknya tidak menjadi persyaratan yang membutuhkan banyak upaya untuk mengimplementasikannya). Jika Anda berdua tidak dapat menemukan konsensus, satu orang di tim Anda harus membuat keputusan apa yang lebih penting dalam konteks aplikasi:
Apa pun keputusan yang diambil tim Anda, mungkin merupakan ide bagus untuk mendokumentasikan perilaku dan alasan mengapa keputusan itu dibuat.
sumber
Ini adalah pertanyaan tentang kegunaan atau pengalaman pengguna. Bagaimana SQL atau sistem lainnya berperilaku tidak relevan, pertanyaannya adalah apa yang paling masuk akal dari perspektif pengguna.
Perilaku saat ini tidak masuk akal dari perspektif pengguna. Baik x dan y harus dipertukarkan atau tidak boleh memilih x yang lebih besar dari y. Mengizinkan x lebih besar dari y tetapi mengembalikan set kosong memperkenalkan kemungkinan kesalahan yang tidak perlu tanpa memberikan manfaat apa pun.
Jadi insinyur QA benar ada cacat, tetapi solusi yang diusulkan belum tentu yang terbaik. Anda harus melakukan tes kegunaan memutuskan ini, atau setidaknya bertanya kepada beberapa pengguna representatif apa yang tampaknya paling alami bagi mereka.
Atau, Anda dapat mengajukan pertanyaan di /ux// . Orang-orang di sana sebenarnya tahu satu atau dua hal tentang pengalaman pengguna.
sumber
Ada beberapa pilihan yang masuk akal, dan yang harus dipilih tergantung pada sisa sistem, dan harapan pengguna Anda.
Anda bisa, seperti yang ditunjukkan oleh insinyur QA, cukup buat ekspresi komutatif, lalu terjemahannya akan menjadi
between x and y
=>value >= min(x, y) and value <= max(x, y)
Anda dapat membatasi penggunaan yang valid
x <= y
, yang mengharuskan UI Anda dapat menampilkan "itu bukan ekspresi yang valid" sedini mungkin.Sebagai variasi di atas, pembatasan
x < y
jika Anda memiliki ekspresiequals x
dan lebih suka untuk mengevaluasivalue >= x and value <= x
sumber
value >= min(x, y) and value <= max(x, y)
. Hitung ulang apa yang Anda bisa untuk menyimpan pekerjaan server database Anda, terutama jika itu berlebihan seperti itu (Anda dapat melakukan operasi yang relevan sekali dan mengatur kedua hasil sesuai). Mungkin tidak masalah, tergantung pada server basis data dan nilai spesifik yang Anda berikan , tetapi server SQL yang ditulis dengan buruk mungkin melakukanmin
danmax
untuk setiap catatan jika Anda memasukkannya ke dalamwhere
, dan jika Anda dapat menghapus upaya itu , tidak ada alasan untuk tidak melakukannya.value >= min(x, y) and value <= max(x, y)
dapat dibacavalue >= minXY and value <= maxXY
, di manaminXY
danmaxXY
merupakan batas yang telah dihitung. Namun, untuk yang terakhir harus menulis beberapa kode untuk menambahkan dua variabel baru ke sistem, isi sebelumnya, jangan lupa untuk memperbarui nilai-nilai ini ketika x dan y berubah, dan sebagainya. Data yang berlebihan selalu menimbulkan risiko kesalahan tertentu.Dalam pengaturan non-interaktif, di mana batas-batas Anda dibuat oleh sebuah skrip, biasanya masuk akal untuk mengharuskan mereka agar dalam rangka. Ini menciptakan satu pengecekan validasi yang lebih sedikit untuk dilakukan, lebih masuk akal secara semantik, dan mudah untuk dikelola.
Dalam pengaturan interaktif, Anda ingin membantu pengguna. Jika memungkinkan, buat GUI yang tidak memungkinkan rentang yang ditukar dimasukkan, atau setidaknya membuatnya semudah mungkin untuk memasukkan rentang secara berurutan. Jika Anda memasukkan rentang dengan teks, ambil halaman dari vim, paragon kegunaan, dan meminta pengguna untuk secara otomatis bertukar rentang terbalik:
Jika insinyur QA Anda tidak menghalangi UX untuk menunjukkan kepadanya rentang terbalik tidak diinginkan, maka dia membuat asumsi yang masuk akal.
sumber
Terus terang? Jangan gunakan "antara". Sama sekali.
Pertama, istilah ini sangat ambigu, terutama dalam bahasa Inggris. Apakah ini komutatif? Apakah ketentuannya eksklusif? Inklusif?
Kedua, jika Anda melakukan antarmuka yang terpisah dari backend, jangan khawatir tentang perilaku backend; dan jangan biarkan pengguna Anda menganggap perilaku warisan. Tentu, SQL mendefinisikannya
BETWEEN
sebagai inklusif, tetapi ini hampir tidak pernah merupakan perilaku yang diinginkan (misalnya - Jika Anda melakukan sesuatu sepertirows BETWEEN :start and :start + :stride
Anda akan mendapatkanstride + 1
baris).Sebagai gantinya, Anda harus secara eksplisit mendaftar perbandingan untuk titik akhir. "Lebih besar atau sama dengan x". "Sebelum hari ini". Ini menghilangkan ambiguitas. Ini juga membantu menulis kode yang lebih bersih, dan menghindari beberapa kesalahan berbahaya. Contoh baris dari sebelumnya pada dasarnya adalah posting Djikstra tentang pengindeksan . Dan memungkinkan SQL untuk menggunakan batas atas inklusif pada beberapa jenis dapat mengakibatkan data yang dipilih salah .
sumber
Tidak produktif berdebat dengan QA Anda tentang siapa yang "benar" dan siapa yang "salah". Anda mengartikan spec secara berbeda dari yang mereka lakukan. Itu berarti bahwa spesifikasi tersebut cukup ambigu sehingga memerlukan klarifikasi.
Jika antarmuka pengguna adalah spec, dan itu bukan perilaku yang diharapkan QA, itu tidak akan menjadi perilaku setidaknya beberapa pengguna harapkan. Itu menunjukkan masalah kegunaan (bahkan jika Anda ingin berdebat PEBKAC). Bekerja dengan QA Anda untuk menemukan solusi yang memuaskan untuk itu.
Sebagai poin umum, berhati-hatilah dengan kata-kata seperti "antara" yang tampak jelas, tetapi tidak. Terlepas dari ketidaksepakatan Anda tentang apakah harus bepergian, mereka bermasalah dengan inklusivitas di kedua ujungnya, dan secara intuitif dapat berarti hal-hal yang berbeda pada domain yang berbeda (misalnya, "antara Jumat dan Senin" akan berarti sesuatu yang berbeda bagi kebanyakan orang daripada "antara Senin dan Jumat")
sumber
Saya akan menggunakan prinsip UNIX yang berbicara tentang antarmuka sederhana.
Di mana pun ada antarmuka yang Anda tawarkan ke dunia luar, pertahankan hal yang paling mengejutkan!
Sekarang saya telah mengurangi pernyataan masalah menjadi yang lebih pragmatis, saya pikir itu akan membawa Anda hanya beberapa saat untuk menyadari bahwa ketika menentukan rentang angka, itu jelas untuk menjaga yang lebih kecil sebagai yang sebelumnya. Jika masih teka-teki, pikirkan seperti ini- Berapa kali Anda menggunakan cara sebaliknya untuk mewakili dua angka sambil memberi tahu anak-anak cara membandingkannya?
Jika insinyur QA Anda menyebutnya bug, katakan padanya dengan sopan bahwa Anda mengharapkan beberapa bug nyata , dan bukan cara untuk mengarahkan energi yang mahal pada hal-hal sepele.
sumber
Jadikan kode debug Anda melemparkan kondisi kesalahan atau catat peringatan setiap kali nilai-nilai dilewati dengan urutan yang salah. Dengan cara ini kode panggilan dapat memeriksa dan bertukar parameter, jika perlu. Dengan cara ini pengguna 'fitur' ini akan menjadi sadar dan melakukan hal yang benar (yang sebelumnya tidak Anda ketahui).
sumber