You are on page 1of 24

Pertemuan 1

Defensive Programming
Pokok Bahasan
• Protecting Your Program From Invalid Inputs
• Assertions
• Exceptions
• Debugging Aids
• Barricade Your Program to Contain the
Damage Caused by Errors
Dalam pemrograman defensif, ide utama adalah bahwa
jika suatu rutin melewati data yang buruk, itu tidak akan terluka,
bahkan jika data yang buruk adalah kesalahan rutin lainnya.
Secara umum, ini adalah pengakuan bahwa program akan
memiliki masalah dan modifikasi, dan bahwa seorang
programmer yang cerdas akan mengembangkan kode yang
sesuai. Jika Anda adalah seorang programmer yang
berpengalaman, Anda dapat melewati bagian selanjutnya
tentang penanganan input data dan mulai dengan Bagian yang
mengulas penggunaan pernyataan.
Protecting Your Program
From Invalid Inputs
Anda mungkin pernah mendengar ungkapan, "Garbage in,
garbage out.” Ekspresi itu pada dasarnya adalah versi
pengembangan perangkat lunak dari emptor peringatan:
biarkan pengguna berhati-hatilah. Untuk perangkat lunak
produksi, sampah tidak cukup baik. Suatu program yang baik
tidak pernah membuang sampah, terlepas dari apa yang
diperlukan. Program yang baik menggunakan “sampah masuk,
tidak ada yang keluar”; "Sampah masuk, pesan kesalahan
keluar"; atau “tidak ada sampah yang diizinkan masuk”
sebagai gantinya. Menurut standar hari ini, "sampah masuk,
sampah keluar" adalah tanda dari program ceroboh dan tidak
aman. 42
Ada tiga cara umum untuk menangani sampah.
Ada tiga cara umum untuk menangani sampah:
1. Check the values of all data from external sources
Saat mendapatkan data dari file, pengguna, jaringan, atau
wajah eksternal antar lainnya, periksa untuk memastikan
bahwa data berada dalam kisaran yang diijinkan. Pastikan
bahwa nilai numerik berada dalam toleransi dan string cukup
pendek untuk ditangani. Jika string dimaksudkan untuk
mewakili rentang nilai terbatas (seperti ID transaksi keuangan
atau yang serupa), pastikan string tersebut valid untuk tujuan
yang dimaksudkan; kalau tidak tolak. Jika Anda bekerja pada
aplikasi yang aman, terutama curiga data yang mungkin
menyerang sistem Anda: mencoba buffer overflows,
menyuntikkan perintah SQL, menyuntikkan html atau kode
XML, integer over flow, dan sebagainya.
2. Check the values of all routine input parameters
Memeriksa nilai-nilai parameter input rutin pada dasarnya
sama dengan memeriksa data yang berasal dari sumber
eksternal, kecuali bahwa data tersebut berasal dari rutin
lain, bukan dari antarmuka eksternal.

3. Decide how to handle bad inputs


