it-swarm-id.com

Pernyataan tunggal jika blok - kawat gigi atau tidak?

Mana yang lebih baik/lebih umum diterima?

Ini:

if(condition)
{
  statement;
}

Atau:

if(condition)
  statement;

Saya cenderung lebih suka yang pertama, karena saya pikir itu membuatnya lebih mudah untuk mengatakan apa yang sebenarnya termasuk dalam blok if, itu menyelamatkan orang lain dari menambahkan kawat gigi nanti (atau membuat bug dengan melupakannya), dan itu membuat semua pernyataan if Anda seragam bukan beberapa dengan kawat gigi dan beberapa tanpa. Namun, yang kedua masih benar secara sintaksis dan jelas lebih ringkas. Saya ingin tahu melihat mana yang lebih disukai oleh orang lain.

59
Zann Anderson

Yang pertama lebih baik karena yang kedua rawan kesalahan. Misalnya, katakanlah Anda sementara mengomentari kode untuk men-debug sesuatu:

if(condition) 
//      statement;
otherStatement;

Atau menambahkan kode dengan tergesa-gesa:

if(condition) 
    statement;
    otherStatement;

Ini jelas buruk. Di sisi lain, yang pertama kadang terasa terlalu bertele-tele. Oleh karena itu, saya lebih suka meletakkan semuanya pada satu baris jika itu cukup pendek dan sederhana:

if(condition) statement;

Ini mengurangi kebisingan sintaksis sementara membuat konstruksi terlihat seperti itu melakukan apa yang sebenarnya dilakukannya, membuatnya lebih rentan kesalahan. Asalkan sintaks ini hanya digunakan untuk kondisi dan pernyataan yang sangat sederhana, singkat, saya merasa itu dapat dibaca dengan sempurna.

131
dsimcha

Saya selalu menggunakan tanda kurung hanya untuk aman.

Tidak masalah ketika Anda menulisnya, tetapi Anda tahu seseorang akan datang di masa depan dan memasukkan pernyataan lain tanpa meletakkan tanda kurung di sekitarnya.

44
Neil Aitken

Saya lebih suka versi tanpa kawat gigi jika memungkinkan.

Penjelasan berikut ini agak panjang. Tolong bersamaku. Saya akan memberikan alasan kuat bagi saya untuk memilih gaya ini. Saya juga akan menjelaskan mengapa saya berpikir bahwa argumen balasan yang biasa tidak berlaku.

(Dekat-) jalur kosong adalah pemborosan

Alasan untuk ini adalah bahwa kurung kurawal memerlukan baris kode tambahan - dan demikian pula kurung kurawal, tergantung gaya.1

Apakah ini masalah besar? Secara dangkal, tidak. Lagi pula, kebanyakan orang juga meletakkan baris kosong dalam kode mereka untuk memisahkan secara logis sedikit blok independen, yang sangat meningkatkan keterbacaan.

Namun, saya benci membuang ruang vertikal. Monitor modern sebenarnya memiliki ruang horizontal yang luas. Tetapi vertikal ruang masih sangat, sangat terbatas (kecuali jika Anda menggunakan monitor dengan posisi tegak, yang tidak biasa). Ruang vertikal terbatas ini adalah masalah: secara luas diakui bahwa metode individual harus sesingkat mungkin, dan bahwa kawat gigi yang sesuai (atau pembatas blok lainnya) tidak boleh lebih dari perbedaan ketinggian layar dalam perbedaan. sehingga Anda dapat melihat seluruh blok tanpa menggulir.

Ini adalah masalah fundamental: begitu Anda tidak dapat melihat seluruh blok lagi di layar, itu menjadi sulit untuk dipahami.

Sebagai akibatnya, saya benci garis kosong yang berlebihan. Di mana satu baris kosong sangat penting untuk membatasi blok independen (lihat saja tampilan visual teks ini), berturut-turut baris kosong adalah sangat gaya buruk di saya buku (dan dalam pengalaman saya mereka biasanya merupakan pertanda programmer pemula).

