16.12.10

"Clean" Programming Check-List

Alhamdulillah, masih bisa mempertahankan (at least) one post per month...

Kali ini, seperti yang tertulis di judul, saya akan sedikit membahas mengenai checklist memprogram, atau dalam bahasa Bu Inge-nya, "Sudah seberapa 'bersih'-kah kamu memprogram?" Saya "berani" membawa topik "kebersihan" program karena, meski ada tulisan tentang Why can't programmers program, saya cukup yakin bahwa pembaca blog ini terdiri "hanya" dari dua tipe saja:
  1. Teman/saudara/kerabat/handai Taulan (TSKHT) saya
    • TSKHT saya yang pernah berurusan dengan dunia pemrograman. Anda pasti bisa memprogram!
    • TSKHT saya yang memang tidak berurusan dengan dunia pemrograman (kayanya sebentar lagi bakal nutup tab ini deh :( )
  2. Orang "lewat"... Jika Anda masuk kategori ini, saya yakin Anda bisa memprogram... Soalnya kalo nggak, gimana caranya bisa nyasar ke blog ini... Wong Page Rank-nya aja cuma 3/10...

Dengan asumsi demikian, Anda pasti bisa memprogram atau tidak pernah berurusan dengan dunia pemrograman... Oleh karena itu, tidak ada salahnya memeriksa kebersihan kode seseorang yang memprogram (!= programmer). Berikut ini daftar yang "dikeluarkan" oleh Bu Inge dalam memprogram: (dalam kasus ini, saya menggunakan Java)

  1. Tidak pernah menggunakan break ataupun continue, so instead of doing something like this:
    int ans = -999;
    for(int i = 0; i < strArr.length; i++){
        if(strArr[i].equals("elvi")){
            ans = i;
            break;
        }
    }
    akan jauh lebih baik jika memperbaikinya menjadi begini:
    int ans = -999;
    {
        boolean found = false;
        for(int i = 0; i < strArr.length && !found; i++){
            if(strArr[i].equals("elvi")){
                ans = i;
                found = true;
            }
        }
    }
    Ini memang "ujian" paling berat, apalagi dari segi panjangnya kode, kode kedua lebih panjang
  2. Tidak memberi return lebih dari satu di satu fungsi, so instead of doing something like this:
    if(i == 2)
        return i;
    return i+1;
    akan jauh lebih baik jika memperbaikinya menjadi begini:
    int ans;
    if(i == 2)
        ans = i;
    else
        ans = i+1;
    return ans;
    
    atau untuk memendekkan kodenya, menjadi seperti ini:
    int ans = i;
    if(i != 2)
        ans++;
    return ans;
    
  3. Tidak memberi return di prosedur (void), so instead of doing something like this:
    public void voidA(int x){
        if(x == 2) return;
        else {
            // do something
        }
    }
    akan jauh lebih baik jika memperbaikinya menjadi begini:
    public void voidA(int x){
        if(x != 2) {
            // do something
        }
    }
  4. Tidak melakukan kesalahan-kesalahan "konyol" memprogram, so instead of doing something like this:
    int i = 0;
    boolean found = false;
    while(!found){
        // do something
        if(/* something happened*/) found = true;
        i++;
    }
    i--;
    or this:
    int i = someFunction();
    if(i == 1){
        // doing something that doesn't change the value of i
    }
    if(i == 2){
        // doing something
    }
    akan jauh lebih baik jika bagaimana? Saya serahkan kepada pembaca untuk menjawabnya...
  5. Tidak cetak-cetek pulpen :D
    Karena cetak-cetek bulpen adalah awal dari kegilaan dunia... Hehehe...
Mungkin banyak, termasuk saya, terutama yang sudah masuk di dunia "nyata" mempertanyakan pentingnya "kebersihan" dari program, tapi saya sendiri sampai saat ini melihat hal diatas sebagai keindahan pemrograman... Meski sama sekali tidak menutup kemungkinan saya melakukan satu (atau lebih) kesalahan diatas, terutama saat kepepet dikejar deadline(eniwei, istilah yang bener untuk batas akhir pengumpulan (tugas, dkk) adalah deadline bukan dateline)


Terakhir... Pesan yang selalu disampaikan oleh Bu Inge kepada anak didiknya "Anakku, jadilah orang waras di dunia yang sudah gila ini"

15 comments:

  1. Anonymous4:47 PM

    Kyaaa~ Kyaaa~ nais post!

    ReplyDelete
  2. anyway, setelah dipikir2, kesalahan "konyol" bagian 1 tampak tidak begitu konyol (malah jadi bagus) kalo diliat dari sisi performansi doang sepertinya ya (jika dibandingkan dengan kode yang "seharusnya")

    ReplyDelete
  3. Anonymous4:54 PM

    hummm

    4.1 found = *something happened*

    4.2 else if kalo boleh, atau tuker posisi kalo boleh :D

    ReplyDelete
  4. @anonymous: untuk 4.1, masih kurang tepat... itu tidak menghilangkan "kekonyolan" yang ada, hanya memperpendek kode sedikit...

    ReplyDelete
  5. arifromdhoni11:44 PM

    Untuk nomer dua, jika fungsi memiliki balikan nilai, bisa disingkat sbb:

    return ((i == 2) ? i : i+1);

    Satu lagi pesan bu Inge, Keledai yang bodoh sekalipun tidak akan jatuh pada lubang yang sama dua kali.

    ReplyDelete
  6. arifromdhoni11:49 PM

    Nomor 1 pun break nya bisa dihilangkan sbb:

    int ans = -999;
    for(int i = 0; i < strArr.length; i++){
    if(strArr[i].equals("elvi")){
    ans = i;
    i = strArr.length;
    }
    }

    Nomor 4.1 itu harusnya pakai do..while kan ya?

    ReplyDelete
  7. 4.1. sebenernya "kesalahan" utama adalah, adanya i-- setelah ada i++ di loop, which should not be there :) (masa baru di-increment langsung di-decrement lagi)

    ReplyDelete
  8. arifromdhoni11:32 AM

    Lha itu habis di-assign

    found = false

    lalu dicek lagi

    while(!found)

    :D

    ReplyDelete
  9. oh iya... that can be considered as "salah" juga (see? I am the same stupid), well, berarti di 4.1 ada dua "kesalahan" :D

    ReplyDelete
  10. ora dong blassssss

    ReplyDelete
  11. @Lila: well... kamu masuk kategori teman yang masuk kategori orang yang gak bisa dan gak pernah berurusan dengan dunia pemrograman...

    ReplyDelete
  12. Anonymous9:28 AM

    kalo baca semua contoh kodenya, daku malah ga tau kok ada yang program ga bersih kayak gitu. hahahaha
    selama ini koding bersih terus berarti* >:)

    ReplyDelete
  13. Malah saya mau tanya di blogspot bisa buat code snippet rapi begitu bagaimana caranya ?

    Termasuk mau tanya kalau tahu cara menambahkan huruf Arab di blogspot.

    Terima kasih ya :-)

    ReplyDelete
  14. 1. SyntaxHighlighter, silakan dicari :)

    2. Saya belum pernah menggunakan huruf Arab di blog juga, jadi silakan cari tahu sendiri :)

    Sama2

    ReplyDelete
  15. baca buku CleanCode ko. Di situ penulisnya bilang: praktek baik seperti Bu Inge sarankan itu hanya berlaku untuk method yang panjang, dimana method ga bisa dilihat sekilas, sehingga kalau ada return di banyak tempat jadi puyeng bacanya, kala ada break jadi bingung bacanya.

    Nah si penulis menyarankan... kalo panjang method maksimal 5 line saja. Kalau 5 line, semua praktek yang ga baik itu terkurangi nilai ga baiknya, karena semua terbaca dalam sekilas.

    Tapi masalahnya... 5 line? Bu Inge aja ga pernah punya saran seperti itu.... Yakin bisa buat semua method sependek itu?

    ReplyDelete