Setelah Anda mendeteksi parameter yang tidak valid, apa
yang Anda lakukan dengannya? Tergantung pada situasi,
Anda dapat memilih salah satu dari selusin pendekatan yang
berbeda. Pemrograman defensif berguna sebagai tambahan
untuk teknik-teknik lain untuk peningkatan kualitas dari
bentuk pengkodean terbaik.
Menggunakan desain iteratif, menulis kode pseudokode
sebelum, dan memiliki inspeksi desain tingkat rendah adalah
semua kegiatan yang membantu untuk mencegah memasukkan
cacat. Karena itu mereka harus diberi prioritas lebih tinggi
daripada pemrograman defen. Untungnya, dapat menggunakan
pemrograman defensif dalam kombinasi dengan teknik-teknik
lainnya. Seperti yang diperlihatkan oleh Gambar-1, melindungi
diri Anda dari masalah yang tampaknya kecil dapat membuat
lebih banyak perbedaan daripada yang mungkin dipikirkan.
Bagaimana mencantumkan opsi spesifik untuk memeriksa data
dari sumber eksternal, memeriksa parameter input, dan
menangani input buruk.
Gambar 1. Bagian dari jembatan terapung Interstate di Seattle tenggelam
dalam badai karena tangki apung dibiarkan terbuka, mereka
terisi air, dan jembatan itu menjadi terlalu berat untuk
mengapung. Selama konstruksi, lindungi diri Anda dari masalah
kecil lebih dari yang Anda kira.
Assertions
Pernyataan adalah kode yang digunakan selama pengembangan
, biasanya makro rutin atau makro yang memungkinkan suatu
program mengecek dirinya sendiri saat dijalankan. Ketika
sebuah pernyataan benar, itu berarti semuanya beroperasi
seperti yang diharapkan. Ketika itu salah, itu berarti telah
mendeteksi kesalahan tak terduga dalam kode. Misalnya, jika
sistem menyimpulkan bahwa file informasi pelanggan tidak
akan pernah memiliki lebih dari 50.000 transaksi. program
mungkin berisi pernyataan bahwa jumlah catatan kurang dari
atau sama dengan 50.000. Selama jumlah catatan kurang dari
atau sama dengan 50.000, pernyataan itu akan diam. Jika ia
menemukan lebih dari 50.000 catatan, namun, itu akan dengan
keras “menegaskan” bahwa ada kesalahan dalam program.
Pernyataan sangat berguna dalam program besar, rumit dan
dalam program keandalan tinggi. Mereka memungkinkan
pemrogram untuk lebih cepat menghilangkan asumsi antarmuka
yang tidak cocok, kesalahan yang muncul ketika kode
dimodifikasi, dan sebagainya. Penegasan biasanya membutuhkan
dua argumen: ekspresi boolean yang menggambarkan asumsi
yang seharusnya benar dan pesan untuk ditampilkan jika tidak.
apa yang tampak seperti pernyataan Java jika penyebut variabel
diharapkan tidak nol:
Java Example of an Assertion

Pernyataan ini menegaskan bahwa penyebut tidak sama dengan


0. Argumen pertama, 100 penyebut! = 0, adalah ekspresi
boolean yang mengevaluasi ke True atau False. Argumen 101
detik adalah pesan untuk dicetak jika argumen pertama False —
yaitu, jika pernyataan itu salah.
Building Your Own Assertion Mechanism
Banyak bahasa memiliki dukungan bawaan untuk pernyataan,
termasuk C ++, Java dan Visual Basic. Jika bahasa Anda tidak
secara langsung mendukung rutinitas pernyataan, bahasa
mereka mudah untuk ditulis. Makro standar C ++ menegaskan
tidak menyediakan untuk pesan bijak. Berikut adalah contoh
ASSERT yang ditingkatkan yang diimplementasikan sebagai
makro C ++:
C++ Example of an Assertion Macro

Setelah Anda menulis rutin pernyataan seperti ini, Anda dapat


menyebutnya dengan pernyataan seperti yang pertama di atas.
Exceptions
Pengecualian adalah cara khusus dimana kode dapat
meneruskan kesalahan atau pengecualian peristiwa ke kode
yang memanggilnya. Jika kode dalam satu rutin bertemu
dengan kondisi yang tidak diharapkan dan tidak diketahui
bagaimana menangani, kode itu mengeluarkan pengecualian
pada dasarnya tidak memiliki arti dari konteks kesalahan dapat
mengembalikan kontrol ke bagian lain dari sistem yang mungkin
memiliki kemampuan yang lebih baik untuk menafsirkan
kesalahan dan melakukan sesuatu yang bermanfaat tentang hal
itu. Pengecualian juga dapat digunakan untuk meluruskan
logika kusut dalam rentang kode tunggal, sehingga "Menulis
ulang dengan coba-coba. Struktur dasar pengecualian di C ++,
Java, dan Visual Basic adalah bahwa menggunakan lemparan
untuk melempar objek pengecualian (dibuang).
Example of Popular Languages vary in how they implement exceptions
Example of Popular Languages vary in how they implement exceptions
Good Java Example of a Class That Throws an Exception at a tent
Level of Abstraction
Standardize your project’s use of exceptions
Untuk menjaga penanganan pengecualian sedapat mungkin
dikelola secara intelektual, Anda dapat membakukan
penggunaan pengecualian dengan beberapa cara.

