it-swarm.dev

Blok parantez varsa ya da hayır?

Hangisi daha iyi/daha genel olarak kabul edilir?

Bu:

if(condition)
{
  statement;
}

Veya:

if(condition)
  statement;

Birincisini tercih etme eğilimindeyim, çünkü if bloğuna gerçekten neyin ait olduğunu söylemenin daha kolay olduğunu düşünüyorum, diğerlerini parantezleri daha sonra eklemekten (veya unutarak bir hata oluşturmaktan) kurtarır ve tüm if ifadelerinizi yapar Bazıları diş teli ile ve bazıları olmadan tekdüze. İkincisi, yine de sözdizimsel olarak doğru ve kesinlikle daha kompakt. Hangisinin başkaları tarafından daha genel olarak tercih edildiğini merak ediyorum.

59
Zann Anderson

Birincisi daha iyidir çünkü ikincisi hataya açıktır. Örneğin, bir şeyi hata ayıklamak için geçici olarak kodu yorumladığınızı varsayalım:

if(condition) 
//      statement;
otherStatement;

Veya acele kod eklemek:

if(condition) 
    statement;
    otherStatement;

Bu kesinlikle kötü. Öte yandan, birincisi zaman zaman çok ayrıntılı hissediyor. Bu nedenle, yeterince kısa ve basitse her şeyi tek bir satıra koymayı tercih ederim:

if(condition) statement;

Bu sözdizimsel gürültüyü azaltırken, yapıyı gerçekte yaptığı gibi yapar ve daha az hataya açık hale getirir. Bu sözdiziminin yalnızca çok basit, kısa koşullar ve ifadeler için kullanılması şartıyla, onu mükemmel bir şekilde okunabilir buluyorum.

131
dsimcha

Güvenli olmak için her zaman parantez kullanırım.

Yazarken sorun değil, ama gelecekte birinin gelip etrafına parantez koymadan başka bir ifade ekleyeceğini biliyorsunuz.

44
Neil Aitken

Mümkünse sürümü ayraçsız tercih ediyorum.

Aşağıdaki açıklama çok uzun. Lütfen bana eşlik et. Bu stili tercih etmem için zorlayıcı bir neden vereceğim. Ayrıca olağan karşı-argümanın neden olmadığını düşündüğümü de açıklayacağım.

(Yakın-) boş çizgiler israftır

Bunun nedeni, kapama parantezinin fazladan bir kod satırı gerektirmesidir ve stile bağlı olarak açma parantezini de gerektirir.1

Bu büyük bir anlaşma mı? Yüzeysel olarak hayır. Sonuçta, çoğu insan mantıksal olarak biraz bağımsız blokları ayırmak için kodlarına boş satırlar koyar, bu da okunabilirliği büyük ölçüde geliştirir.

Ancak, dikey alanı boşa harcıyorum. Modern monitörler aslında geniş yatay alana sahiptir. Ancak dikey alan hala çok, çok sınırlı (dik bir monitör kullanmıyorsanız, ki bu nadir değildir). Bu sınırlı dikey alan is bir sorun: bireysel yöntemlerin mümkün olduğunca kısa olması ve karşılık gelen parantezlerin (veya diğer blok sınırlayıcıların) farktaki bir ekran yüksekliğinden fazla olmaması gerektiği yaygın olarak kabul edilmektedir. böylece tüm bloğu kaydırma yapmadan görebilirsiniz.

Bu bir temel sorun: ekranınızda tüm bloğu artık göremediğinizde, kavramak karmaşıklaşıyor.

Sonuç olarak, gereksiz boş satırlardan nefret ediyorum. Tek boş satırların bağımsız blokları sınırlamak için çok önemli olduğu durumlarda (sadece bu metnin görsel görünümüne bakın), ardışık boş satırlar bir çok kitap (ve benim tecrübelerime göre genellikle acemi programcıların bir işaretidir).

Aynı şekilde, basitçe parantez taşıyan ve ekonomikleştirilebilen çizgiler olmalıdır. Diş telleri ile sınırlanan tek deyimli bir blok bir ila iki satır boşa harcar. Ekran yüksekliği başına sadece 50-ish çizgi ile bu fark edilir.

Diş tellerini atlamak belki de zarar vermez

Parantezleri atlamaya karşı sadece one argümanı var: Birisi daha sonra söz konusu bloğa başka bir ifade ekleyecek ve parantezleri eklemeyi unutacak, böylece yanlışlıkla kodun anlamını değiştirecek.

Bu gerçekten büyük bir sorun olurdu.

Ama benim tecrübelerime göre, öyle değil. Ben özensiz bir programcıyım; ve yine de, programlama deneyimimde, bir kez değil bir singleton bloğuna ekstra bir ifade eklerken parantez eklemeyi unuttuğumu söyleyebilirim.

