Kapan pernyataan harus tetap dalam kode produksi? [Tutup]

166

Ada diskusi yang terjadi di comp.lang.c ++. Dimoderasi tentang apakah atau tidak, yang dalam C ++ hanya ada di debug build secara default, harus disimpan dalam kode produksi atau tidak.

Jelas, setiap proyek adalah unik, jadi pertanyaan saya di sini adalah tidak begitu banyak apakah pernyataan harus disimpan, tetapi di mana kasus ini dianjurkan / bukan ide yang baik.

Maksud saya, maksud saya:

  • Pemeriksaan run-time yang menguji suatu kondisi yang, ketika salah, mengungkapkan bug dalam perangkat lunak.
  • Suatu mekanisme dimana program dihentikan (mungkin setelah pekerjaan pembersihan yang sangat minim).

Saya tidak perlu berbicara tentang C atau C ++.

Pendapat saya sendiri adalah bahwa jika Anda adalah programmer, tetapi tidak memiliki data (yang merupakan kasus dengan kebanyakan aplikasi desktop komersial), Anda harus tetap menggunakannya, karena pernyataan yang gagal menunjukkan bug, dan Anda tidak boleh pergi aktif dengan bug, dengan risiko merusak data pengguna. Ini memaksa Anda untuk menguji dengan kuat sebelum mengirim, dan membuat bug lebih terlihat, sehingga lebih mudah dikenali dan diperbaiki.

Apa pendapat / pengalaman Anda?

Bersulang,

Carl

Lihat pertanyaan terkait di sini


Tanggapan dan Pembaruan

Hei Graham,

Pernyataan adalah kesalahan, murni dan sederhana dan karenanya harus ditangani seperti itu. Karena kesalahan harus ditangani dalam mode rilis maka Anda tidak benar-benar membutuhkan pernyataan.

Itu sebabnya saya lebih suka kata "bug" ketika berbicara tentang pernyataan. Itu membuat segalanya lebih jelas. Bagi saya, kata "kesalahan" terlalu kabur. File yang hilang adalah kesalahan, bukan bug, dan program harus menghadapinya. Mencoba untuk menunjukkan referensi null pointer adalah bug, dan program harus mengakui bahwa ada sesuatu yang berbau keju buruk.

Oleh karena itu, Anda harus menguji pointer dengan penegasan, tetapi keberadaan file dengan kode penanganan kesalahan yang normal.


Sedikit di luar topik, tetapi poin penting dalam diskusi.

Sebagai kepala-up, jika pernyataan Anda masuk ke debugger ketika gagal, mengapa tidak. Tetapi ada banyak alasan file tidak bisa ada yang sepenuhnya di luar kendali kode Anda: hak baca / tulis, disk penuh, perangkat USB dicabut, dll. Karena Anda tidak memiliki kontrol atasnya, saya merasa pernyataan bukan cara yang tepat untuk menghadapinya.

Carl


Thomas,

Ya, saya memiliki Kode Lengkap, dan harus mengatakan saya sangat tidak setuju dengan saran khusus itu.

Katakan pengalokasi memori khusus Anda mengacaukan, dan nol sepotong memori yang masih digunakan oleh beberapa objek lain. Kebetulan saya nol pointer yang objek ini dereferensi secara teratur, dan salah satu invarian adalah bahwa pointer ini tidak pernah nol, dan Anda memiliki beberapa pernyataan untuk memastikan itu tetap seperti itu. Apa yang Anda lakukan jika pointer tiba-tiba nol. Anda hanya jika () di sekitarnya, berharap itu berfungsi?

Ingat, kita berbicara tentang kode produk di sini, jadi tidak ada pembobolan terhadap debugger dan memeriksa status lokal. Ini adalah bug nyata pada mesin pengguna.

Carl

tidak diketahui
sumber
3
Ada posting terkait yang menarik di Rekayasa Perangkat Lunak SE (meskipun diskusi ini c ++ terfokus): Haruskah ada pernyataan dalam rilis build
sonny

Jawaban:

84

Pernyataan adalah komentar yang tidak menjadi ketinggalan zaman. Mereka mendokumentasikan keadaan teoritis mana yang dimaksudkan, dan negara mana yang seharusnya tidak terjadi. Jika kode diubah sehingga menyatakan perubahan diizinkan, pengembang segera diberitahu dan perlu memperbarui pernyataan.