Demikian juga, garis yang hanya menahan penyangga, dan yang bisa dihemat, seharusnya. Blok pernyataan tunggal yang dibatasi oleh kawat gigi membuang satu hingga dua baris. Dengan hanya 50 garis ish per tinggi layar, ini terlihat.

Menghilangkan kawat gigi mungkin tidak ada salahnya

Hanya ada satu argumen yang menentang menghilangkan tanda kurung: bahwa seseorang nanti akan menambahkan pernyataan lain ke blok yang dimaksud dan akan lupa untuk menambahkan tanda kurung, sehingga secara tidak sengaja mengubah semantik kode.

Ini memang akan menjadi masalah besar.

Tetapi dalam pengalaman saya, itu bukan. Saya seorang programmer yang ceroboh; namun, dalam dekade pengalaman pemrograman saya, saya dapat dengan jujur ​​mengatakan bahwa saya telah tidak sekali lupa menambahkan kurung ketika menambahkan pernyataan tambahan ke blok tunggal.

Saya bahkan merasa tidak masuk akal bahwa ini harus menjadi kesalahan umum: blok adalah bagian mendasar dari pemrograman. Resolusi dan pelingkupan tingkat blok adalah proses mental yang mendarah daging secara otomatis bagi para programmer. Otak hanya melakukannya (jika tidak, penalaran tentang pemrograman akan jauh lebih sulit). Tidak ada upaya mental tambahan yang diperlukan untuk mengingat menempatkan kawat gigi: programmer juga ingat untuk indent pernyataan yang baru ditambahkan dengan benar, setelah semua; jadi programmer telah secara mental memproses blok yang terlibat.

Sekarang, Saya tidak mengatakan bahwa menghilangkan kawat gigi tidak menyebabkan kesalahan. Yang saya katakan adalah bahwa kami tidak memiliki bukti satu arah atau yang lain. Kami hanya tidak tahu apakah itu menyebabkan kerusakan.

Jadi sampai seseorang dapat menunjukkan kepada saya data keras, yang dikumpulkan dari eksperimen ilmiah, menunjukkan bahwa ini memang masalah dalam praktiknya, teori ini tetap menjadi " just-so story ": hipotesis yang sangat meyakinkan yang belum pernah ada sebelumnya. diuji, dan itu harus tidak digunakan sebagai argumen.


1 Masalah ini kadang-kadang diselesaikan dengan meletakkan segala sesuatu - termasuk kawat gigi - pada baris yang sama:

if (condition)
{ do_something(); }

Namun, saya yakin aman untuk mengatakan bahwa kebanyakan orang membenci ini. Selain itu, ia akan memiliki masalah yang sama dengan varian tanpa kawat gigi sehingga itu adalah yang terburuk dari kedua dunia.

27
Konrad Rudolph

Saya pergi dengan yang kedua. Ini lebih ringkas dan kurang bertele-tele.

Saya mencoba untuk tidak menulis ke penyebut umum terendah, jadi saya berharap bahwa pengembang lain tahu bagaimana menulis salah satu struktur aliran kontrol yang paling umum dalam pemrograman saat ini.

19
Steven Evers

Saya akan menggunakan yang berikut (konsensus di sini):

if (condition) {
    any_number_of_statements;
}

Juga mungkin:

if(condition) single_compact_statement;

Tidak begitu baik, terutama dalam bahasa C/C++ - seperti:

if(condition) 
    single_compact_statement;

(Tidak ada pilihan di sini di Python ;-)


Di Perl , Anda akan menggunakan:

$C = $A**3 if $A != $B;

atau

$C = $A**3 unless $A == $B;

(Ini bukan pseudocode ;-)

16
rubber boots

Saya menggunakan metode kawat gigi - untuk semua alasan di atas ditambah satu lagi.

Penggabungan kode. Sudah diketahui terjadi pada proyek yang saya kerjakan pada pernyataan tunggal jika telah rusak oleh penggabungan otomatis. Yang menakutkan adalah lekukan terlihat benar meskipun kodenya salah, jadi jenis bug ini sulit dikenali.