Bunun yaygın bir hata olması bile imkansızdır: bloklar programlamanın temel bir parçasıdır. Blok düzeyinde çözünürlük ve kapsam belirleme, programcılar için otomatik, kökleşmiş bir zihinsel süreçtir. Beyin bunu yapar (aksi takdirde, programlama hakkında akıl yürütmek çok daha zor olurdu). Parantez koymayı hatırlamak için ek zihinsel çaba gerekmez: programcı ayrıca indent yeni eklenen ifadeyi doğru bir şekilde hatırlar; böylece programcı zihinsel olarak bir bloğun dahil olduğunu işledi.

Şimdi, Ben değil kaşlı ayraçları atlamanın hatalara neden olmadığını söylüyorum. Dediğim şey bu şu ya da bu şekilde kanıtımız yok. Biz sadece bilmiyorum zarara neden olup olmadığı.

Birisi bana bilimsel deneylerden toplanan ve bunun gerçekten pratikte bir sorun olduğunu gösteren sert veriler gösterene kadar, bu teori “ tam öykü ” olmaya devam ediyor: hiç bu kadar zorlayıcı olmayan bir hipotez teste tabi tutulur ve bu bir argüman olarak değil kullanılmalıdır.


1 Bu sorun bazen parantezler de dahil olmak üzere her şeyi aynı hatta koyarak çözülür:

if (condition)
{ do_something(); }

Ancak, çoğu insanın bunu hor gördüğünü söylemenin güvenli olduğuna inanıyorum. Ayrıca, parantezsiz varyant ile aynı sorunlara sahip olacaktı, bu yüzden her iki dünyanın da en kötüsü.

27
Konrad Rudolph

İkincisi ile gidiyorum. Daha özlü ve daha az ayrıntılı.

En düşük ortak paydaya yazmamaya çalışıyorum, bu yüzden diğer geliştiricilerin bugün programlamada en yaygın kontrol akış yapılarından birini nasıl yazacaklarını bilmesini bekliyorum.

19
Steven Evers

Aşağıdakileri kullanırdım (burada fikir birliği):

if (condition) {
    any_number_of_statements;
}

Bu da mümkün:

if(condition) single_compact_statement;

Çok iyi değil, özellikle C/C++ benzeri dillerde:

if(condition) 
    single_compact_statement;

(Burada başka seçenek yok Python ;-)


Perl içinde şunları kullanırsınız:

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

veya

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

(Bu değil sözde kod ;-)

16
rubber boots

Parantez yöntemini kullanıyorum - yukarıdaki tüm nedenlerle artı bir tane daha.

Kod birleştirilir. Otomatik birleşmelerle kırılmışsa, bu tek deyim üzerinde çalıştığım projelerde olduğu biliniyor. Korkunç şey kod yanlış olsa bile girinti görünüyor doğru, bu nedenle bu tür bir hata tespit etmek zor.

Bu yüzden kendi hatlarında parantez ile gidiyorum. Seviyeleri bu şekilde tespit etmek daha kolay. Evet, dikey ekran gayrimenkul israf ve bu gerçek bir dezavantaj. Denge olsa da, buna değer olduğunu düşünüyorum.

11
user36294

Diş teli yok. Başka bir programcı koduma ikinci bir ifade eklerse, birisinin arabamı kullanmasına izin verip bir uçurumun üzerinden geçmekten daha fazla benim hatam değil.

10
Covar

Bu tartışmayı burada bir kereden fazla yaptık ve genel fikir birliği her zaman diş teli kullanmaktır. Ana nedenler okunabilirlik/sürdürülebilirlik ile ilgilidir.

if bloğuna kod eklemeniz gerekiyorsa, parantezleri hatırlamanız/aramanız gerekmez. Gelecekteki programcılar kodu okuduğunda, parantezler her zaman açıktır.

Artı tarafta, ReSharper Visual Studio'da tembel programcılar için parantezleri otomatik olarak ekleyecek ve diğer IDEs için de eklentiler olduğunu varsayalım.

8
shimonyk

İlk sözdizimini neredeyse istisnasız kullanıyorum. Çünkü yanlış yorumlanamaz.

"Beni düşündürme" sadece kullanıcı arayüzleri için geçerli değildir, hepiniz ;-)

7
Steven A. Lowe

Ben şahsen ikinciyi tercih ederim. Birincisi çirkin, garip görünüyor ve yatay alanı boşa harcıyor. İkincisi ile ilgili temel problemler makrolar ve kodunuzu daha sonra değiştirerek yanlış yapan kişilerdir.

