Saya harus menanyakan ini, karena: Satu-satunya hal yang saya kenali adalah, bahwa jika pernyataan gagal, aplikasi mogok. Apakah itu alasan mengapa menggunakan NSAssert? Atau apa lagi manfaatnya? Dan apakah benar untuk meletakkan NSAssert tepat di atas asumsi yang saya buat dalam kode, seperti fungsi yang seharusnya tidak pernah menerima -1 sebagai param tetapi mungkin -0.9 atau -1.1?
155
Saya tidak dapat benar-benar berbicara dengan NSAssert, tetapi saya membayangkan bahwa ia bekerja mirip dengan pernyataan C ().
assert () digunakan untuk menegakkan kontrak semantik dalam kode Anda. Apa artinya itu, Anda bertanya?
Yah, seperti yang Anda katakan: jika Anda memiliki fungsi yang seharusnya tidak pernah menerima -1, Anda dapat menegaskan () menegakkan bahwa:
Dan sekarang Anda akan melihat sesuatu seperti ini di log kesalahan (atau STDERR):
Jadi tidak hanya itu melindungi dari input yang berpotensi buruk tetapi juga mencatatnya dengan cara yang bermanfaat dan standar.
Oh, dan setidaknya dalam C menegaskan () adalah makro, sehingga Anda bisa mendefinisikan kembali menegaskan () sebagai no-op dalam kode rilis Anda. Saya tidak tahu apakah itu masalahnya dengan NSAssert (atau bahkan menegaskan () lagi, tapi itu cukup berguna untuk menyusun cek itu.
sumber
NSAssert
memberi Anda lebih dari sekadar menabrak aplikasi. Ini memberi tahu Anda kelas, metode, dan garis di mana pernyataan itu terjadi. Semua pernyataan juga dapat dengan mudah dinonaktifkan menggunakan NS_BLOCK_ASSERTIONS. Sehingga membuatnya lebih cocok untuk debugging. Di sisi lain, melemparNSException
hanya akan merusak aplikasi. Ini juga tidak memberi tahu tentang lokasi pengecualian, juga tidak dapat dinonaktifkan begitu saja. Lihat perbedaan pada gambar di bawah ini.Aplikasi mogok karena pernyataan juga memunculkan pengecualian, seperti yang dinyatakan oleh dokumentasi NSAssert :
NSAssert:
NSException:
sumber
NSException
memberikan banyak peluang untuk menyesuaikan output yang dihasilkannya melaluireason
danuserInfo
parameter. Tidak ada alasan Anda tidak dapat menambahkan nama kelas, pemilih, informasi baris, dan hal lain yang ingin Anda tambahkan untuk membantu debugging. IMHO, Anda menggunakanNSAssert
untuk tujuan debugging selama pengembangan tetapi menonaktifkannya untuk mengirim; Anda melemparNSException
jika Anda ingin memberikan pernyataan dalam kode pengiriman.Terlepas dari apa yang semua orang katakan di atas, perilaku default
NSAssert()
(tidak seperti Cassert()
) adalah untuk melemparkan pengecualian, yang dapat Anda tangkap dan tangani. Misalnya, Xcode melakukan ini.sumber
Hanya untuk mengklarifikasi, seperti yang disebutkan seseorang tetapi tidak sepenuhnya dijelaskan, alasan untuk memiliki dan menggunakan pernyataan alih-alih hanya membuat kode kustom (melakukan jika dan menaikkan pengecualian untuk data yang buruk, misalnya) adalah bahwa menegaskan HARUS dinonaktifkan untuk aplikasi produksi.
Saat mengembangkan dan debugging, menegaskan diaktifkan bagi Anda untuk menangkap kesalahan. Program akan berhenti ketika pernyataan dievaluasi sebagai false. Tetapi, ketika mengkompilasi untuk produksi, kompiler menghilangkan kode pernyataan dan benar-benar membuat program Anda berjalan lebih cepat. Saat itu, semoga, Anda telah memperbaiki semua bug. Jika program Anda masih memiliki bug saat dalam produksi (ketika pernyataan dinonaktifkan dan program "melompati" pernyataan), program Anda mungkin akan berakhir mogok di beberapa titik lain.
Dari bantuan NSAssert: "Pernyataan dinonaktifkan jika makro NS_BLOCK_ASSERTIONS preprocessor ditentukan." Jadi, cukup letakkan makro di target distribusi Anda [saja].
sumber
NSAssert
(dan setara dengan stdlibassert
) adalah untuk mendeteksi kesalahan pemrograman selama pengembangan. Anda seharusnya tidak pernah memiliki pernyataan yang gagal dalam aplikasi produksi (dirilis). Jadi, Anda mungkin menegaskan bahwa Anda tidak pernah memberikan angka negatif ke metode yang membutuhkan argumen positif. Jika pernyataan pernah gagal selama pengujian, Anda memiliki bug. Namun, jika nilai yang diteruskan dimasukkan oleh pengguna, Anda perlu melakukan validasi input yang benar daripada mengandalkan pernyataan dalam produksi (Anda dapat menetapkan #define untuk rilis build yang menonaktifkanNSAssert*
.sumber
Penegasan biasanya digunakan untuk menegakkan penggunaan metode tertentu atau logika tertentu. Katakanlah Anda sedang menulis metode yang menghitung jumlah dua bilangan bulat lebih besar dari nol. Untuk memastikan metode ini selalu digunakan sebagaimana dimaksud, Anda mungkin akan memberikan pernyataan yang menguji kondisi tersebut.
Jawaban singkat: Mereka menegaskan bahwa kode Anda hanya digunakan sebagaimana dimaksud.
sumber
Ini bermanfaat untuk menunjukkan bahwa selain menjalankan memeriksa waktu, menegaskan pemrograman adalah fasilitas penting yang digunakan ketika Anda merancang kode Anda dengan kontrak.
Info lebih lanjut tentang masalah penegasan dan desain berdasarkan kontrak dapat ditemukan di bawah:
Pernyataan (pengembangan perangkat lunak)
Desain berdasarkan kontrak
Pemrograman Dengan Pernyataan
Desain dengan Kontrak, dengan Contoh [Paperback]
sumber
Untuk sepenuhnya menjawab pertanyaannya, poin dari segala jenis pernyataan adalah untuk membantu debugging. Lebih baik menangkap kesalahan pada sumbernya, kemudian menangkapnya di debugger saat menyebabkan crash.
Misalnya, Anda dapat meneruskan nilai ke fungsi yang mengharapkan nilai dalam rentang tertentu. Fungsi dapat menyimpan nilai untuk digunakan nanti, dan nanti menggunakan aplikasi crash. Tumpukan panggilan yang terlihat dalam skenario ini tidak akan menunjukkan sumber nilai buruk. Lebih baik untuk menangkap nilai buruk ketika datang untuk mencari tahu siapa yang melewati nilai buruk dan mengapa.
sumber
NSAssert
membuat aplikasi mogok saat itu sesuai dengan kondisi. Jika tidak cocok dengan kondisi, pernyataan selanjutnya akan dieksekusi. Cari EX di bawah ini:Saya hanya membuat aplikasi untuk menguji apa tugasnya
NSAssert
adalah:ke dalam kode saya aplikasi tidak akan crash. Dan test case adalah:
anNum
> = 2 -> Aplikasi tidak akan crash dan Anda dapat melihat string log: "Pernyataan ini akan dieksekusi ketika angka <2" ke dalam jendela konsol log outPutanNum
<2 -> Aplikasi akan macet dan Anda tidak dapat melihat log string: "Pernyataan ini akan dieksekusi ketika suatuNum <2"sumber