Kamis, 17 November 2016

tugas 5 rpl



Koding dan Pengujian Unit


Tujuan dari koding atau pemrograman kegiatan adalah untuk menerapkan desain dengan cara sebaik mungkin. Aktivitas koding mengenai baik pengujian dan main-tenance secara mendalam. Seperti yang kita lihat sebelumnya, waktu yang dihabiskan di koding adalah sebagian kecil dari total biaya perangkat lunak, sementara pengujian dan pemeliharaan mengkonsumsi porsi besar. Dengan demikian, itu harus jelas bahwa tujuan selama koding tidak hanya untuk mengurangi biaya pelaksanaan, tetapi membantu mengurangi biaya tahap selanjutnya. Selama koding, diingat bahwa program tidak harus dibangun sehingga mereka mudah untuk menulis, tetapi dengan cara yang mereka mudah untuk membaca dan memahami.

Dalam percobaan, lima tim perbedaan diberikan masalah yang sama yang mereka harus mengembangkan program. Namun, masing-masing tim ditentukan tujuan untuk memenuhi. Tujuan perbedaan yang diberikan adalah: meminimalkan perbedaan diperlukan untuk menyelesaikan program, meminimalkan jumlah pernyataan, meminimalkan memori diperlukan, memaksimalkan kejelasan Program, dan memaksimalkan kejelasan output. Kebanyakan kasus masing-masing tim melakukan yang terbaik untuk tujuan yang ditentukan itu. Peringkat dari tim ditunjukkan pada Tabel 7.1.



Dihasilkan Rank (1 = Terbaik)







O1
O2
O3
O4
O5
Meminimalkan Upaya (O1)
1
4
4
5
3
Meminimlakan Jumlah Pernyataan (O2)
2–3
1
2
3
5
Meminimalkan memori diperlukan (O3)
5
2
1
4
4
Memaksimalkan kejelasan Program (O4)
4
3
3
2
2
Memaksimalkan kejelasan keluaran (O5)
2–3
5
5
1
1






  






Dalam bab ini kita akan membahas:

- Beberapa prinsip seperti pemrograman terstruktur, informasi bersembunyi, penggunaan standar koding, yang dapat membantu mengembangkan program lebih mudah dibaca.

- Beberapa proses programmer tingkat seperti pengembangan tambahan dan pengembangan uji-didorong, untuk effisien mengembangkan kode berkualitas tinggi.

- Bagaimana mengelola berkembang kode dengan menggunakan kontrol kode sumber yang tepat dan refactoring.

- Bagaimana unit modul tes menggunakan kerangka pengujian unit.

- Sebuah proses pemeriksaan kode terstruktur yang dapat digunakan untuk meningkatkan kualitas kode.

7.1 Pemrograman Prinsip dan Pedoman

Tugas utama sebelum programmer untuk menulis kode yang dapat dibaca dengan beberapa bug di dalamnya. Sebuah gol tambahan adalah untuk menulis kode cepat. Menulis kode padat adalah keterampilan yang hanya dapat diperoleh dengan praktek. Pemrograman yang baik (memproduksi program yang benar dan sederhana) adalah independen praktek bahasa pemrograman sasaran, meskipun bahasa pemrograman yang terstruktur dengan baik membuat pekerjaan programmer sederhana. Pada bagian ini, kita akan membahas beberapa konsep dan praktik yang dapat membantu programmer menulis kode berkualitas tinggi yang juga mudah untuk dipahami.

7.1.1 Pemrograman Terstruktur

Sebuah program memiliki struktur statis serta struktur yang dinamis. Struktur statis adalah struktur teks dari program, yang hanya orga-nization linear laporan program. Struktur dinamis dari program ini adalah urutan pernyataan dijalankan selama pelaksanaan program. Dengan kata lain, baik struktur statis dan perilaku dinamis adalah urutan laporan; sedangkan urutan mewakili struktur statis dari sebuah program adalah tetap, urutan laporan dijalankan dapat berubah dari eksekusi eksekusi.

Kita umumnya juga perlu menyatakan kondisi input di mana program tersebut akan dipanggil dan yang program ini diharapkan dapat menghasilkan hasil yang valid. Penegasan tentang keadaan akhir yang diharapkan dari sebuah program yang disebut post-kondisi yang pro-gram, dan pernyataan tentang kondisi masukan disebut pre-kondisi program. Seringkali, dalam verifikasi program menentukan pra-kondisi yang pasca-kondisi akan puas adalah tujuan bukti.

Untuk memverifikasi program, pernyataan dasar tentang segmen program ini dalam bentuk
         P {S}Q.
Penafsiran ini adalah bahwa jika pernyataan P benar sebelum mengeksekusi S, maka pernyataan Q akan menjadi kenyataan setelah melaksanakan S, jika eksekusi S berakhir. Sikap tegas P adalah pra-kondisi program dan Q adalah pasca-kondisi. pernyataan ini adalah tentang nilai-nilai yang diambil oleh variabel dalam program sebelum dan setelah pelaksanaannya. Pernyataan umumnya tidak menentukan nilai nominal-TERTENTU untuk variabel, tetapi mereka menentukan sifat umum dari nilai-nilai dan hubungan di antara mereka.

Tujuan dasar menggunakan konstruksi terstruktur adalah untuk linearize aliran kontrol sehingga perilaku eksekusi lebih mudah untuk di bawah-berdiri dan berdebat tentang. Dalam aliran kontrol linier, jika kita memahami perilaku masing-masing konstruksi dasar benar, perilaku program dapat dianggap sebagai komposisi perilaku dari laporan. Untuk pendekatan ini untuk bekerja, itu tersirat bahwa kita dapat dengan jelas memahami dan menentukan perilaku setiap konstruk. Ini mengharuskan kita dapat ringkas menangkap atau menggambarkan perilaku setiap konstruk.

7.1.2 Menyembunyikan Informasi