Bunun için "makro kullanma" diyorum. Ben de "lanet kodunuzu doğru girinti" diyorum. Programlama için kullanılan her metin düzenleyicisinin/IDE'nin otomatik olarak girintiyi nasıl değerlendirdiğini düşünürsek, bunu yapmak o kadar zor olmamalıdır. Emacs'ta kod yazarken, önceki satıra yanlış bir şey yazıp yazmadığımı belirlemek için otomatik girintiyi kullanırdım. Emacs her zaman girintiyi azaltmaya başlar, genellikle yanlış bir şey yaptığımı biliyorum.

Uygulamada, benden önce hangi kodlama kuralını oluşturduğumu takip ediyorum. Ama bunlar beni rahatsız ediyor (ve Python ve bu parantez felaketi gittiğinde) beni çok daha mutlu ediyor:

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

Sonra

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

Dürüst olmak gerekirse, bir if ifadesindeki iki ifade beni tek bir ifadeden çok daha fazla rahatsız ediyor. Çoğunlukla o zaman parantez gereklidir ve if ifadesinde sadece iki ifade ile hala komik görünüyor.

5
jsternberg

İki satırlı sürümü parantez kullanmadan kullanıyorum (2. form), ancak yerden tasarruf etmek için değil.

Bu formu kullanıyorum çünkü daha okunabilir, görsel olarak daha çekici ve yazımı daha kolay buluyorum. Bu formu sadece bu koşullar yerine getirilirse kullanıyorum; yani if koşulu tek bir satıra iyi uymalıdır ve karşılık gelen ifade aşağıdaki satıra iyi uymalıdır. Durum böyle değilse, okunabilirliği artırmak için parantez kullanacağım.

Bu formu kullanırsanız, if ifadesinden önce (veya varsa yorumun üstünde) boş bir satır (veya yalnızca küme ayracı içeren bir satır) olduğundan emin olun. Bu bilinçli olarak takip ettiğim bir kural olmasa da, şimdi bu soruyu okuduktan sonra fark ediyorum.

Ekran alanını korumak benim için bir öncelik değil. Daha fazla alana ihtiyacım olursa daha büyük bir monitör kullanırdım. Ekranım zaten dikkatimi yoğunlaştırmak için ihtiyaç duyabileceğim her şeyi okuyabilecek kadar büyük. Bir kerede tüm ekranımı kaplayacak kadar çok kod satırına odaklanmam gerekmiyor. Bir kerede daha fazla görüntülemeden anlayamadığım bir kod yığını ile devam eden çok fazla yuvalama varsa, o zaman mantığın yeniden düzenleme ile daha iyi temsil edilip edilemeyeceğini düşünmeliyim.

Aşağıda, if ifadesinin bu biçimini nasıl kullandığımı gösteren bazı örnekler verilmiştir.

    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();
    }

Diş teli. Her zaman. Ben onların hayranıyım, çünkü kod bazı tutarlılık verir. Ayrıca @dsimcha'nın yazdığı gibi - ek kod satırları ekleme konusunda daha az şans.

Tek bir kod satırı çevresindeki parantezlerin "çirkinliği", hata ayıklama ve/veya kod ekleme olan durumlarda olası ek çalışmalardan daha az zararlıdır.

3

Şahsen parantez ile gidiyorum.

Neden?

Herkes gelir ve if deyimine kod eklemeniz gerekiyorsa, kapsamın nerede olduğu% 100 açıktır.

Blokta kaç ifade olursa olsun if ifadelerinin formatını tutarlı tutar.

Bununla birlikte, eğer proje tarzı onsuz gidecekse, buna sadık kalın.

2
ChrisF

Hemen hemen her zaman parantezleri güvenli tarafta olmak için kullanıyorum. Ancak, bazen bloğun içeriği gerçekten kısaysa, onları bırakıp şöyle bir tek astar yapacağım:

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

Tutarlılık için parantezleri tercih ediyorum, ancak çok fazla beyaz alan harcamıyorum (bu yüzden daha okunabilir şekilde biçimlendirilmiş kod benim sınırlı görüş alanımda). Bu yüzden yeterince kısa satır için yazıyorum:

If (cond) { statement; }
1
hotpaw2

Genellikle kaşlı ayraç kullanıyorum, ancak kullanmadığım bazı durumlar var.

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;
}

Bana göre onları oraya eklemek saçma olurdu. Birisi return öğesinden sonra bir ifade eklerse, kapsam belirleme sorunlarından daha büyük sorunlarımız olur.

IDE kod biçimlendirmesi varsa, ayraç kullanmıyorum.

Diğer yandan, kodun otomatik biçimlendirmeyi desteklemeyen diğer editörlerde düzenlenebileceği durumlarda, diğer yazılarda belirtildiği gibi parantez koymamak tehlikelidir. Ama öyle olsa bile, diş telleri kullanmamayı tercih ediyorum ve bu benim için sorun olmadı.

0
nimcap