MSalters
sumber
16
@ jkschneider: unit test adalah untuk menguji berbagai hal dalam lingkup kode program. pernyataan untuk memastikan bahwa asumsi yang menjadi dasar kode sebenarnya benar dalam kenyataannya, sebelum kode melanjutkan pemrosesan berdasarkan asumsi tersebut. Mereka "dokumentasi" dalam arti bahwa, jika ternyata tidak menjadi kasus, program akan membatalkan, menyatakan asumsi, dan menunjukkan bahwa asumsi tidak berlaku. Anda juga dapat membaca pernyataan itu sebagai dokumentasinya dalam kode, tentu saja.
2
Ini adalah jawaban terbaik karena ini berhubungan dengan komentar, yang merupakan cara berpikir yang bermanfaat untuk mereka. Mereka adalah langkah dari komentar karena mereka terus diuji mesin selama pengembangan, tetapi mereka harus selalu bermakna bagi pembaca manusia terlebih dahulu. Sama seperti komentar, mereka tidak boleh menjadi bagian dari logika atau eksekusi akhir. Sama seperti komentar, Anda dapat meninggalkan atau mengeluarkannya tergantung pada apakah bahasa dikompilasi atau ditafsirkan, rencana peluncuran Anda, strategi kebingungan, dll. Saya telah melihat satu kasus di mana komentar benar-benar menyebabkan bug, tetapi itu yang aneh.
DaveWalley
1
Lebih khusus lagi, pernyataan bersifat informasi dan tidak fungsional . Penegasan dengan sendirinya tidak berpengaruh pada aliran atau hasil program. Pengecualian di sisi lain, mengubah aliran program dan dengan demikian menghasilkan.
yoyo
59

Izinkan saya mengutip Kode Lengkap Steve McConnell. Bagian tentang Pernyataan adalah 8.2.

Biasanya, Anda tidak ingin pengguna melihat pesan pernyataan dalam kode produksi; pernyataan terutama untuk digunakan selama pengembangan dan pemeliharaan. Pernyataan biasanya dikompilasi ke dalam kode pada waktu pengembangan dan dikompilasi keluar dari kode untuk produksi.

Namun, kemudian di bagian yang sama, saran ini diberikan:

Untuk kode yang sangat kuat, tegaskan dan kemudian atasi kesalahannya.

Saya pikir selama kinerjanya tidak menjadi masalah, biarkan pernyataan itu muncul, tetapi alih-alih menampilkan pesan, minta ia menulis ke file log. Saya pikir saran itu juga ada dalam Kode Lengkap, tetapi saya tidak menemukannya sekarang.

Thomas Owens
sumber
7
Saya pikir apa arti kutipan kedua dari Code Complete adalah bahwa Anda harus memiliki pernyataan - yang akan dikompilasi dalam kode produksi - dan Anda juga harus memiliki "if (! Condition) {AttemptGracefulRecovery ();}", yaitu don biarkan pelanggaran invarian program merusak program.
yoyo
34

Biarkan pernyataan diaktifkan dalam kode produksi, kecuali jika Anda telah mengukur bahwa program berjalan lebih cepat secara signifikan dengan mereka dimatikan.

jika tidak layak diukur untuk membuktikannya lebih efisien, maka itu tidak layak mengorbankan kejelasan untuk pertaruhan kinerja. "- Steve McConnell 1993

http://c2.com/cgi/wiki?ShipWithAssertionsOn