1. Jika Anda bekerja dalam bahasa seperti C ++ yang


memungkinkan Anda untuk melempar beragam jenis objek,
data, dan pointer, distandarkan pada apa yang secara
spesifik akan Anda lempar. Untuk kompatibilitas dengan
bahasa lain, pertimbangkan untuk melempar hanya objek
yang berasal dari kelas dasar Pengecualian.
2. Menentukan kondisi khusus di mana kode diizinkan untuk
menggunakan sintaks catch untuk melakukan pemrosesan
kesalahan secara lokal.
3. Tentukan keadaan khusus di mana kode diizinkan untuk
mengeluarkan pengecualian yang tidak akan ditangani secara
lokal. Tentukan apakah pelapor pengecualian terpusat akan
digunakan. Tentukan apakah pengecualian diperbolehkan
dalam konstruktor dan destruktor.
Pertimbangkan alternatif untuk pengecualian beberapa bahasa
pemrograman telah mendukung pengecualian selama 5-10
tahun atau lebih, tetapi sedikit kebijaksanaan konvensional telah
muncul tentang bagaimana menggunakannya dengan aman.
Beberapa programmer menggunakan pengecualian untuk
menangani kesalahan hanya karena bahasa mereka
menyediakan mekanisme penanganan kesalahan tertentu. Anda
harus selalu mempertimbangkan set lengkap alternatif
penanganan kesalahan: menangani kesalahan secara lokal,
menyebarkan kesalahan menggunakan kode kesalahan,
mencatat informasi debug ke file, mematikan sistem, atau
menggunakan beberapa pendekatan lain.
Menangani kesalahan dengan pengecualian hanya karena
bahasa Anda memberikan penanganan pengecualian adalah
contoh klasik dari programming dalam bahasa daripada
pemrograman ke dalam bahasa.
Akhirnya, pertimbangkan apakah program Anda benar-benar
perlu menangani pengecualian, Seperti yang ditunjukkan
terkadang respons terbaik terhadap kesalahan yang serius
adalah melepaskan semua sumber daya yang diperoleh dan
membatalkan. Biarkan pengguna menjalankan kembali program
dengan input yang tepat.
Debugging Aids
Semakin awal Anda memperkenalkan alat bantu debug,
semakin mereka akan membantu. Biasanya, Anda tidak akan
berupaya menulis bantuan debugging sampai setelah Anda
digigit masalah beberapa kali. Namun, jika Anda menulis
bantuan setelah pertama kali, atau menggunakan dari proyek
sebelumnya, itu akan membantu seluruh proyek.
1. Use Offensive Programming
Kasus luar biasa harus ditangani dengan cara yang
membuatnya jelas selama pengembangan dan dapat
dipulihkan ketika kode produksi berjalan. Michael Howard
dan David LeBlanc menyebut pendekatan ini sebagai
"pemrograman ofensif“. bagaimanapun, case default harus
melakukan sesuatu yang lebih anggun, seperti menulis
pesan ke file error-log.
2. Plan to Remove Debugging Aids
Jika Anda menulis kode untuk penggunaan Anda sendiri,
mungkin tidak apa-apa meninggalkan semua kode dalam
program. Jika Anda menulis kode untuk penggunaan
komersial, penalti performa dan kecepatan dalam hal ini bisa
menjadi penghalang. Berencana untuk menghindari
pengacakan kode debug masuk dan keluar dari suatu
program.
Barricade Your Program to Contain
the Damage Caused by Errors
Barikade adalah strategi penahanan kerusakan. Alasannya
mirip dengan yang memiliki kompartemen terisolasi di
lambung kapal. Jika kapal menabrak es dan muncul membuka
lambung, kompartemen itu mati dan sisa kapal tidak
terpengaruh. Mereka juga mirip dengan firewall di sebuah
gedung. Dinding bangunan mencegah api menyebar dari satu
bagian bangunan ke bagian lain.
Salah satu cara untuk mengatasi barikade untuk tujuan
pemrograman defensif adalah dengan menunjuk antarmuka
tertentu sebagai batasan untuk area "aman". Periksa data yang
melewati batas area aman untuk validitas dan jawab dengan
bijaksana jika data tidak valid.

You might also like