Secara umum, hanya operasi tertentu dilakukan pada beberapa informasi. Artinya, sepotong informasi dalam masalah domain hanya digunakan dalam sejumlah cara dalam domain masalah. Sebagai contoh, sebuah buku besar di akuntan memiliki beberapa kegunaan yang sangat jelas: debit, kredit, memeriksa saldo, dll.

Ketika informasi tersebut direpresentasikan sebagai struktur data, prinsip yang sama harus diterapkan, dan hanya beberapa operasi yang didefinisikan harus dilakukan pada struktur data. Ketika informasi tersebut ditangkap di struktur data dan kemudian pada struktur data yang mewakili beberapa informasi, untuk setiap operasi pada informasi fungsi akses harus disediakan. Dan sebagai sisa dari sistem dalam domain masalah hanya melakukan operasi ini didefinisikan pada informasi, sisa modul dalam perangkat lunak hanya menggunakan fungsi akses ini untuk mengakses dan memanipulasi struktur data.

                                                                                                                                           
7.1.3 Beberapa Praktek Pemrograman

Ada banyak praktek pemrograman yang dapat membantu ke arah tujuan itu. Kita bahas beberapa aturan yang telah ditemukan untuk membuat kode lebih mudah dibaca serta menghindari beberapa kesalahan.

Kontrol Constructs: Sebanyak mungkin single-entry, konstruksi single-exit digunakan. Hal ini juga diinginkan untuk menggunakan beberapa konstruksi kontrol standar daripada.

Gotos: Digunakan dengan hemat dan disiplin. Ketika alternative menggunakan gotos lebih kompleks harus gotos digunakan. Dalam kasus apapun, alternatif harus memikirkan sebelum akhirnya menggunakan gotos. Jika gotos harus digunakan, transfer ke depan (atau melompat ke pernyataan kemudian) lebih diterima daripada melompat ke belakang.

Menyembunyikan Informasi: Informasi bersembunyi harus didukung. Hanya fungsi akses untuk struktur data harus dibuat terlihat saat bersembunyi struktur data di balik fungsi tersebut.

Buatan Jenis Pengguna: bahasa modern memungkinkan pengguna untuk menentukan jenis seperti tipe enumerasi. Ketika fasilitas tersebut tersedia, mereka harus ex-ploited mana yang berlaku. Menggunakan jenis seperti membuat program yang lebih jelas daripada mendefinisikan kode untuk setiap hari dan kemudian bekerja dengan kode.

Nesting: Jika bersarang maka konstruksi lain menjadi terlalu dalam, maka logika menjadi sulit untuk memahami. Dalam kasus sangat bersarang, seringkali di FFI kultus untuk menentukan jika pernyataan yang klausul lain tertentu terkait. Bila memungkinkan, bersarang dalam harus dihindari, bahkan jika itu berarti sedikit FFI efisiensi. Sebagai contoh, perhatikan konstruk berikut bersarang jika-maka-lain:
jika C1 kemudian S1
lain jika C2 kemudian S2
lain jika C3 kemudian S3
lain jika C4 kemudian S4;

Jika kondisi-nya saling terpisah (karena mereka sering), struktur ini dapat dikonversi ke dalam struktur berikut:

jika C1 kemudian S1;
jika C2 kemudian S2;
jika C3 kemudian S3;
jika C4 kemudian S4;

Modul Ukuran: membahas masalah system desain. Seorang programmer harus hati-hati memeriksa setiap fungsi dengan terlalu banyak laporan (mengatakan lebih dari 100). modul besar sering tidak akan fungsional kohesif. Tidak ada aturan keras-dan-cepat tentang ukuran modul; prinsip harus kohesi dan kopling.

Modul Interface: Sebuah modul dengan antarmuka yang kompleks harus diteliti dengan seksama. Sebagai aturan praktis, setiap modul yang antarmuka memiliki lebih dari lima parameter harus diteliti dengan seksama dan patah menjadi beberapa modul dengan antarmuka sederhana jika mungkin.

Side proyek: Ketika sebuah modul dipanggil, kadang-kadang memiliki sisi proyek memodifikasi program negara di luar modifikasi parameter yang tercantum dalam definisi antarmuka modul, misalnya, memodifikasi variabel global. sisi effects tersebut harus dihindari jika mungkin, dan jika modul memiliki sisi proyek, mereka harus didokumentasikan dengan benar.

Kekokohan: Sebuah program yang kuat jika melakukan sesuatu yang direncanakan bahkan untuk kondisi yang luar biasa.