David Cary
sumber
11
Sebenarnya, hal terburuk yang terjadi adalah ketika kode crash karena sesuatu yang TIDAK tegas. Jika kode pasti macet nanti dengan probabilitas 100%, maka pernyataan itu harus benar-benar ada. Jika Anda melakukan penunjuk, maka Anda harus secara implisit menyatakan bahwa itu bukan nol sebelumnya. Jika Anda membaginya dengan angka, Anda menyatakan bahwa itu bukan nol. Keluarkan pernyataan dan semua lokasi macet TIDAK DIDOKUMEN. Masalah sebenarnya adalah tidak menyusun program untuk membiarkan subsistem macet dan dimulai kembali oleh pengawas.
Rob
5
assert ref != null;berbeda dari if (ref == null) throw new IllegalArgumentException();Anda tidak boleh menggunakan yang pertama untuk prasyarat yang bisa salah. Anda perlu menggunakan assertuntuk hal-hal yang tidak bisa salah. Contoh, int i = -1 * someNumber; i = i * i;lalu untuk mengingatkan orang-orang yang ipositif,assert i > 0;
Kapten Man
1
"Sebenarnya, hal terburuk yang terjadi adalah ketika kode crash karena sesuatu yang BUKAN pernyataan. Jika kode pasti akan crash nanti dengan probabilitas 100%, maka pernyataan itu pasti benar-benar ada." - ini adalah dikotomi palsu.
Rob Grant
2
@RobertGrant: Untuk banyak program, menabrak bukanlah hal terburuk yang dapat terjadi. Untuk program yang seharusnya memeriksa kesehatan desain bangunan atau jembatan, salah melaporkan bahwa desain adalah suara bisa menjadi hal terburuk yang bisa dilakukan. Untuk program yang terpapar ke dunia luar tetapi memiliki akses hanya baca ke data rahasia, membocorkan data itu mungkin lebih buruk daripada apa pun yang bisa dilakukan program. Gagasan bahwa kecelakaan tanpa indikasi yang bermakna tentang penyebabnya adalah "hal terburuk yang bisa terjadi" mengabaikan banyak bahaya yang jauh lebih buruk.
supercat
@supercat saya tidak setuju dengan komentar yang saya kutip.
Rob Grant
21

Jika Anda bahkan berpikir untuk membiarkan asersi dalam produksi, Anda mungkin menganggapnya salah. Inti dari pernyataan adalah bahwa Anda dapat mematikannya dalam produksi, karena mereka bukan bagian dari solusi Anda. Mereka adalah alat pengembangan, yang digunakan untuk memverifikasi bahwa asumsi Anda benar. Tetapi saat Anda mulai berproduksi, Anda harus sudah memiliki kepercayaan pada asumsi Anda.

Yang mengatakan, ada satu kasus di mana saya akan mengaktifkan pernyataan dalam produksi: Jika kita menemukan bug yang dapat direproduksi dalam produksi yang kita mengalami kesulitan mereproduksi dalam lingkungan pengujian, mungkin membantu untuk mereproduksi bug dengan pernyataan diaktifkan. dalam produksi, untuk melihat apakah mereka memberikan informasi yang bermanfaat.

Pertanyaan yang lebih menarik adalah ini: Dalam fase pengujian Anda, kapan Anda mematikan pernyataan?

MiguelMunoz
sumber
4
Saya pikir pernyataan tidak boleh dimasukkan dalam kode produksi. pernyataan BUKAN kesalahan, itu dirancang untuk pengembang. Pernyataan hanya boleh hidup dalam kode uji. Memiliki aplikasi crash karena dan pernyataan gagal pengembangan yang tidak dapat diterima dan ceroboh. Pengembang perlu bekerja ekstra untuk menangani kesalahan dengan anggun.
iksnae
9
Jika tidak terhindarkan Anda akan crash karena diberikan null pointer ke fn; tidak ada pilihan untuk menghadapinya secara eksplisit. Anda juga memiliki beberapa cara untuk menangani kondisi dengan anggun (karena dapat berasal dari input dari dunia luar), atau Anda menabrak di lokasi yang DOKUMEN dengan tegas, bukan di tempat acak yang mungkin telah merusak barang-barang di sepanjang jalan. bagaimana penegasan ditangani harus menjadi keputusan per-modul. Mungkin watchdog Anda me-restart proses, atau Anda menghapus sepotong memori untuk modul itu untuk mengatur ulang untuk memulai keadaan (objek lunak "reboot").
Rob
1
Saya pikir ini adalah pandangan terbatas tentang penggunaan pernyataan. Saya selalu mencatat pernyataan untuk konsol dan penyimpanan cloud, dan membiarkannya dalam produksi. Meninggalkan menegaskan pada mengkonfirmasi bahwa asumsi saya tetap benar bahkan dalam kode produksi dan penggunaan produksi. Hanya karena kode berjalan beberapa kali berhasil dalam debug dengan pernyataan tidak berarti pengguna tidak akan menemukan cara untuk melewatkan nilai yang berbeda melalui jalur kode yang sama.
SafeFastExpressive
Inti dari pernyataan tegas adalah bahwa Anda dapat mengaktifkan atau menonaktifkan cek. Jika Anda membiarkannya dalam produksi, mengapa menggunakan pernyataan tegas?
MiguelMunoz
1
Pernyataan sering memperlambat sistem. Karena mereka tidak dirancang untuk produksi, mereka bebas untuk lambat dan tidak efisien, yang mungkin diperlukan untuk melakukan pengujian tertentu. Sebagai contoh, Microsoft pernah menambahkan fitur rekalkulasi cepat ke Excel. Ketika satu sel berubah, fitur ini membatasi penghitungan ulang hanya sel yang membutuhkannya. Mereka menguji ini dengan pernyataan yang menghitung ulang seluruh lembar kerja dan membandingkan hasilnya. Ini membuat versi pengembangan berjalan sangat lambat, tetapi juga menghilangkan banyak bug. Ketika mereka merilis fitur ini, itu terbukti sangat dapat diandalkan.
MiguelMunoz
16