Jadi saya pergi dengan kawat gigi - di jalur mereka sendiri. Lebih mudah menemukan level-level seperti itu. Ya, itu memboroskan real estat layar vertikal dan itu adalah kerugian asli. Namun pada keseimbangan, saya pikir itu sepadan.

11
user36294

Tidak ada kawat gigi Jika beberapa programmer lain menambahkan pernyataan kedua ke kode saya, itu bukan kesalahan saya daripada jika saya membiarkan seseorang mengendarai mobil saya dan mereka melewati tebing.

10
Covar

Kami telah memiliki argumen ini lebih dari sekali di sini, dan konsensus keseluruhan adalah untuk selalu menggunakan kawat gigi. Alasan utamanya adalah tentang keterbacaan/pemeliharaan.

Jika Anda perlu menambahkan kode ke blok if, Anda tidak perlu mengingat/mencari kawat gigi. Ketika programmer masa depan membaca kode, kawat gigi selalu tidak ambigu.

Di sisi positifnya, ReSharper akan secara otomatis menambahkan kawat gigi untuk pemrogram malas di Visual Studio, dan saya berasumsi ada tambahan untuk yang lain IDE yang akan melakukannya juga.

8
shimonyk

Saya menggunakan sintaks pertama, hampir tanpa kecuali. Karena tidak dapat disalahartikan.

"Jangan membuatku berpikir" tidak hanya berlaku untuk antarmuka pengguna, kalian semua ;-)

7
Steven A. Lowe

Saya pribadi lebih suka yang kedua. Yang pertama terlihat jelek, canggung, dan menyia-nyiakan ruang horisontal. Masalah utama dengan yang kedua adalah makro dan orang-orang memodifikasi kode Anda di kemudian hari salah.

Untuk ini, saya katakan "jangan gunakan makro". Saya juga mengatakan, "indentasikan kode sialan Anda dengan benar". Mempertimbangkan bagaimana setiap editor teks/IDE yang digunakan untuk pemrograman melakukan lekukan secara otomatis, ini seharusnya tidak terlalu sulit untuk dilakukan. Saat menulis kode dalam Emacs, saya akan menggunakan indentasi otomatis untuk mengidentifikasi jika saya menulis sesuatu yang salah pada baris sebelumnya. Kapan saja Emacs mulai mengacaukan lekukan, saya biasanya tahu saya telah melakukan sesuatu yang salah.

Dalam praktiknya, saya akhirnya mengikuti konvensi pengkodean apa pun yang telah ditetapkan sebelumnya. Tapi ini mengganggu saya (dan membuat saya jauh lebih bahagia ketika saya kode dalam Python dan seluruh bencana braket ini hilang):

if (condition) {
    statement;
} // stupid extra brace looks ugly

Kemudian

if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read

Meskipun jujur, dua pernyataan dalam pernyataan if mengganggu saya jauh lebih dari satu pernyataan. Sebagian besar karena itu tanda kurung diperlukan dan masih terlihat lucu dengan hanya dua pernyataan di pernyataan if.

5
jsternberg

Saya menggunakan versi dua baris tanpa kawat gigi (bentuk ke-2), tetapi tidak untuk menghemat ruang.

Saya menggunakan formulir itu karena saya merasa lebih mudah dibaca, lebih menarik secara visual, dan lebih mudah untuk diketik. Saya hanya menggunakan formulir itu jika persyaratan itu dipenuhi; mis. kondisi if harus pas di satu baris, dan pernyataan yang sesuai harus pas di baris berikut. Jika bukan itu masalahnya, maka saya akan menggunakan kawat gigi untuk meningkatkan keterbacaan.

Jika saya menggunakan formulir ini, saya memastikan bahwa ada baris kosong (atau baris yang hanya berisi tanda kurung) sebelum dan sesudah pernyataan if (atau di atas komentar, jika ada). Meskipun ini bukan aturan yang secara sadar saya ikuti, saya perhatikan sekarang setelah membaca pertanyaan ini.