Beralih Kasus dengan Default: Jika tidak ada kasus default di "switch" pernyataan, perilaku dapat diprediksi jika kasus yang muncul di beberapa titik waktu yang tidak dapat diprediksi pada tahap pembangunan. praktek tersebut dapat mengakibatkan bug seperti NULL dereference, kebocoran memori, serta jenis lain dari bug serius. Ini adalah praktik yang baik untuk selalu menyertakan kasus default.
switch (i) {
Kasus 0: {s = malloc (size)}
s [0] = y; / * NULL d e r e f e r e n c e jika bawaan terjadi * /

Kosong Menangkap Block: Pengecualian tertangkap, tetapi jika tidak ada tindakan, itu mungkin merupakan skenario di mana beberapa operasi yang akan dilakukan tidak dilakukan. Setiap kali pengecualian tertangkap, itu adalah praktik yang baik untuk mengambil beberapa tindakan default, bahkan jika itu hanya mencetak pesan kesalahan.

try {
F i l e I n p u t S t r e a m fis = baru
F i l e I n p u t S t r e m a ( "I n pu TF il e");
} catch (I O E x c e p t i o n IOE) {} // bukan praktik yang baik

Kosong, sementara pernyataan jika: Sebuah kondisi diperiksa tapi tidak ada yang dilakukan berdasarkan cek. Hal ini sering terjadi karena beberapa kesalahan dan harus ditangkap. kesalahan serupa lainnya termasuk akhirnya, mencoba, disinkronkan, metode statis kosong kosong, dll cek berguna seperti itu harus dihindari.

if (x == 0) {} / * ada yang dilakukan setelah memeriksa x * / else {
: }

Baca Kembali lalu Diperiksa: Seringkali nilai kembali dari membaca tidak diperiksa, dengan asumsi bahwa membaca mengembalikan nilai yang diinginkan. Kadang-kadang hasil dari membaca bisa menjadi berbeda dengan apa yang diharapkan, dan ini dapat menyebabkan kegagalan kemudian. Mungkin ada beberapa kasus di mana mengabaikan kondisi ini dapat mengakibatkan beberapa kesalahan serius. Misalnya, jika membaca dari scanf () adalah lebih dari yang diharapkan, maka dapat menyebabkan overflow buffer. Oleh karena itu, nilai membaca harus diperiksa sebelum mengakses membaca data. (Ini adalah alasan mengapa sebagian besar bahasa memberikan nilai kembali untuk operasi read.)

Kembali dari Block Akhirnya: Kita tidak harus kembali dari blok akhirnya, karena dapat membuat keyakinan palsu. Sebagai contoh, perhatikan kode
String public foo () {
try {
membuang E xc ep ti baru di ( "An Ex ce pt io n");
}
catch (E xc ep ti di e) {
membuang e;
}
akhirnya {
kembali "Beberapa nilai";}
}

Parameter berkorelasi: Seringkali ada korelasi implisit antara parameter. Misalnya, di segmen kode yang diberikan di bawah ini, "panjang" membenci ukuran BUFFER. Jika korelasi tidak tahan, kita bisa lari ke masalah serius seperti buffer overflow (digambarkan dalam kode fragmen bawah). Oleh karena itu, itu adalah praktik yang baik untuk memvalidasi korelasi ini bukan asumsi yang dimilikinya. Secara umum, hal ini diinginkan untuk melakukan beberapa pemeriksaan counter pada asumsi implisit tentang parameter.
void  ( char  * src ,
int  length ,  char
destn [])
{
strcpy  ( destn ,
src );  /*  dapat menyebabkan bufferr
Overflow

if  length
>  MAX_SIZE  */
}




Dipercaya Sumber Data: Counter pemeriksaan harus dilakukan sebelum mengakses data input, terutama jika data input yang disediakan oleh pengguna atau sedang diperoleh melalui jaringan.

Berikan Pentingnya ke Pengecualian: Untuk membuat sistem software yang lebih handal, programmer harus mempertimbangkan semua kemungkinan dan menulis penangan pengecualian cocok untuk mencegah kegagalan atau kehilangan saat seperti situasi terjadi.


7.1.4 Standar Koding

Programmer menghabiskan jauh lebih banyak waktu membaca kode daripada menulis kode. Selama kehidupan kode, penulis menghabiskan waktu yang cukup membacanya selama debugging dan peningkatan. Koding standar memberikan aturan dan pedoman untuk beberapa aspek pemrograman untuk membuat kode lebih mudah dibaca. Sebagian besar organisasi yang mengembangkan perangkat lunak secara teratur mengembangkan standar mereka sendiri. Secara umum, standar coding memberikan pedoman bagi programmer mengenai penamaan, organisasi berkas, pernyataan dan deklarasi.

Konvensi Beberapa Penamaan konvensi standar yang sering melengah adalah:

- Nama paket harus dalam huruf kecil (misalnya, mypackage, edu.iitk.maths).

- Nama Type harus kata benda dan harus dimulai dengan huruf besar (misalnya, Day, DateOfBirth, EventHandler).

- Nama-nama variabel harus kata benda dimulai dengan huruf kecil (misalnya, nama, jumlah).

- Nama Konstan harus semua huruf besar (misalnya, PI, MAX iterasi).

- Nama Metode harus verba dimulai dengan huruf kecil (misalnya, getValue ()).

- Variabel kelas swasta harus memiliki su FFI x (misalnya, "pribadi nilai int"). (Beberapa standar akan membutuhkan ini menjadi awalan.)

- Variabel dengan lingkup yang besar harus memiliki nama yang panjang; variabel dengan lingkup kecil dapat memiliki nama pendek; iterator lingkaran harus dinamai i, j, k, dll

- Prefix tersebut harus digunakan untuk variabel Boolean dan metode untuk menghindari kebingungan (misalnya, isStatus harus digunakan bukan status); nama variabel boolean negatif (misalnya, isNotCorrect) harus dihindari.

- The menghitung jangka dapat digunakan untuk metode di mana sesuatu sedang com-puted; istilah find dapat digunakan di mana sesuatu yang sedang melihat ke atas (misalnya, computeMean (), findMin ()).

- Kelas Exception harus su FFI xed dengan Pengecualian (mis, OutOfBoundEx-konsepsi).

File Ada konvensi tentang bagaimana file harus dinamai, dan apa file harus berisi, sehingga pembaca bisa mendapatkan beberapa ide tentang apa file con-tains. Beberapa contoh konvensi ini adalah:

- File sumber Java harus memiliki ekstensi .java-ini diberlakukan oleh sebagian besar kompiler dan alat.

- Setiap file harus berisi satu kelas luar dan nama kelas harus sama dengan nama file.

- Panjang garis harus dibatasi kurang dari 80 kolom dan khusus charac-ters harus dihindari. Jika garis lebih panjang, hal itu harus dilanjutkan dan kelanjutan harus dibuat sangat jelas

- Variabel harus diinisialisasi di mana dinyatakan, dan mereka harus dinyatakan dalam lingkup terkecil yang mungkin.

- Menyatakan variabel yang terkait bersama-sama dalam sebuah pernyataan umum. Tidak terkait vari-ables tidak harus dinyatakan dalam laporan yang sama.

- Variabel Kelas tidak harus dinyatakan publik.

- Gunakan hanya pernyataan kontrol loop dalam untuk loop.

- Variabel loop harus diinisialisasi segera sebelum loop.

- Hindari penggunaan istirahat dan terus dalam satu lingkaran.

- Hindari penggunaan do ... sementara membangun.

- Hindari kondisional kompleks ekspresi memperkenalkan sementara boolean variabel-variabel-bukan.

- Hindari pernyataan dieksekusi dalam conditional.

  Java menyediakan komentar dokumentasi yang dibatasi oleh "/ ** ... * /", dan yang bisa diambil ke file HTML. Komentar ini sebagian besar digunakan sebagai prolog untuk kelas dan metode-metode dan bidang, dan dimaksudkan untuk menyediakan dokumentasi untuk pengguna kelas yang mungkin tidak memiliki akses ke kode sumber. Selain prolog untuk modul, standar pengkodean dapat menentukan bagaimana dan di mana komentar harus berada. Beberapa pedoman tersebut adalah:

- Satu baris komentar untuk blok kode harus sejajar dengan kode mereka dimaksudkan untuk.

- Harus ada komentar untuk semua variabel utama menjelaskan apa yang mereka rep-membenci.

- Sebuah blok komentar harus didahului oleh kosong baris komentar hanya dengan "/ *" dan diakhiri dengan baris yang berisi hanya "* /".

- Trailing komentar setelah laporan harus singkat, pada baris yang sama, dan bergeser cukup jauh untuk memisahkan mereka dari laporan.

7.2 Tahap Mengembangkan Kode

Aktivitas coding dimulai ketika beberapa bentuk desain yang telah dilakukan dan spesifikasi dari modul untuk dikembangkan. Dengan desain, modul ditugaskan untuk pengembang untuk coding. Ketika modul ditugaskan untuk pengembang, mereka menggunakan beberapa proses untuk mengembangkan kode. Jelas, berbagai proses yang mungkin untuk mencapai tujuan ini.

7.2.1 Proses Incremental Koding

Proses diikuti oleh banyak pengembang untuk menulis kode untuk modul yang saat ini ditetapkan, dan ketika dilakukan, melakukan unit testing dan memperbaiki bug yang ditemukan. Maka kode tersebut akan diperiksa dalam repositori proyek untuk membuatnya tersedia untuk orang lain dalam proyek tersebut. (Kami akan menjelaskan proses memeriksa kemudian.)

Sebuah proses baik untuk coding, yang sering diikuti oleh berpengalaman pengembang, adalah untuk mengembangkan kode secara bertahap. Artinya, menulis kode untuk im-plementing hanya bagian dari fungsi modul. Kode ini disusun dan diuji dengan beberapa tes cepat untuk memeriksa kode yang telah ditulis sejauh ini. Ketika kode melewati tes ini, pengembang hasil untuk menambah fungsionalitas lebih lanjut untuk kode, yang kemudian diuji lagi.

Keuntungan dasar mengembangkan kode secara bertahap dengan pengujian yang dilakukan setelah setiap putaran coding adalah untuk memfasilitasi debugging-kesalahan yang ditemukan dalam beberapa pengujian dapat dengan aman dikaitkan dengan kode yang ditambahkan sejak pengujian terakhir yang berhasil.
                                                                                                                            

7.2.2 Uji-Driven Development

Test-Driven Development (TDD) adalah proses koding yang berbalik pendekatan umum. Alih-alih menulis kode dan kemudian mengembangkan kasus uji untuk memeriksa kode, di TDD itu sebaliknya-programmer menulis skrip tes, dan kemudian menulis kode untuk lulus tes. Seluruh proses dilakukan secara bertahap, dengan tes yang ditulis berdasarkan spesifikasi dan kode yang ditulis untuk lulus tes.

Beberapa poin yang perlu diperhatikan tentang TDD. Pertama, pendekatan mengatakan bahwa Anda menulis kode hanya cukup untuk lulus tes. Dengan mengikuti ini, kode ini selalu sinkron dengan tes. Hal ini tidak selalu terjadi dengan pendekatan kode-pertama, tapi kemudian hanya menulis beberapa tes yang hanya mencakup beberapa bagian kode.


7.2.3 Pair Programming

Pair programming juga merupakan proses coding yang telah diusulkan sebagai metodologi kunci teknik dalam pemrograman ekstrim (XP). Dalam pemrograman pasangan, kode tidak ditulis oleh programmer individu tetapi oleh sepasang programmer. Artinya, pekerjaan coding ditugaskan untuk tidak individu tetapi untuk sepasang individu. Pasangan ini bersama-sama menulis kode.

Proses dipertimbangkan adalah bahwa satu orang akan ketik program sementara yang lain akan secara aktif berpartisipasi dan terus-menerus meninjau apa yang sedang diketik. Ketika kesalahan perhatikan, mereka menunjukkan dan diperbaiki. Jika diperlukan, pasangan membahas algoritma, struktur data, atau strategi yang akan digunakan dalam kode yang akan ditulis. Peran yang diputar sering membuat kedua pasangan sama dan memiliki peran yang sama. Motivasi dasar pemrograman pasangan adalah bahwa sebagai kode membaca dan kode ulasan.


7.3 Mengelola Kode Berkembang

Selama proses coding, kode yang ditulis oleh programmer (atau sepasang) berevolusi-mulai dari nol untuk akhirnya memiliki modul teruji. Selama proses ini kode mengalami perubahan. Selain perubahan karena proses pembangunan, perubahan kode juga dibutuhkan karena perubahan spesifikasi modul, yang mungkin terjadi karena perubahan persyaratan. Sedemikian skenario dinamis, mengelola kode berkembang adalah sebuah tantangan. Di sini kita membahas dua aspek ini-bagaimana mengelola versi erent di ff yang bisa dibuat, dan bagaimana mempertahankan kualitas kode di bawah perubahan.

7.3.1 Sumber Pengaturan dan Mengembangkan Kode

Dalam banyak proyek, beberapa orang mengembangkan sumber kode. Setiap programmer membuat file sumber, yang akhirnya digabungkan bersama-sama untuk menciptakan executable. Programmer terus berubah file sumber mereka sebagai kode berevolusi. Dalam rangka menjaga kontrol atas sumber dan evolusi mereka, kontrol sumber kode hampir selalu digunakan dalam proyek-proyek menggunakan alat seperti CVS pada UNIX (www.cvshome.org) atau sumber visual aman (VSS) pada Windows (msdn.microsoft.com / VStudio / sebelumnya / safe).

Untuk proyek, repositori harus diatur dengan izin untuk perbedaan orang dalam proyek. File-file repositori akan berisi juga specified- file yang evolusi repositori mempertahankan. Programmer menggunakan repositori untuk membuat mereka perubahan file sumber yang tersedia, serta mendapatkan berkas sumber lain. Beberapa jenis perintah yang umumnya dilakukan oleh seorang programmer adalah:

Dapatkan salinan lokal: Seorang programmer di sebuah proyek bekerja pada salinan lokal file. Perintah disediakan untuk membuat salinan lokal dari repositori. Membuat salinan lokal umumnya disebut checkout. Contoh perintah cvs checkout <module>, yang salinan satu set file yang dimiliki oleh <module> pada mesin local.

Membuat perubahan ke file (s): Perubahan yang dibuat ke file lokal dengan programmer tetap lokal sampai perubahan berkomitmen kembali pada repositori. Dengan melakukan (misalnya, oleh cvs commit <f ile>). Operasi ini juga disebut sebagai check-in.

Memperbarui salinan local: Untuk mendapatkan perubahan, salinan lokal dari file harus diperbarui (misalnya, oleh cvs perintah update). Dengan update, semua perubahan yang dibuat untuk file-file tersebut tercermin dalam salinan lokal.

Mendapatkan laporan: Alat kontrol sumber menyediakan sejumlah perintah untuk memberikan laporan upaya pada evolusi file. Ini termasuk laporan seperti selisih antara file lokal dan versi terbaru dari file, semua perubahan yang dibuat ke file bersama dengan tanggal dan alasan untuk perubahan (yang typ-ically tersedia saat melakukan perubahan).

Ini harus jelas bahwa jika dua orang memeriksa beberapa berkas dan kemudian membuat perubahan, ada kemungkinan konflik perubahan dibuat untuk bagian yang sama dari file. Semua alat akan mendeteksi konflik ketika orang kedua mencoba untuk melakukan perubahan, dan akan menginformasikan pengguna. pengguna harus secara manual mengatasi conflit itu, yaitu, membuat file sehingga perubahan tidak bertentangan dengan perubahan yang ada, dan kemudian melakukan file. Konflik biasanya jarang karena mereka terjadi hanya jika perubahan dibuat untuk baris yang sama dalam file.

Dengan sistem kontrol kode sumber, programmer tidak perlu mempertahankan semua versi-kapan saja jika beberapa perubahan perlu dibatalkan, versi yang lebih tua dapat dengan mudah ditemukan. Repositori selalu didukung, sehingga mereka juga memberikan perlindungan terhadap kerugian disengaja. Selain itu, catatan perubahan dipertahankan-yang membuat perubahan dan kapan, mengapa perubahan dibuat, apa yang menjadi perubahan yang sebenarnya, dll, yang paling penting, repositori menyediakan tempat sentral untuk file-file terbaru dan berwibawa proyek. Ini sangat berharga untuk produk yang memiliki umur panjang dan yang berevolusi selama bertahun-tahun.


7.3.2 Refactoring

Kita telah melihat bahwa coding sering melibatkan membuat perubahan ke beberapa kode. Kode juga berubah ketika persyaratan mengubah atau ketika fungsi baru ditambahkan. Karena perubahan yang dilakukan oleh modul, bahkan jika kita mulai dengan desain yang baik. Dan sekali desain yang terkandung dalam kode menjadi kompleks, maka meningkatkan kode untuk mengakomodasi perubahan yang diperlukan menjadi lebih kompleks, memakan waktu, dan rawan kesalahan. Dengan kata lain, produktivitas dan kualitas mulai menurun.
Refactoring adalah teknik untuk meningkatkan kode yang ada dan mencegah kerusakan desain.

7.3 Mengelola Pengembangan

Refactoring juga memainkan peran penting dalam test-driven development-kode, perbaikan langkah dalam proses TDD benar-benar melakukan refactoring. Di sini kita membahas beberapa konsep kunci dan beberapa metode untuk melakukan refactoring.

Refactoring didefinisikan sebagai perubahan yang dibuat dengan struktur internal perangkat lunak untuk membuatnya lebih mudah memahami dan lebih murah untuk memodifikasi tanpa mengubah perilaku yang dapat diamati Tujuan dari refactoring adalah untuk memperbaiki desain, tetapi tentang meningkatkan desain kode yang sudah ada. Dengan kata lain, refactoring, meskipun dilakukan pada kode sumber, memiliki tujuan untuk meningkatkan implementasi desain kode. Oleh karena itu, prinsip-prinsip dasar desain memandu proses refactoring. Akibatnya, refactoring umumnya menghasilkan satu atau lebih hal berikut:

1. Mengurangi kopling
2. kohesi Peningkatan
3. kepatuhan yang lebih baik untuk membuka-menutup prinsip

Risiko dari refactoring adalah bahwa ada kode kerja mungkin "istirahat" karena perubahan yang dibuat. Ini adalah alasan utama mengapa sering refactoring tidak dilakukan. (Alasan lain adalah bahwa hal itu dapat dilihat sebagai biaya tambahan dan tidak perlu) Untuk mengurangi risiko ini, dua aturan emas adalah:

1. Refactor dalam langkah-langkah kecil
2. Memiliki tes skrip yang tersedia untuk menguji fungsi yang ada

Kapan refactoring diperlukan? Ada beberapa tanda-tanda yang mudah-spot dalam kode, yang kadang-kadang disebut "bau buruk" , yang sering menunjukkan bahwa beberapa sifat desain yang diinginkan dapat mendapatkan melanggar atau bahwa ada potensi untuk meningkatkan desain. Dengan kata lain, jika Anda "bau" salah satu dari ini "bau buruk," ini mungkin merupakan tanda bahwa refactoring diperlukan. Beberapa dari bau buruk dari yang diberikan di sini.



1. Kode Duplikat.
2. Metode Besar
3. Panjang Class
4. Daftar Panjang Parameter.
5. Beralih Laporan
6. Generality spekulatif.
7. Terlalu Banyak Komunikasi Antara Objek
8. Pesan Chaining. 
 Ini bau buruk secara umum adalah indikasi dari desain miskin. Jelas ada kemungkinan tak terbatas dari bagaimana kode dapat refactored untuk meningkatkan desain.


7.4 Pengujian Satuan

Setelah programmer menulis kode untuk modul, itu harus diverifikasi sebelum digunakan oleh orang lain. Pengujian tetap metode yang paling umum dari verifikasi ini. Pada tingkat programmer pengujian dilakukan untuk memeriksa kode programmer telah mengembangkan (dibandingkan dengan memeriksa seluruh sistem software) disebut unit testing.

Unit pengujian seperti pengujian rutin di mana program dijalankan dengan beberapa kasus uji kecuali bahwa fokusnya adalah pada pengujian program yang lebih kecil atau modul yang biasanya ditugaskan ke salah satu programmer (atau sepasang) untuk coding. Dalam proses pemrograman kita bahas sebelumnya, pengujian pada dasarnya unit testing. Sebuah unit mungkin fungsi atau kumpulan kecil dari fungsi untuk bahasa proce-dural, atau kelas atau kumpulan kecil dari kelas untuk bahasa berorientasi objek.



7.4.1 Pengujian Unit Prosedural

Dalam unit testing, satu, atau koleksi kecil, modul ini adalah untuk diuji dengan serangkaian uji kasus. Sebagai perilaku modul tergantung pada nilai parameter serta negara secara keseluruhan sistem yang merupakan bagian (misalnya, negara variabel global), kasus uji untuk modul f () akan melibatkan pengaturan baik keadaan sistem yang perilaku f () tergantung serta nilai parameter. Nilai yang sebenarnya dan keadaan sistem untuk kasus uji tergantung pada tujuan merancang uji kasus ini.

Pengujian modul f () dengan kasus uji maka akan melibatkan langkah-langkah berikut:

1. Mengatur sistem negara yang diperlukan oleh uji kasus ini.
2. Nilai Set parameter sesuai.
3. Panggil prosedur f () dengan parameter.
4. Bandingkan hasil f dengan hasil yang diharapkan. 
5. Menyatakan apakah kasus uji telah berhasil atau gagal.

Setelah kasus uji dirancang, ini urutan langkah tetap dan karenanya sangat ideal untuk otomatisasi lengkap. Dalam kerangka pengujian, sering kasus uji akan dinyatakan sebagai fungsi di mana ini urutan langkah-langkah dijalankan untuk ujian, termasuk pengecekan hasil dan menyatakan hasil-ini yang dilakukan sering dengan bantuan laporan menegaskan tersedia oleh framework. Sebuah tes suite maka kumpulan fungsi-fungsi ini, dan pelaksanaan tes suite berarti masing-masing fungsi dijalankan. Test suite berhasil jika semua kasus uji sukses. Jika kasus uji gagal, maka kerangka tes akan memutuskan apakah akan melanjutkan mengeksekusi atau berhenti.


7.4.2 Pengujian Unit Kelas

Untuk menguji kelas, programmer perlu menciptakan sebuah objek dari kelas itu, mengambil objek untuk negara tertentu, memanggil metode di atasnya, dan kemudian memeriksa apakah keadaan objek tersebut seperti yang diharapkan. Urutan ini harus dijalankan berkali-kali untuk sebuah metode, dan harus dilakukan untuk semua metode. Semua ini difasilitasi jika kita menggunakan kerangka kerja seperti JUnit (www.junit.org). Meskipun Junit sendiri untuk Java, kerangka serupa telah dikembangkan untuk bahasa lain seperti C ++ dan C #. Di sini kita secara singkat menjelaskan bagaimana Junit dapat digunakan untuk menguji kelas dan memberikan contoh.

Untuk pengujian dari CUT kelas (kelas yang diuji) dengan Junit, tester harus menciptakan kelas lain yang mewarisi dari Junit (misalnya, kelas cuttest meluas Junit). Kerangka Junit harus diimpor oleh kelas ini. kelas ini adalah driver untuk pengujian CUT. Ini harus memiliki konstruktor di mana benda-benda yang diperlukan untuk kasus uji diciptakan; metode setup () yang biasanya digunakan untuk membuat benda dan mendirikan nilai-nilai sebelum mengeksekusi kasus uji; suite (), dan utama () yang mengeksekusi suite () menggunakan TestRunner disediakan oleh Junit. Selain metode ini, semua metode lain sebenarnya uji kasus. Sebagian besar dari metode ini sering disebut testxxxx ().

7.5 Inspeksi Kode

Inspeksi kode adalah teknik lain yang sering diterapkan pada tingkat unit. Hal ini dapat dilihat sebagai "pengujian statis" di mana cacat terdeteksi dalam kode tidak dengan mengeksekusi kode tetapi melalui proses manual. Inspeksi kode, seperti pengujian, diterapkan hampir seluruhnya di tingkat unit, yaitu, hanya unit program menjadi sasaran pemeriksaan. Oleh karena itu, kami menganggap itu sebagai bentuk lain dari unit testing. Namun, dalam praktiknya, sering keduanya digunakan, terutama untuk modul kritis.

Ini harus menunjukkan bahwa pemeriksaan adalah pendekatan verifikasi umum yang dapat diterapkan untuk mendeteksi cacat pada dokumen. Namun, pertama kali digunakan untuk mendeteksi cacat dalam kode, dan inspeksi kode tetap bahkan hari ini industri praktek terbaik yang secara luas digunakan.

Inspeksi kode adalah review kode oleh sekelompok rekan-rekan mengikuti proses didefinisikan dengan jelas. Tujuan dasar dari inspeksi adalah untuk meningkatkan kualitas kode dengan menemukan cacat. Beberapa karakteristik kunci dari inspeksi adalah:

- Inspeksi Kode dilakukan oleh programmer.
- Ini adalah proses yang terstruktur dengan peran yang ditetapkan untuk peserta.
- Fokusnya adalah pada identifikasi cacat, tidak memperbaiki mereka.
- Inspeksi data yang dicatat dan digunakan untuk memantau efektifitas e ff dari proses pemeriksaan.

Inspeksi dilakukan oleh tim ulasan (atau inspektur) termasuk penulis, dengan satu dari mereka menjadi moderator. moderator memiliki tanggung jawab keseluruhan untuk memastikan bahwa review dilakukan dengan cara yang tepat dan semua langkah dalam proses peninjauan diikuti.

7.5.1 Perencanaan

Tujuan dari tahap perencanaan adalah untuk mempersiapkan untuk pemeriksaan. Sebuah tim inspeksi terbentuk, yang harus mencakup kode programmer untuk ditinjau. Tim harus terdiri dari setidaknya tiga orang, meskipun kadang-kadang tim empat atau lima anggota juga terbentuk. Sebuah moderator ditunjuk.

Penulis kode memastikan bahwa kode siap untuk diperiksa dan puas dalam kriteria entri. Umumnya kriteria masuk yang digunakan adalah bahwa kode mengkompilasi dengan benar dan alat analisis statis yang tersedia telah diterapkan. moderator memeriksa bahwa kriteria masuk puas dengan kode. Sebuah paket disiapkan yang akan didistribusikan kepada tim inspeksi. Paket biasanya terdiri dari kode yang akan diperiksa, spesifikasi yang kode dikembangkan, dan checklist yang harus digunakan untuk pemeriksaan.

Paket untuk ditinjau diberikan kepada pengulas. moderator dapat ar-range pertemuan pembukaan, jika diperlukan, di mana penulis dapat memberikan gambaran singkat dari produk dan setiap daerah khusus yang perlu memandang perawatan sepenuhnya.


7.5.2 Ulasan Diri

   Pada fase ini, setiap resensi melakukan self-review kode. Selama self-review, resensi melewati seluruh kode dan log semua cacat potensial ia menemukan di log diri persiapan. Seringkali pengulas akan menandai cacat pada produk pekerjaan itu sendiri, dan dapat memberikan ringkasan dari diri-review dalam log. Pengulas juga mencatat waktu yang mereka habiskan di diri ulasan. Sebuah bentuk standar dapat digunakan untuk log self-persiapan; contoh formulir ditunjukkan pada Gambar 7.5

Nama proyek dan kode:    Bekerja nama produk dan ID:
No.
Location
Description
Criticality/Seriousness
hline























7.6 Metrik

Secara tradisional, bekerja pada metrik telah difokuskan pada produk akhir, yaitu, kode. Dalam arti, semua metrik untuk produk antara persyaratan dan desain pada dasarnya digunakan untuk memastikan bahwa produk akhir memiliki kualitas tinggi dan produktivitas proyek tetap tinggi. Artinya, tujuan dasar dari metrik untuk produk adalah untuk memprediksi atau mendapatkan beberapa ide tentang metrik dari produk akhir. Untuk kode, metrik yang paling umum digunakan adalah ukuran dan kompleksitas. Di sini kita membahas beberapa langkah ukuran dan kompleksitas.


7.6.1 Tindakan Ukuran

Ukuran produk adalah ukuran sederhana, yang dapat mudah untuk menghitung. Ukuran sendiri adalah sedikit menggunakan adalah hubungan ukuran dengan biaya dan kualitas yang membuat ukuran metrik penting. Hal ini juga digunakan untuk mengukur produktivitas selama proyek (misalnya, KLOC per orang-bulan). kualitas akhir yang disampaikan oleh sebuah proses juga sering dinormalisasi sehubungan dengan ukuran (jumlah cacat per KLOC). Untuk alasan ini, ukuran adalah salah satu metrik yang paling penting dan sering digunakan.

Ukuran yang paling umum dari ukuran disampaikan baris kode sumber, atau jumlah baris kode (LOC) akhirnya disampaikan. Masalahnya dengan LOC adalah bahwa jumlah baris kode untuk sebuah proyek sangat tergantung pada bahasa yang digunakan. Misalnya, program yang ditulis dalam bahasa assembly akan besar dibandingkan dengan program yang sama yang ditulis dalam bahasa tingkat tinggi, jika LOC digunakan sebagai ukuran ukuran. Bahkan untuk bahasa yang sama, ukuran dapat bervariasi tergantung pada bagaimana garis dihitung. Meskipun kekurangan ini, LOC tetap menjadi ukuran berguna dan masuk akal yang digunakan secara luas
Dalam program kita mendefinisikan jumlah terukur berikut:

- N1 adalah jumlah operator yang berbeda
- N2 adalah jumlah operan yang berbeda
- F1, j adalah jumlah kejadian dari j Operator yang paling sering
- F2, j adalah jumlah kemunculan j paling operan sering Kemudian kosakata n dari sebuah program didefinisikan sebagai
n = n1 + n2.

Dengan parameter yang terukur yang terdaftar sebelumnya, dua parameter baru didefinisikan:
X X
N1 = f1, j, N2 = f2, j.

N1 adalah total kejadian dari operator perbedaan dalam program dan N2 adalah total kejadian operant. Panjang dari program ini didefinisikan sebagai
N = N1 + N2.
 Dari panjang dan kosa kata, volume V dari program didefinisikan sebagai V = Nlog2 (n).

Definisi volume program mewakili jumlah minimum bit diperlukan untuk mewakili program. log2 (n) adalah jumlah bit yang diperlukan untuk mewakili setiap elemen dalam program unik, dan N adalah total terjadi-rences elemen. Volume digunakan sebagai ukuran metrik untuk suatu program. Percobaan telah menunjukkan bahwa volume sebuah program sangat berkorelasi dengan ukuran di LOC.

7.6.2 Kompleksitas Metrik

Kompleksitas memiliki dampak yang besar pada biaya pemeliharaan program. Untuk mengukur kompleksitas gagasan luar dari kemudahan, program dapat dibangun atau dipahami, beberapa metrik untuk mengukur kompleksitas program yang dibutuhkan.

Sejumlah metrik telah diusulkan untuk mengukur kompleksitas program, dan penelitian telah dilakukan untuk mengkorelasikan kompleksitas dengan pemeliharaan. Di sini kita membahas beberapa langkah kompleksitas yang telah diusulkan.

Cyclomatic Kompleksitas Berdasarkan kemampuan pikiran manusia dan pengalaman orang, umumnya diakui bahwa kondisi dan pernyataan kontrol menambahkan kompleksitas program. Mengingat dua program dengan ukuran yang sama, program dengan jumlah yang lebih besar dari pernyataan keputusan cenderung lebih kompleks. Ukuran paling sederhana kompleksitas, kemudian, adalah jumlah konstruksi yang mewakili cabang di aliran kontrol dari program, seperti jika kemudian lain, sementara lakukan, ulangi sampai, dan pernyataan goto.

Sebuah ukuran yang lebih halus adalah ukuran kompleksitas cyclomatic diusulkan oleh McCabe, yang merupakan konsep graph-teori berbasis. Untuk graf G dengan n simpul, e tepi, dan komponen terhubung p, jumlah cyclomatic V (G) didefinisikan sebagai
V (G) = e - n + p.

Ternyata kompleksitas cyclomatic dari modul (atau cyclomatic num-ber grafik) adalah sama dengan jumlah maksimum sirkuit bebas linear dalam grafik. Satu set rangkaian linear jika ada sirkuit yang benar-benar terkandung dalam sirkuit lain atau merupakan kombinasi dari sirkuit lainnya. Jadi, untuk menghitung jumlah cyclomatic dari modul, kita dapat menarik grafik, membuatnya terhubung dengan menggambar busur dari node keluar ke node masuk, dan kemudian menghitung jumlah sirkuit atau menghitung dengan menghitung jumlah tepi dan node.

Bahwa kompleksitas cyclomatic dari modul adalah sejumlah keputusan dalam modul ditambah satu, di mana keputusan adalah effectively pernyataan Condi-nasional dalam modul. Oleh karena itu, kami juga bisa menghitung kompleksitas cyclomatic hanya dengan menghitung jumlah keputusan dalam modul. Untuk contoh ini, seperti yang kita lihat, kita mendapatkan kompleksitas cyclomatic sama untuk modul jika kita menambahkan 1 ke sejumlah keputusan dalam modul. (Modul ini memiliki tiga keputusan: di dua sementara pernyataan dan satu dalam laporan.)

7.7 Ringkasan

- Seperti membaca program adalah kegiatan jauh lebih umum daripada menulis program, tujuan dari kegiatan koding adalah untuk menghasilkan program, selain bebas dari cacat, mudah untuk memahami dan memodifikasi.

- Gunakan pemrograman terstruktur di mana program ini adalah urutan yang sesuai single-entry konstruksi single-exit membuat program yang mudah untuk memahami dan memverifikasi. praktek-praktek lainnya seperti menggunakan menyembunyikan informasi, cocok coding stan-dards, dan praktek pemrograman yang baik juga membantu meningkatkan pembacaan kode dan kualitas.

- Untuk pengembang, hal ini sangat efektif untuk mengembangkan kode secara bertahap. Hal ini dapat dilakukan dengan menulis kode sedikit demi sedikit, dan pengujian dan debugging setiap kenaikan sebelum menulis kode lebih. Atau, pengembangan uji-driven dapat diikuti di mana uji kasus yang ditulis pertama dan kemudian kode ditulis untuk lulus uji kasus ini. Meskipun coding dari modul umumnya dilakukan oleh programmer individu, alternatif adalah pasangan pemrograman, di mana coding dilakukan oleh sepasang programmer-baik strategi bersama-sama berkembang, struktur data, algoritma dll

- Kode Berkembang perlu dikelola dengan baik. Hal ini dapat dilakukan melalui kontrol alat kode sumber yang tepat yang memungkinkan manajemen mudah dari versi berbeda yang bisa dibuat, serta mudah kehancuran perubahan yang perlu digulung kembali.

- Sebagai kode berubah dengan waktu, untuk memastikan bahwa kualitas kode tidak terus menurunkan karena evolusi, refactoring dapat dilakukan. Selama refactoring ada fungsi baru ditambahkan-satunya perbaikan dilakukan agar desain kode membaik dengan penurunan kopling, peningkatan kohesi, dan lebih baik menggunakan hirarki.

- Unit testing adalah sangat populer dan paling sering digunakan praktek oleh programmer untuk memverifikasi kode yang mereka tulis. Dalam unit testing, programmer menguji / nya kode nya dalam isolasi. Untuk bahasa prosedural ini sering satu set kecil prosedur atau fungsi, dan untuk bahasa berorientasi objek ini umumnya kelas atau satu set kecil kelas. pengujian unit membutuhkan driver dan stub, dan dapat difasilitasi oleh penggunaan kerangka yang memungkinkan tes otomatis eksekusi script. kerangka yang baik seperti Cunit dan Junit ada untuk kedua bahasa prosedural dan bahasa berorientasi objek.

- Sejumlah metrik ada untuk kuantitasnya di kualitas perbedaan kode. Yang paling umum digunakan adalah metrik ukuran, karena mereka digunakan untuk menilai produktivitas orang dan sering digunakan dalam estimasi biaya. Ukuran paling umum adalah baris kode (LOC), yang juga digunakan di sebagian besar model biaya. Tujuan dari metrik kompleksitas adalah untuk mengukur kompleksitas perangkat lunak, sebagai kompleksitas merupakan faktor penting sebuah produktivitas proyek dan merupakan faktor dalam estimasi biaya. Sejumlah metrik perbedaan, yang paling umum adalah kompleksitas cyclomatic, yang didasarkan pada logika internal program dan mendefinisikan kompleksitas sebagai jumlah siklus independen dalam grafik aliran program.