Pernyataan tidak boleh berada dalam kode produksi. Jika pernyataan tertentu sepertinya bermanfaat dalam kode produksi, maka itu tidak boleh menjadi pernyataan; itu harus menjadi run time error cek, yaitu sesuatu kode seperti ini: if( condition != expected ) throw exception.

Istilah 'pernyataan' berarti "pemeriksaan waktu pengembangan saja yang tidak akan dilakukan di lapangan."

Jika Anda mulai berpikir bahwa pernyataan mungkin akan sampai ke lapangan, maka Anda juga akan mulai membuat pikiran berbahaya lainnya, seperti bertanya-tanya apakah pernyataan yang diberikan benar-benar layak dibuat. Tidak ada pernyataan yang tidak layak dibuat. Anda seharusnya tidak pernah bertanya pada diri sendiri "haruskah saya menyatakan ini atau tidak?" Anda seharusnya hanya bertanya pada diri sendiri, "Adakah yang saya lupa nyatakan?"

Mike Nakis
sumber
6

Kecuali jika profiling menunjukkan bahwa pernyataan tersebut menyebabkan masalah kinerja, saya katakan mereka juga harus tetap dalam rilis produksi.

Namun, saya pikir ini juga mengharuskan Anda menangani kegagalan pernyataan dengan anggun. Sebagai contoh, mereka harus menghasilkan jenis dialog umum dengan opsi (secara otomatis) melaporkan masalah kepada pengembang, dan tidak hanya berhenti atau crash program. Selain itu, Anda harus berhati-hati untuk tidak menggunakan pernyataan untuk kondisi yang sebenarnya Anda izinkan, tetapi mungkin tidak suka atau menganggap tidak diinginkan. Ketentuan tersebut harus ditangani oleh bagian lain dari kode.

Anders Sandvig
sumber
Seperti yang saya lihat, tujuan utama dari pernyataan produksi adalah sebagai penghalang darurat: membiarkan program untuk melanjutkan sangat mungkin menyebabkan kerusakan yang cukup serius sehingga mencegahnya lebih penting daripada hal lain yang mungkin dilakukan oleh program. Memiliki pesan kesalahan yang baik akan bagus, jika mungkin, tetapi itu hanya kepentingan sekunder.
supercat
5

Dalam C ++ saya, saya mendefinisikan REQUIRE (x) yang seperti menegaskan (x) kecuali bahwa itu melempar pengecualian jika pernyataan gagal dalam membangun rilis.

Karena pernyataan yang gagal menunjukkan bug, itu harus diperlakukan dengan serius bahkan dalam rilis Rilis. Ketika masalah kinerja kode saya, saya akan sering menggunakan REQUIRE () untuk kode tingkat lebih tinggi dan menegaskan () untuk kode tingkat lebih rendah yang harus berjalan cepat. Saya juga menggunakan REQUIRE alih-alih menegaskan apakah kondisi kegagalan mungkin disebabkan oleh data yang dikirimkan dari kode yang ditulis oleh pihak ketiga, atau oleh file korupsi (secara optimal saya akan merancang kode secara khusus untuk berperilaku baik dalam kasus korupsi file, tetapi kami tidak selalu punya waktu untuk melakukan itu.)