Menghemat ruang layar bukan prioritas bagi saya. Jika saya membutuhkan lebih banyak ruang, saya akan menggunakan monitor yang lebih besar. Layar saya sudah cukup besar bagi saya untuk membaca apa pun yang mungkin perlu saya fokuskan. Tidak mungkin saya perlu fokus pada begitu banyak baris kode pada satu waktu sehingga mereka mengambil seluruh layar saya. Jika ada begitu banyak persarangan yang terjadi dengan sepotong kode yang saya tidak dapat memahaminya tanpa melihatnya lebih banyak pada satu waktu, maka saya harus mempertimbangkan apakah logika bisa lebih baik diwakili oleh refactoring.

Di bawah ini adalah beberapa contoh yang menunjukkan bagaimana saya menggunakan bentuk pernyataan if ini.

    string GuardConditions(Plan planForWorldDomination)
    {
        if (planForWorldDomination == null)
            throw new ArgumentNullException("planForWorldDomination");

        if (!planForWorldDomination.IsComplete())
            return "Doh!";

        planForWorldDomination.Execute();
    }

    void ProcessingLogic()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
        OneBlankLineAbove();

        // optional comment on the line above an if statement
        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
    }

    void Assignment(string drive)
    {
        OneBlankLineAbove();

        string Prompt;
        if (simpleCondition)
            Prompt = "simple assignment";
        else
            Prompt = null;

        OneBlankLineBelow();
    }

    string Return()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            return "simple return";
        else
            return null;

        OneBlankLineBelow();
    }

Kawat gigi. Selalu. Saya agak menyukai mereka, karena memberikan kode konsistensi. Dan juga seperti @dsimcha menulis - lebih sedikit kemungkinan untuk kesalahan dalam menambahkan baris kode tambahan.

"Kejelekan" kawat gigi di sekitar satu baris kode kurang berbahaya daripada pekerjaan tambahan yang mungkin dalam kasus tersebut dengan debugging dan/atau menambahkan kode.

3

Secara pribadi saya pergi dengan kurung.

Mengapa?

Nah jika ada yang datang dan perlu menambahkan kode ke pernyataan if 100% jelas di mana ruang lingkupnya.

Itu membuat format pernyataan if tetap konsisten, tidak peduli berapa banyak pernyataan yang ada di dalam blok.

Namun, jika gaya proyek tidak berjalan, patuhi itu.

2
ChrisF

Saya hampir selalu menggunakan tanda kurung hanya untuk berada di sisi yang aman. Namun, kadang-kadang jika isi blok benar-benar pendek saya akan meninggalkannya dan menjadikannya satu-liner seperti:

if (x==5) Console.WriteLine("It's a five!");
1
JohnFx

Saya lebih suka kawat gigi untuk konsistensi, tetapi tidak membuang terlalu banyak ruang putih (jadi kode yang lebih mudah diformat dalam bidang pandang saya yang terbatas). Jadi saya menulis ini untuk baris yang cukup pendek:

If (cond) { statement; }
1
hotpaw2

Saya biasanya menggunakan kawat gigi, tetapi ada beberapa kasus di mana saya tidak.

object GetObject() {
    // calculate obj1
    if(obj1 != null)
        return obj1;

    // calculate obj2
    if(obj2 != null)
        return obj2;

    // calculate obj3
    if(obj3 != null)
        return obj3;

    return defaultObj;
}

Bagi saya, konyol jika menambahkannya di sana. Jika seseorang menambahkan pernyataan setelah return, kami memiliki masalah lebih besar daripada masalah pelingkupan.

Jika IDE memiliki pemformatan kode tersedia saya tidak menggunakan kawat gigi.

Di sisi lain, di mana kode dapat diedit di editor lain yang tidak mendukung pemformatan otomatis, berbahaya untuk tidak memasang kawat gigi seperti yang disebutkan dalam posting lain. Tetapi meskipun demikian saya memilih untuk tidak menggunakan kawat gigi, dan itu tidak menjadi masalah bagi saya.

0
nimcap