Perusahaan saya telah memutuskan untuk menggunakan prosedur tersimpan untuk semua yang berhubungan dengan database (karena mereka tidak tahu cara lain selain SQL mentah), dan seperti kata pepatah "When in Rome ..." jadi saya mencoba mengikuti. Baru-baru ini saya harus menambahkan perbaikan peretasan yang mengharuskan mengambil nilai basis data, dan karena itu adalah nilai tunggal dari satu tabel, saya menulisnya sebagai inline SQL (parameter, tentu saja) karena sepertinya tidak ada kebutuhan untuk sebuah prosedur tersimpan untuk satu baris kode sepele yang digunakan dalam satu bagian aplikasi sebagai kludge.
Tentu saja, saya sekarang telah diberitahu untuk memperbaikinya dan hanya pernah menggunakan Stored Procs untuk apa pun yang terkait dengan database. Ini terasa terlalu banyak seperti mengikuti dogma secara membabi buta daripada menggunakan akal sehat. Jangan salah paham, saya mengerti tujuan memiliki standar pengkodean tetapi saya juga seorang pendukung mengabaikan standar ketika mereka tidak masuk akal, tidak hanya secara membabi buta mengikuti mereka seolah-olah itu adalah Injil.
sumber
Jawaban:
Standar kode biasanya hanya panduan. Namun, sepertinya perusahaan Anda memiliki kebijakan dan kebijakan biasanya tidak dapat diabaikan. Jika Anda mengungkitnya dan disuruh menggunakan Prosedur Tersimpan sebagai gantinya, maka saya akan melanjutkan dan melakukan itu meskipun saya akan membuat keputusan yang berbeda jika saya memiliki wewenang untuk melakukannya.
sumber
Saya pikir mereka sebenarnya mencoba memisahkan kontrak antara kode aplikasi dan DB. Karena itu, jika mereka perlu mengubah nama kolom, misalnya, mereka hanya perlu memastikan kontrak (SP) berfungsi.
Get_Costumer (), atau apa pun, adalah cara untuk mengabstraksi kode aplikasi dari struktur DB dan itu, menurut pendapat saya praktik terbaik nyata yang harus Anda pertimbangkan untuk diikuti. Secara arsitektur, Anda hampir selalu menginginkan DB dan kode aplikasi dipisahkan.
sumber
Pada awalnya mungkin tampak terlalu berat untuk menjadi kaku tentang pedoman seperti ini, tetapi saya pikir sangat penting untuk tetap berpegang pada pedoman kecuali Anda memiliki alasan yang sangat bagus . Saya mengatakan ini karena teori jendela pecah . Hal ini terutama berlaku jika Anda memiliki pengembang junior yang masih perlu melakukan praktik dan kebiasaan yang baik.
Apakah fakta bahwa perbaikan Anda cepat atau peretasan benar-benar alasan yang cukup baik untuk memecahkan jendela?
Pertimbangkan pengembang yang tidak berpengalaman menjaga kode Anda, mereka mungkin mengubah kueri atau menambahkan yang lain dengan cara yang sama dan tiba-tiba ada eksploitasi keamanan karena mereka tidak menyadari bahwa mengubah kueri yang diperlukan juga mengubah cara dijalankannya.
Catatan: Ini adalah masalah terpisah apakah pedoman itu adalah hal-hal yang harus selalu digunakan di tempat pertama, tapi itu masalah yang perlu dipertimbangkan saat mengatur pedoman. Maksud saya adalah bahwa sekali Anda telah menetapkan hal-hal yang selalu baik, penting untuk menyimpannya.
sumber
REKAM TENTANG JAWABAN LAINNYA
Berikut ini ringkasan singkat dari apa yang orang lain katakan di sini sebelumnya.
Kebijakan pro perusahaan:
Kebijakan perusahaan yang kontra:
MEREKA 2 CENTS
Pertama, banyak jawaban di sini menggunakan kata standar . Praktek melarang permintaan langsung dan hanya mengizinkan sprocs tidak disebut sebagai standar. Ini kebijakan (lihat jawaban jzd ).
Kedua, spesifik untuk masalah Anda: argumen kontra utama saya terhadap kebijakan pembatasan seperti menggunakan prosedur tersimpan secara eksklusif adalah bahasa SQL itu sendiri , dan tidak harus infrastruktur repositori logika bisnis terpusat yang dipromosikannya (meskipun itu juga memiliki argumen-kontra) .
SQL adalah bahasa yang agak kaku dan tidak dapat digabungkan, dengan daya ekspresif yang sangat terbatas . Ini berarti bahwa Anda akan menemui jalan buntu sangat awal berkaitan dengan penggunaan kembali kode . Salah satu alasan kekakuan ini adalah bahwa tidak ada cara untuk melewati fungsi kelas satu dengan cara apa pun (seperti dengan bahasa OOP menggunakan polimorfisme), yang membatasi kompabilitas secara signifikan. Yang paling dekat Anda bisa mendapatkan bahwa dalam kekuatan ekspresif adalah dengan menulis query SQL dinamis yang dibangun menggunakan penggabungan string. Bukan hal yang rapi. Kueri dinamis mengalahkan beberapa poin di bagian "pro", seperti ketergantungan pelacakan antara objek DB, dan biasanya memiliki kinerja yang lebih buruk, rawan kesalahan, sulit untuk debug, dan meningkatkanrisiko serangan injeksi SQL . Sayangnya, dengan SQL Anda akan menemukan bahwa Anda tidak bisa jauh dengan mengekstraksi logika umum yang dapat digunakan kembali antara sprocs tanpa mengenai dinding dan dipaksa untuk menggunakan kueri yang dieksekusi secara dinamis.
PEMBARUAN: Keterbatasan besar lain dari prosedur tersimpan, selain hal fungsi kelas satu, adalah lewat dan kembalinya tipe data komposit sebagai argumen, apakah itu daftar, set, catatan, atau pasangan nilai kunci. Ini juga sangat menyakitkan kompabilitas.
Akhirnya, saya tidak perlu setuju dengan salah satu poin pro di atas, "decoupling DB from application" oleh Jorge : Prinsip utama yang saya rasa berlaku di sini adalah untuk lebih memilih struktur data primitif dengan serangkaian besar operasi yang dapat digunakan kembali dan dapat dikomposisikan secara umum, daripada bekerja dengan API khusus . Sprocs adalah API khusus semacam itu di sini, yang berdiri di antara pengguna dan data relasional primitif untuk menanyakannya menggunakan primitif manipulasi data komposabel ( pilih, gabung, di mana, kelompokkan menurut, dll). Sekarang SQL itu sendiri bukan pilihan ideal untuk menjadi DSL untuk primitif manipulasi data yang dapat dikomposit, karena kekakuan yang disebutkan di atas, tetapi dengan pilihan bahasa yang lebih masuk akal (seperti. NET Linq ... atau Lisp / Clojure!) Anda dapat menjalankan logika terhadap Daftar sederhana dengan cara yang sama seperti melawan DB ResultSet. Jelas, itu membuatnya mudah diuji, yang merupakan Good Thing. Saya katakan lebih suka menyimpan data Anda menjadi sederhana dan primitif, sehingga dapat dihilangkan dengan CSV biasa. Seperti yang Anda lihat, model ini memisahkan DB dari aplikasi juga, hanya itu menarik garis pada tingkat abstraksi yang lebih rendah.
APA YANG HARUS DILAKUKAN SELANJUTNYA?
Ini agak tidak terkait dengan pertanyaan, tetapi saya mendorong Anda untuk melihat Datomic , yang memiliki pendekatan baru yang menarik untuk menyimpan dan menanyakan data, sejalan dengan beberapa pengamatan di atas. (Jelas, maksud saya melihat itu benar-benar di luar lingkungan kerja pertama ... pasti JANGAN pergi ke kantor CTO pada hari berikutnya dan berkata "Hei teman-teman saya menulis ulang beberapa sprocs Anda di Datomic dan menyebarkannya di server prod mengkilap ini melalui di sana, itu benar-benar keren lihat! " Mereka mungkin tidak menghargai kegembiraan yang benar-benar dimengerti;)
sumber
Satu-satunya tempat saya secara rutin mengabaikan standar pengkodean adalah dalam kode autogenerated, jika tidak biasanya ditangani berdasarkan kasus per kasus dan diperiksa ulang dalam tinjauan kode. Anda tidak bisa menjadi budak standar pengkodean, tetapi pengecualian sangat jarang dalam pengalaman saya.
sumber
Jika Anda tidak menggunakan procs yang disimpan maka DB Anda akan membuat perubahan struktur data tanpa mengetahui apa dampaknya pada kode inline Anda yang tidak mereka ketahui. Ini adalah masalah besar untuk pemeliharaan ketika pembuat kode koboi tidak mengikuti desain. Ini bukan tentang standar pengkodean - ini tentang desain. Anda tidak selalu harus menyukai desain atau ingin mengikutinya, tetapi itu bukan panggilan Anda, jadi lakukan saja apa yang diminta. Saya akan memberi Anda satu izin bebas untuk sesuatu seperti ini dan kemudian memecat Anda.
sumber
Sebagai pembuat kode lama dan pemimpin tim, saya harus bisa berpikir di luar kotak. Standar pengkodean membantu menjaga hal-hal tetap menyenangkan, tetapi ketika hal itu menghalangi, akan ada neraka untuk dibayar. Dalam hal ini tergantung pada definisi prosedurnya. Jika bersifat restriktif dan bukan permisif maka terserah pada petunjuk untuk menunjukkan di mana ada masalah.
sumber
Kualitas kode dapat diukur dari keterbacaannya. Yang Anda inginkan adalah melihat kode dan melihat fungsinya.
Inti dari standar pengkodean adalah untuk menegakkan keterbacaan di seluruh tim, karena Anda ingin melihat kode kolega dan melihat apa yang dilakukannya.
Idealnya, ini mengarah pada kode, yang dapat dibaca semua orang. Ini seperti mengharapkan orang berbicara bahasa Inggris yang bersih alih-alih bergumam dengan aksen mereka sendiri dan menulis dengan tingkat ejaan dan tata bahasa yang layak, alih-alih menulis semuanya dalam bahasa lolcat- atau leetspeek.
Sekarang apa yang perusahaan Anda anggap sebagai standar tidak memaksakan keterbacaan di seluruh tim, itu malah mengurangi itu. Untuk setiap permintaan yang dilakukan ke database, Anda harus mencari prosedur yang tersimpan.
Ini seperti mengharapkan orang untuk tidak mengatakan kalimat normal sebagai "Apakah Anda ingin kopi?" untuk mengatakan "Anda memiliki email dengan subjek 'Kopi' di kotak masuk Anda" untuk komunikasi normal. Itu tidak meningkatkan pemahaman di tim Anda, karena prosedur yang tersimpan (atau isi email) bisa saja menjadi omong kosong.
Jadi ini bukan standar pengkodean (masuk akal), melainkan formalitas bodoh. Satu-satunya titik formalitas bodoh adalah, bahwa mereka membantu membatasi jumlah omong kosong yang dapat dibuat seseorang per waktu, tetapi mereka menghalangi orang yang memiliki kontribusi nyata untuk membuat.
Anda harus mencoba berbicara kepada siapa pun yang bertanggung jawab untuk itu (dan menjadi jauh lebih sopan daripada saya;)).
sumber
Jika Anda tidak bisa membuatnya bekerja, saya pikir Anda akan menemukan pengecualian Anda. Pada titik tertentu, tim mengidentifikasi bahwa melakukannya dalam konteks standar Anda, hanya membutuhkan terlalu banyak upaya atau menghasilkan solusi yang buruk, Anda membuat pengecualian yang terdokumentasi. Anda mengubah standar saat ini mulai terlalu sering terjadi.
Anda hanya menggunakan ini sebagai contoh, tetapi apakah membungkus pernyataan pilih dalam prosedur tersimpan sangat sulit? Anda jelas mendapatkan banyak latihan di toko Anda. Ada standar lain yang mungkin lebih sulit untuk diikuti daripada ini. Saya tidak tahu mengapa pemrogram tidak akan memilih untuk menyerahkan ini ke dba (saya tahu, bukan kasus Anda.). Secara pribadi, sql di sebagian besar ide pemrograman terlihat seperti omong kosong, tetapi seperti yang lainnya, Anda terbiasa atau mulai menggunakan ORM.
sumber
Standar dapat diabaikan dalam kondisi berikut:
Ketika Anda telah berbicara dengan sesama pengembang dan memperoleh perjanjian atau Anda telah menetapkan suatu kebijakan yang dimaksudkan untuk diberlakukan atau Anda bisnis Anda memutuskan bahwa tidak mengikuti standar adalah keputusan bisnis yang benar (misalnya jutaan dolar mungkin berada di garis untuk perbaikan "sekarang" terlepas dari apakah itu bertentangan dengan standar).
Ini akan berlaku untuk aturan jika;
mereka telah diabaikan dan disalahgunakan sampai pada titik di mana sebagian besar kode tidak mengikuti mereka.
ada beberapa perangkat standar yang bersaing, dan tidak jelas mana yang akan diterapkan.
standar lokal bertentangan dengan standar industri, misalnya sebuah perusahaan mengatakan kita menggunakan 9 spasi untuk indentasi (!)
Tetapi bahkan dalam 3 contoh di atas aturan GOLDEN adalah, jika memungkinkan, Anda berbicara kepada semua orang yang terkait PERTAMA. Paling tidak (misalnya perbaikan 02:00) Anda harus membahas keputusan Anda sesegera mungkin - dan membahasnya, tidak hanya mengirimkan informasi tentang apa yang Anda lakukan. Bersiaplah untuk kritik dan untuk membuat perubahan.
sumber
Itu selalu OK untuk melanggar standar pengkodean; Namun, ketika Anda melakukannya, Anda harus selalu menulis komentar yang menyebutkan bahwa pelanggaran itu disengaja, dan memberikan semacam pembenaran.
sumber