Mereka mengatakan Anda tidak harus menunjukkan pesan tegas kepada pengguna akhir karena mereka tidak akan memahaminya. Begitu? Pengguna akhir dapat mengirimi Anda email dengan tangkapan layar atau teks pesan kesalahan, yang membantu Anda melakukan debug. Jika pengguna hanya mengatakan "macet", Anda kurang memiliki kemampuan untuk memperbaikinya. Akan lebih baik untuk mengirim pesan kegagalan pernyataan ke diri Anda secara otomatis melalui internet, tetapi itu hanya berfungsi jika pengguna memiliki akses internet dan Anda bisa mendapatkan izin mereka.

Qwertie
sumber
Mereka juga mengatakan Anda seharusnya tidak menunjukkan pesan
tegas itu
4

Jika Anda ingin menyimpannya ganti dengan penanganan kesalahan. Tidak ada yang lebih buruk dari sebuah program yang hilang begitu saja. Saya melihat tidak ada yang salah dengan memperlakukan kesalahan tertentu sebagai bug serius, tetapi mereka harus diarahkan ke bagian program Anda yang dilengkapi untuk menanganinya dengan mengumpulkan data, mencatatnya, dan memberi tahu pengguna bahwa aplikasi Anda memiliki beberapa kondisi yang tidak diinginkan dan keluar.

bruceatk
sumber
2

Asalkan mereka ditangani sama seperti kesalahan lainnya, saya tidak melihat masalah dengan itu. Ingatlah bahwa pernyataan gagal dalam C, seperti bahasa lain, hanya akan keluar dari program, dan ini biasanya tidak cukup untuk sistem produksi.

Ada beberapa pengecualian - PHP, misalnya, memungkinkan Anda membuat custom handler untuk kegagalan asersi sehingga Anda dapat menampilkan kesalahan khusus, melakukan pendataan terperinci, dll. Bukan hanya keluar.

Steve M
sumber
2

Perangkat lunak server database kami berisi pernyataan produksi dan debug. Pernyataan debug hanya bahwa - mereka dihapus dalam kode produksi. Pernyataan produksi hanya terjadi jika (a) ada kondisi yang seharusnya tidak pernah ada dan (b) tidak mungkin untuk pulih dari kondisi ini secara andal. Pernyataan produksi menunjukkan bahwa bug dalam perangkat lunak telah ditemukan atau beberapa jenis korupsi data telah terjadi.

Karena ini adalah sistem basis data dan kami menyimpan data yang berpotensi penting perusahaan, kami melakukan apa pun yang kami bisa untuk menghindari data yang rusak. Jika ada kondisi yang dapat menyebabkan kami menyimpan data yang salah, kami segera menegaskan, mengembalikan semua transaksi, dan menghentikan server.

Karena itu, kami juga mencoba untuk menghindari pernyataan produksi dalam rutinitas kritis kinerja.

Graeme Perrow
sumber
5
Saya akan menyebut "pernyataan produksi" Anda sebagai "pengecualian", dan beri kode seperti itu.
DaveWalley
1
Anda mungkin benar tetapi produk ini awalnya ditulis dalam C. Bahkan ketika kami mengubahnya menjadi C ++ kompiler yang kami gunakan pada beberapa platform kami tidak mendukung pengecualian. Sebagian besar kode lama tidak ditulis ulang dalam C ++ sehingga pernyataan ini masih digunakan.
Graeme Perrow
1

Saya melihat menegaskan sebagai tes unit in-line. Berguna untuk tes cepat saat berkembang, tetapi pada akhirnya pernyataan tersebut harus di refactored untuk diuji secara eksternal dalam unit test.

Weston
sumber
Menegaskan: Nyatakan fakta atau kepercayaan. Itu bukan untuk pengujian (hanya), tetapi untuk menyatakan apa yang Anda anggap benar (yaitu, asumsi Anda), sehingga program Anda tidak akan berlanjut jika asumsi Anda salah karena suatu alasan. Sebagai contoh, ini adalah penggunaan pernyataan yang valid: pernyataan (pow (1,0) <1). Ini sebenarnya bukan tempat yang tepat untuk pengecekan kesalahan, karena jika itu tidak benar, maka hampir semua matematika modern salah, dan ... yah, bagaimana Anda akan mulai mengatasinya? Menangani asumsi yang salah itu berada di luar cakupan program; Anda mengambilnya dengan iman. Tapi bagaimanapun Anda memverifikasi.
1

Saya menemukan yang terbaik untuk menangani semua kesalahan yang ada dalam ruang lingkup, dan menggunakan pernyataan untuk asumsi yang kami nyatakan BENAR.

yaitu, jika program Anda membuka / membaca / menutup file, maka tidak dapat membuka file dalam ruang lingkup - itu kemungkinan nyata, yang akan lalai untuk diabaikan, dengan kata lain. Jadi, kode kesalahan pengecekan harus dikaitkan dengannya.

Namun, misalkan fopen Anda () didokumentasikan sebagai selalu mengembalikan pegangan file yang valid dan terbuka. Anda membuka file, dan meneruskannya ke fungsi readfile () Anda.

Fungsi readfile itu, dalam konteks ini, dan mungkin sesuai dengan spesifikasi desainnya, dapat mengasumsikan itu akan mendapatkan ptr file yang valid. Jadi, akan sia-sia menambahkan kode penanganan kesalahan untuk kasus negatif, dalam program yang begitu sederhana. Namun, paling tidak harus mendokumentasikan asumsi tersebut, entah bagaimana - memastikan entah bagaimana --- bahwa inilah yang sebenarnya terjadi, sebelum melanjutkan eksekusi. Seharusnya tidak SEPENUHNYA berasumsi bahwa akan selalu valid, jika itu disebut salah, atau itu disalin / ditempelkan ke beberapa program lain, misalnya.

Jadi, readfile () {assert (fptr! = NULL); ..} sesuai dalam kasus ini, sementara penanganan kesalahan secara penuh tidak (mengabaikan fakta bahwa sebenarnya membaca file akan memerlukan beberapa sistem penanganan kesalahan).

Dan ya, pernyataan itu harus tetap dalam kode produksi, kecuali jika benar-benar diperlukan untuk menonaktifkannya. Meskipun begitu, Anda mungkin harus menonaktifkannya hanya di dalam bagian yang kritis-kinerja.

Lee
sumber
1

Misalkan sepotong kode dalam produksi, dan itu mengenai pernyataan yang biasanya dipicu. Penegasan telah menemukan bug! Kecuali belum, karena pernyataannya dimatikan.

Jadi apa yang terjadi sekarang? Entah program akan (1) macet dalam cara yang tidak informatif pada suatu titik lebih lanjut dihapus dari sumber masalah, atau (2) berjalan dengan riang sampai selesai, kemungkinan memberikan hasil yang salah.

Skenario tidak mengundang. Biarkan pernyataan aktif bahkan dalam produksi.

Pembunuh Marmot
sumber
0

Saya jarang menggunakan pernyataan untuk hal lain yang menyusun pemeriksaan tipe waktu. Saya akan menggunakan pengecualian alih-alih penegasan hanya karena sebagian besar bahasa dibuat untuk menanganinya.

Saya menawarkan sebuah contoh

file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");

melawan

file = create-some-file();
ASSERT(file.exists());

Bagaimana cara aplikasi menangani pernyataan? Saya lebih suka try catchmetode lama dalam menangani kesalahan fatal.

Roo
sumber
2
Pengecualian untuk situasi yang tidak biasa yang Anda harapkan terjadi dalam aplikasi yang berfungsi, seperti dalam contoh Anda di sini. Pernyataan untuk situasi yang Anda harapkan tidak akan pernah terjadi. Jadi, jika Anda menemukan mereka, pasti ada bug dalam kode Anda. Dalam contoh Anda, dan pengecualian jelas merupakan pendekatan yang tepat. Tetapi pernyataan masih sangat berguna untuk menangkap bug.
MiguelMunoz
0

Sebagian besar waktu, ketika saya menggunakan pernyataan di java (kata kunci yang menegaskan) saya secara otomatis menambahkan beberapa kode produksi setelah. Menurut kasus ini, itu bisa berupa pesan logging, pengecualian ... atau tidak sama sekali.

Menurut saya, semua pernyataan Anda sangat penting dalam rilis dev, bukan pada relase produksi. Beberapa dari mereka harus disimpan, yang lain harus dibuang.

Nicolas
sumber
0

ASSERTIONS bukan kesalahan dan tidak boleh ditangani sebagai kesalahan. Ketika pernyataan dilemparkan, ini berarti ada bug dalam kode Anda atau sebagai alternatif dalam kode yang memanggil kode Anda.

Ada beberapa poin untuk menghindari mengaktifkan pernyataan dalam kode produksi: 1. Anda tidak ingin pengguna akhir Anda melihat pesan seperti "ASSERTION gagal MyPrivateClass.cpp baris 147. Pengguna akhir BUKAN Anda insinyur QA. 2. ASSERTION mungkin mempengaruhi kinerja

Namun, ada satu alasan kuat untuk meninggalkan pernyataan: ASSERTION dapat memengaruhi kinerja dan waktu, dan sayangnya hal ini terkadang penting (terutama di sistem embedded).

Saya cenderung memilih untuk meninggalkan pernyataan dalam kode produksi tetapi memastikan bahwa pernyataan ini dicetak tidak terkena pengguna akhir.

~ Yitzik

Yitshak Yarom
sumber
Tidak, pernyataan untuk fakta yang diasumsikan. Jika kode kita mengembalikan 27 ketika diasumsikan akan SELALU mengembalikan 25, masalahnya juga bisa menjadi bug dalam asumsi fisik kita tentang alam semesta: mungkin kedua bit itu beralih ke 5 nilai yang mungkin, untuk pertama kalinya dalam sejarah komputasi. Penegasan ada di sana untuk mengonfirmasi bahwa kode Anda masih beroperasi berdasarkan asumsi yang ditulis untuknya. Jika fisika keluar dari jendela, kode Anda harus diperhatikan, biarkan drive itu sendiri, dan berhenti sementara di depan;) Tapi ya, itu bukan kesalahan dalam kode, dan penanganan kesalahan seperti apa yang bisa Anda lakukan?
Izinkan saya untuk menyaring pendapat saya: 1. Pernyataan tegas periksa asumsi kami. Jika asumsi kami salah, ini berarti ada bug dalam kode KAMI. 2. Kode kita seharusnya tidak menyatakan penggunaan kode kita. yaitu suatu fungsi tidak boleh gagal pada asersi jika ada sesuatu yang salah dalam input dari pengguna. Kami akan mengembalikan kesalahan dan pengguna harus menangani (ia dapat menyatakan keberhasilan) 3. Saya lebih suka meninggalkan pernyataan dalam produksi - tetapi perilaku mungkin akan dimodifikasi. Saya setuju bahwa tidak ada penanganan kesalahan yang sesuai. Pernyataan == bug gagal .. tetapi sistem mungkin kembali itu sendiri daripada berhenti dan menunggu untuk reboot.
Yitshak Yarom
1
itu tidak berarti bahwa ada bug. Sebagai contoh, banyak proyek yang saya libatkan datang dengan daftar fakta yang diasumsikan dalam dokumentasi. Asumsi-asumsi itu ada untuk melindungi kode pengembang dari yang disebut buggy, ketika pebisnis mungkin mengatakan kepada mereka hal yang salah, atau ketika tidak ada informasi yang tersedia dari pihak ketiga tentang variabel tertentu, misalnya. Pernyataan dapat digunakan untuk memverifikasi bahwa program harus / tidak boleh berjalan, bahwa sistem pihak ketiga benar, bukan hanya apakah TI benar.
-8

Pernyataan adalah kesalahan, murni dan sederhana dan karenanya harus ditangani seperti itu.

Karena kesalahan harus ditangani dalam mode rilis maka Anda tidak benar-benar membutuhkan pernyataan.

Manfaat utama yang saya lihat untuk pernyataan adalah istirahat bersyarat - mereka jauh lebih mudah untuk diatur daripada menelusuri melalui jendela VC untuk mengatur sesuatu yang membutuhkan 1 baris kode.

graham.reeds
sumber
2
Menggunakan menegaskan sebagai breakpoint bersyarat benar-benar menjengkelkan karena beberapa alasan. Yang paling penting adalah bahwa pernyataan ini membingungkan pengembang lain dalam tim - bagaimana mereka tahu jika itu kesalahan ketika pernyataan itu dipecat atau apakah seseorang meninggalkan breakpoint kondisionalnya ke dalam kode?
lego
Tidak akan ada jika menegaskan tidak ada dalam kode di tempat pertama. Dan jika Anda menggunakannya untuk memonitor kode hanya Anda yang akan melihatnya (kecuali jika Anda memeriksanya ke dalam source tree). Saya telah bekerja di tempat-tempat yang secara praktis menegaskan segalanya. Harus mengklik sekitar 60 kali pada awal program karena server dokumentasi bantuan tidak tersedia menjadi melelahkan dengan sangat cepat.
graham.reeds