Kıvırcık parantezleri atlamak neden kötü bir uygulama olarak kabul edilir? [kapalı]


177

Neden herkes bana böyle bir kod yazmanın kötü bir uygulama olduğunu söylüyor?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

Kıvırcık parantezleri atlamakla ilgili en büyük argümanım, bazen onlarla iki kat daha fazla çizgi olabileceğidir. Örneğin, C # içindeki bir etiket için bir parlama efekti boyamak için bazı kodlar.

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

usingsMilyonlarca kez girintiye girmek zorunda kalmadan zincirleme yapmanın ek avantajını da elde edebilirsiniz .

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

Kıvırcık parantezler için en yaygın argüman, bakım programlaması ve orijinal if ifadesi ve amaçlanan sonucu arasına kod ekleyerek ortaya çıkabilecek sorunlar etrafında döner:

if (foo)
    Bar();
    Biz();

Sorular:

  1. Dilin sunduğu daha kompakt sözdizimini kullanmak yanlış mı? Bu dilleri tasarlayan insanlar akıllıdır, her zaman kullanımı kötü bir özellik koyacaklarını düşünemiyorum.
  2. En düşük ortak paydayı anlamak ve onunla çalışmakta sorun yaşamamak için kod yazmalı mıyız veya yapmamalı mıyız?
  3. Kaçırdığım başka bir argüman var mı?

6
Size katılıyorum. Onları atlayın. Dönemi.
Andrei Rînea

67
2010 YILI BİR ŞEYE BİRÇOK ÇOK HATTI HAKKINDA KİMLER BAKIR. Monitörler geniş ve ucuz ve yüksek çözünürlüklüdür! Monitörüm 2048 X 1152 ve bende iki tane var! Okunabilirlik, bulunması zor olan küçük hataları kolayca ekleyebildiğinizde 2 dikey çizgi kaydetmenin çok daha önemlidir.

51
Monitörler geniş ve ucuz, ancak uzun ve ucuz değiller . Dikey alan, yatay alandan daha azdır.
Adam Diyor - Monica'yı Geri Verin

32
@AdamRuth Onları yana çevir :)
Zachary Yates

16
Bu yüzden Şubat 2014, LOL'de bulunan SSL hatasıyla Apple gibi sıkmayın.
learnvst

Yanıtlar:


183

Aslında, beni gerçekten bitiren tek zaman hata ayıklama ve bar () yorum:

if(foo)
  // bar();
doSomethingElse();

Bunun dışında, ben kullanma eğilimindedir:

if(foo) bar();

Hangi yukarıdaki dava ilgilenir.

EDIT Soruyu açıkladığınız için teşekkür ederim, katılıyorum, en düşük ortak paydaya kod yazmamalıyız.


31
Tabii ki bu zor, ancak bence koruyucular için en büyük sorun, ikinci bir satır ekleyecekleri ve GERÇEKTEN olması gerektiği gibi görünse bile koşullu ifadenin bir parçası olmadığını fark etmemeleri.
danieltalsky

23
Bir astar stilini sevmiyorum çünkü her zaman aşağıdaki döngü gövdesini arıyorum.
Nosredna

18
Tek astar stilini faydalı olmaktan daha rahatsız edici buluyorum çünkü (özellikle derin yuvalamada - ugh) ifade kolayca aşırı olabilir ve karışıklık ortaya çıkabilir. Neredeyse sadece giriş doğrulama (yani erken döner) veya döngü kontrolü (örneğin dosya sistemindeki yürüyüşlerde alakasız dosya adlarını yoksaymak) için boş satırların ana koddan ayarlanmasına yardımcı olan bu tür tek ifadeli ifs kullanıyorum.
Alan Plum

1
Tek çizgi stili ayrıca çubuğu () test kapsamından gizler. Foo her zaman yanlış olsa bile örtülü görünecektir.
Bohumil Janda

1
Bu, "kaynak kıvırcık parantezleri içermiş olsaydı, hata ayıklama sırasında zaman kaybetmezdim" demenin başka bir yoludur. - diş telleri eklemek son derece basittir ve bir sonraki kişi için tuzaklar bırakmaktan kaçınır. Tek argüman "okunabilirlik" tir.
Andrew Theken

156

Okuma hızı ...

Daha önce bahsedilenlerden başka. Bu noktada, eğer parantez ve beyaz boşluk içeren ifadeleri ayrıştırmak için koşullandırıldım. Bu yüzden okudum:

if (condition)
{
    DoSomething();
}

DoSomethingElse();

Okuduğumdan biraz daha hızlı:

if (condition) DoSomething();

DoSomethingElse();

Şöyle görünüyorsa biraz daha yavaş okudum:

if (condition) DoSomething();
DoSomethingElse();

Bunu bir öncekinden önemli ölçüde yavaş okudum:

if (condition) 
    DoSomething();
DoSomethingElse();

çünkü ben yardım edemem ama sadece durumda tekrar okuyun ve yazarın amaçladığını merak ediyorum:

if (condition)
{
    DoSomething();
    DoSomethingElse();
}

Zaten genel olarak ele alınmıştır, ancak aşağıdakileri okumak söz konusu olduğunda, yazarın neyi amaçladığından emin olmak için bir süre buna bakacağım. Orijinal yazarı onaylamak için bile avlayabilirim.

if (condition) 
    DoSomething();
    DoSomethingElse();

29
Sorun, 4. örneğinizde, DoSomethingElse () öğesinden ayırmak için if ifadesinden sonra boş bir satır koyduğunuzda çözülür. Başka bir şey, 2 veya 3'lük gruplara satırlar koymak, okunabilirliğe önemli ölçüde yardımcı olur, sadece kodu daha hızlı tararsınız.
Piotr Owsiak

6
Belki de Python'a alışkın olduğum için, ancak ilk kıvırcık ayracı if ifadesiyle aynı satıra koymak daha hızlı okumamı + anlamamı sağlıyor.
Ocak'ta Ponkadoodle

16
Parantezsiz stille ilgili sorun, bloğun daha önemli şeylerden ziyade diş telleri olup olmadığını düşünerek değerli konsantrasyon düşünmenizi boşa çıkarmanızı sağlar. Bu tek başına, her zaman parantez olan en basit konvansiyonu kullanmak için yeterince iyi bir nedendir.
Nate CK

2
Diş telleri doğası gereği açıktır. Buna sadık kalacağım, teşekkürler.
TheOptimusPrimus

2
Son durumda, orijinal yazarı avlayın ve ona şaplak
Per Lundberg

55

Küçük bir şeyse, şöyle yazın:

if(foo()) bar();

İki satıra bölünecek kadar uzunsa, diş telleri kullanın.


evet, ben de öyle yapıyorum. Başka bir satır eklerseniz sizi parantez eklemeye zorlar ve bar () öğesinin aslında if'nin bir parçası olduğunu görmek oldukça açıktır, bu yüzden sadece yorum yaparsanız kötü şeyler olur.
jalf

10
Çok hata ayıklayıcı dostu olsa da. "Çubuk" kısmında bir kesme noktası nasıl kurarsınız?
Nemanja Trifunovic

9
@Nemanja: İmlecinizi bar () üzerine getirin; ve F9 tuşuna basın. Hem VS2005 hem de VS2008, ayrı "ifadeler" oldukları takdirde hat içi kesme noktalarını işler.
GalacticCowboy

4
GalanticCowboy: Bildiğinizden daha fazla ortam var. :-)

20
Tabii, ancak içerik C # olduğundan, kullanıcıların önemli bir çoğunluğunu kapsamalıdır ...
GalacticCowboy

47

Ayrıca gerçekten gerekli olduğunda sadece parantez kullanmanın daha iyi olduğunu düşünürdüm. Ama artık değil, ana neden, çok fazla kodunuz olduğunda, daha okunabilir hale getirir ve tutarlı bir destek stiliniz olduğunda kodu daha hızlı ayrıştırabilirsiniz.

Her zaman diş telleri kullanmanın bir başka iyi nedeni, if'ye ikinci bir ifade ekleyen birinin yanı sıra, böyle bir şey olabilir:

if(a)
   if(b)
     c();
else
   d();

Diğer cümlenin aslında "if (b)" ifadesinin olduğunu fark ettiniz mi? Muhtemelen yaptınız, ama bu yakalamaya aşina olan birine güvenir misiniz?

Yani, sadece tutarlılık için ve ne zaman beklenmedik şeylerin olabileceğini asla bilmediğiniz için başka biri (her zaman aptal olan diğerleri) kodu değiştirdiğinde , her zaman parantez koyarım, çünkü kaynak kodunu daha okunabilir, ayrıştırmayı daha hızlı yapar beynin. Sadece en basit if ifadeleri için, eğer bir delegasyonun yapıldığı veya anahtar benzeri olduğu gibi, cümlenin asla uzatılmayacağını bildiğiniz gibi, parantezleri dışarıda bırakırım.


12
Bu, parantez kullandığım iki durumdan biri. Aksi halde değil.
Andrei Rînea

3
Bu daha çok sanki (a && b) gibi yazılmalıdır.
alexander.biskop

8
@ alexander.biskop: Elbette hayır, çünkü bu, bloğa eklenmiş !a || !b( !a) veya eksiz ( ) 'den farklı bir anlamı ( ) verir a && !b.
Ben Voigt

1
@Ben Voigt: Doğru! Düştü ;-) Yarım yıl ve iki upvotes sonra, biri yaptığım ifadenin yanlış olduğunu fark ediyor ... Sanırım detaylara yeterince dikkat etmedim, çünkü yorumumun arkasındaki niyet işaret etmekten farklı bir şeydi bu if-maddesinin teknik olarak doğru bir dönüşümü. Demek istediğim, iç içe satır içi if ifadelerinin genellikle okunabilirliği (ve özellikle kontrol akışının izlenebilirliğini) önemli ölçüde imho olması ve dolayısıyla bir ifadeye (veya tamamen atlanması) birleştirilmesi gerektiğiydi. Şerefe
alexander.biskop

3
@ alexander.biskop: Aynı zamanda, her biri daha basit koşullara sahip iç içe yuvalarla hata ayıklama daha kolaydır, çünkü her birine tek adım atabilirsiniz.
Ben Voigt


35

Hatlar ucuz. İşlemci gücü ucuz. Geliştirici zamanı çok pahalı.

Genel bir kural olarak, kesinlikle kaynak / hız kritik bazı uygulamalar geliştirmiyorum sürece, her zaman kod yazma tarafında hata olur

(a) Başka bir geliştiricinin yaptığım şeyi takip etmesi kolay

(b) Kodun gerekebilecek belirli bölümlerini yorumlayın

(c) Bir şeyler ters giderse hata ayıklaması kolaydır

(d) İleride olması gerektiğinde kolayca değiştirilebilir (yani kod ekleme / çıkarma)

Kodun hızı veya akademik zarafeti, İş açısından bu faktörlere ikincildir. Bu, tıknaz veya çirkin kod yazmak için yola çıktığımı değil, bu benim öncelik sırasım.

Kıvırcık parantezleri çoğu durumda atlayarak, benim için (b), (c) ve (d) 'yi zorlaştırır (ancak not imkansız değildir). Kıvırcık parantez kullanmanın (a) üzerinde etkisi olmadığını söyleyebilirim.


9
(A) ile ilgili son ifadeniz, buradaki diğer posterler de dahil olmak üzere çok sayıda geliştiricinin tartışacağı görüşündedir.
Kelly

34

Kıvırcık ayraçın sunduğu netliği tercih ederim. Tam olarak ne anlama geldiğini biliyorsunuz ve birinin sadece goofed ve bırakıp bırakmadığını (ve bir hata getirdiğini) tahmin etmek zorunda değilsiniz. Onları atladığım tek zaman, if ve eylemi aynı satıra koyduğum zamandır. Bunu da çok sık yapmıyorum. KER C benzeri programlamanın yıllardan beri, çizgiyi bir küme ayracı ile bitirmek IDE için zorlamıyorsa üstesinden gelmek için çalışmam gereken bir uygulama olsa da ben mi.

if (condition) action();  // ok by me

if (condition) // normal/standard for me
{
   action();
}

23

Bence üzerinde çalıştığınız proje ve kişisel zevkiniz için bir kurallar meselesi.

Aşağıdakiler gibi bazı durumlar dışında, genellikle ihtiyaç duyulmadığında bunları atlarım:

if (something)
    just one statement; // i find this ugly
else
{
    // many
    // lines
    // of code
}

tercih ederim

if (something)
{
    just one statement; // looks better:)
}
else
{
    // many
    // lines
    // of code
}

15

Bunun sizi ısıtabileceği örneklerden biri C / C ++ makrolarının eski günlerinde. Bunun bir C # sorusu olduğunu biliyorum, ancak genellikle kodlama standartları, standardın ilk etapta yaratılma nedenleri olmadan devam ediyor.

Makrolarınızı oluştururken çok dikkatli değilseniz, {} kullanmayan if ifadelerinde sorunlara neden olabilirsiniz.

#define BADLY_MADE_MACRO(x) function1(x); function2(x);

if (myCondition) BADLY_MADE_MACRO(myValue)

Şimdi, beni yanlış anlamayın, sadece C / C ++ 'da bu sorunu önlemek için her zaman {} yapmanız gerektiğini söylemiyorum, ama bu yüzden bazı garip hatalarla uğraşmak zorunda kaldım.


2
sadece tüm kodlar böyle ilan edilirse ... nefes
Nathan Strong

15

Ben de aynı şekilde düşünürüm.

Bir güne kadar (neden her zaman hayatınızı sonsuza dek değiştiren "bir gün" var?) 24-36 saat boyunca, üretim kodunda hata ayıklama yapmadan sadece birinin arama / değiştirme değişikliği ile birlikte parantez koymadığını öğrenmek için harcıyoruz .

Böyle bir şeydi.

 if( debugEnabled ) 
      println( "About to save 1 day of work to some very important place.");
 saveDayData();

Sonra gelen

 if( debugEnabled ) 
 //     println( "About to save 1 day of work to some very important place.");
 saveDayData();

Sistemin günlük 500 MB kütük ürettiği ortaya çıktı ve bizden durdurmamız istendi. Hata ayıklama bayrağı yeterli değildi, bu yüzden bir arama ve değiştirme println sırayla yapıldı.

Yine de uygulama üretime geçtiğinde hata ayıklama bayrağı kapalı ve önemli "saveDayData" asla çağrılmadı.

DÜZENLE

Şimdi kaşlı ayraçları kullanmadığım tek yer if / try yapıda.

if( object != null ) try { 
     object.close();
} catch( .....

Bir süperstar geliştiricisini izledikten sonra.


3
Anlamıyorum. Hata ayıklamayı (debugEnabled) denetleyen bir değişkeniniz var ve yine de hata ayıklamayı devre dışı bırakmak için yorumları kullanıyorsunuz ??? Neden debugEnabled öğesini false olarak ayarlamadınız?
Igor Popov

Bu tam olarak senaryo değil, ama iyi bir noktaya değindiniz. Aptalca şeyler (hata ayıklamayı false olarak ayarlamamak gibi), "bariz" hatalardan daha zor bulunan ince ve aptal hatalar yaratır. Bu durumda parantez kullanmamak çok yardımcı olmadı.
OscarRyz

1
@igor Peki tüm günlük kaydı satırlarını değil, yalnızca bir günlük kaydı kaldırmak istedikleri için ne dersiniz?
gman

14

Künt olmak için şöyle görüyorum:

İyi programcılar defalarca program yapar, Kötü programcılar bunu yapmaz.

Yukarıdaki birkaç örnek ve parantez unutarak ilgili hatalarla kendi benzer deneyimlerim olduğundan, HER ZAMAN AĞIRLIKLARINIZIN zor yolunu öğrendim.

Başka bir şey kişisel tarzın güvenliğe göre seçilmesidir ve bu açıkça kötü bir programlamadır.

Joel bile bundan bahsediyor Yanlış Kodun Yanlış Görünmesinde

Bir kez eksik diş telleri nedeniyle bir hata olsun, eksik diş telleri yanlış görünüyor çünkü başka bir hata oluşması için potansiyel bir yer olduğunu biliyorum.


Açık köşeli parantezler kendiliğinden satırlara yerleştirilirse, iki veya daha fazla satırın küme ayracı çifti olmadan girintili olduğu yerde, herhangi bir küme ayracı çifti gibi yanlış görünecektir. Böyle bir kullanım, bir ififadenin bir bloğu kontrol ettiği durumlarda boş bir satıra mal olur , ancak bir ififadenin blok yerine tek bir eylemi kontrol ettiği durumlarda bir blok ihtiyacından kaçınır .
supercat

14

Şunlar için oldukça mutluyum:

foreach (Foo f in foos)
  foreach (Bar b in bars)
    if (f.Equals(b))
      return true;

return false;

Şahsen, nedenini anlamıyorum

foreach (Foo f in foos)
{
  foreach (Bar b in bars)
  {
    if (f.Equals(b))
    {
      return true;
    }
  }
}

return false;

artık daha okunabilir.

Evet, satırlar ücretsiz, ancak neden sayfaların yarısı ve kod sayfalarının yarısı büyüklüğünde olabiliyorsa kaydırmam gerekiyor?

Okunabilirlik veya bakımda bir fark varsa, o zaman, elbette, parantezleri koyun ... ama bu durumda herhangi bir neden görmüyorum.

Ayrıca, her zaman başka bir yerde yuvalanmışsa yuvalanmış için parantez koyacağım

if (condition1)
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();

vs

if (condition1)
  if (condition2)
    doSomething();
else (condition2)
  doSomethingElse();

çok kafa karıştırıcı, bu yüzden her zaman şöyle yazıyorum:

if (condition1)
{
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();
}

Mümkün olduğunda üçlü operatörler kullanıyorum, ama onları asla yuvalamıyorum .


sadece bu neredeyse benim kod oluyor :) gördüm ben etrafa bir göz olacak düşündüm ve lo ve hadi ... zaten orada :)
Noctis

10

"Birinin size kod yazması için ödeme yapmasını sağlayacak kadar zekiyseniz, kodun akışını görmek için yalnızca girintiye güvenmeyecek kadar zeki olmanız gerekir."

Ancak ... hatalar yapılabilir ve bu hata ayıklamak için bir acıdır ... özellikle başka birinin koduna bakmaya geliyorsan.


10

Felsefem kodu daha okunaklı kılıyorsa neden yapmıyorsunuz?

Açıkçası, kısa ve aşırı tanımlayıcı değişken isimleri arasındaki mutlu ortamı bulmak gibi bir yere çizgi çizmeniz gerekiyor. Ancak parantezler gerçekten hatalardan kaçınır ve kodun okunabilirliğini artırır.

Kodlayıcı olacak kadar zeki insanların, parantezsiz ifadelerden kaynaklanan hataları önleyecek kadar zeki olduklarını iddia edebilirsiniz. Ama dürüstçe, hiçbir zaman bir yazım hatası kadar basit bir şey tarafından açılmadığınızı söyleyebilir misiniz? Bunun gibi Minutia büyük projelere bakarken çok zor olabilir.


7
Tabii ki bu çok öznel. Onları bir ara bırakmak, okunabilirliği artırır.
Brian Knoblauch

Doğru, eğer köşeli parantezleri dışarıda bırakırsam, diğerlerinin de bahsettiği gibi, bir çizgiyi tutarım. Çok defa ısırıldım ama çok satırlı parantezsiz ifadeler. Bakmayı bilseniz bile, yine de zaman zaman sizi alabilir.
James McMahon

10

Her zaman istisnalar vardır, ancak parantezleri yalnızca formlardan birinde olduğunda atlamaya karşı çıkacağım:

if(x == y)
   for(/* loop */)
   {
      //200 lines
   }

//rampion's example:
for(/* loop */)
{
   for(/* loop */)
      for(/* loop */)
      {
         //several lines
      }
}

Aksi takdirde sorunum yok.


4
Kötü örnekler. Her iki durumda da, 200 hattını kendi yöntemine veya tercihen birkaç yönteme dönüştürmek için çarpanlara ayırırım.
Adam Jaskiewicz

2
Doğru, ama OLUYOR. Ayrıca, bir blok okuyucunun ekranından daha yüksek olduğunda bu sorunu yaşarsınız. Ayrıca, kod okuyucunuzun ekran yüksekliğini kontrol edemezsiniz. Her iki tarafta sadece birkaç çizgi görebilirler.
rampion

2
Olur. Bu olması gerektiği anlamına gelmez .
Adam Jaskiewicz

3
@AdamJaskiewicz Doğru. Olur. Biz düşünmek zorunda değil daha ziyade olandan, gerçekleşmesi gerektiğini olur. Biz ne kendimizi kısıtlamak olsaydı gerektiğini biz ne hatalar hakkında endişe gerek olmazdı.
Beska

10

Bazen çok alt kodu (birden çok ifade kullanarak) kullanın, ama bunun dışında her zaman parantez koymak. Ben sadece kodu daha net yapar buluyorum. Açık bir ifadeyle, bir ifadenin bir bloğun bir parçası olduğu (ve muhtemelen bir if vb.nin bir parçası) olduğu açıktır.

Gördüm

if (...)
    foo();
    bar();

- böcek beni ısırmaya (Aslında hata tanıtmak etmedi doğrusu "beni ve arkadaşları") bir zamanlar . Bu, o zamanlar kodlama standartlarımızın her yerde parantez kullanılmasını önermesine rağmen oldu. Tespit etmem şaşırtıcı derecede uzun sürdü - çünkü ne görmek istediğini görüyorsun. (Bu yaklaşık 10 yıl önceydi. Belki şimdi daha hızlı bulurdum.)

Tabii ki "çizginin sonunda küme ayracı" kullanırsanız, ortaya çıkan fazladan satırları azaltır, ama ben yine de bu tarzı kişisel olarak sevmiyorum. (İş yerinde kullanıyorum ve beklediğimden daha az tatsız buldum, ama yine de biraz tatsız.)


Her zaman tutarlılığın gerçek tarzdan daha önemli olduğunu savunuyorum, neden sadece kullanımlarda bir istisna yapmalıyız?
Bob

@Bob: İyi bir noktaya değindim ve bunu sadece ara sıra yapıyorum. Burada gerçek nedenlerim varmış gibi davranmak istemiyorum :) Aslında, makul bir neden var - bu gibi kullanımları (ve sadece kullanımları) iç içe yerleştirmek oldukça açıktır ve hala bir blok ile sonuçlanırsınız . Tehlikeyi hemen göremiyorum.
Jon Skeet

Tabii ki herhangi bir tehlike olmadığını söylemiyoruz .
Jon Skeet

1
Bu hata için en iyi çözüm: Python kullanın. (
Şaka yapıyorum

10

Ben bilgisayar programlama bu alanda (sen çok) akranlarım tek satır blokları üzerinde parantez atlamak potansiyel hata olasılığı göz korkutmak etkilendim ve alçakgönüllülük.

Sanırım akıllı olmadığım anlamına geliyor. Bu konuda birçok kez hata yaptım. Bu konuda başkalarının hatalarını ayıkladım. Bu nedenle yazılım gemisini hatalarla izledim (VS2002 çalıştıran bir makineye RDP ve izleme penceresi yazı tipi sakat olacak).

Kodlama stilindeki bir değişiklikle önlenebilecek tüm hatalara bakarsam, liste çok uzundur. Bu vakaların her birinde yaklaşımımı değiştirmeseydim, muhtemelen hiçbir zaman bir programcı olarak yapmazdım. Yine sanırım akıllı değilim. Telafi etmek için, uzun zamandır tek satır bloklarda parantezin sadık bir kullanıcısıyım.

Bununla birlikte, dünyada "tek satır bloklarda parantez kullanacaksınız" kuralını bugün Musa'nın bize indirdiği zamandan daha az alakalı hale getiren bazı şeyler değişti:

  • Bazı popüler diller, bilgisayarın programcı gibi girintiyi okumasını sağlayarak sorunu ortadan kaldırır (örn. Python).

  • Editörüm benim için otomatik olarak biçimlendirildiğinden , girintiyle yanıltıcı olma şansım çok azaldı.

  • TDD , tek satırlık bir blokla karıştırıldığım için bir hata verirsem, hatayı hızlı bir şekilde keşfetmem daha olasıdır.

  • Yeniden düzenleme ve dil ifadesi , bloklarımın çok daha kısa olduğu ve tek satırlı blokların eskisinden çok daha sık olduğu anlamına gelir. Varsayımsal olarak, ExtractMethod'un acımasız bir uygulamasıyla, tüm programımda muhtemelen sadece tek satır blokları olabilir. (Bunun nasıl görüneceğini merak ediyorum?)

Aslında, tek satır bloklar üzerinde acımasızca yeniden düzenleme ve parantezleri atlamanın belirgin bir yararı olabilir: parantez gördüğünüzde, kafanızda "burada karmaşıklık! Dikkat!" Diyen küçük bir alarm çıkabilir. Bunun norm olup olmadığını düşünün:

if (condition) Foo();   // normal, everyday code

if (condition) 
{
    // something non-trivial hapening; pay attention!
    Foo();
    Bar();
}

Kendimi kodlama kuralımı "tek satırlı bloklarda asla parantez olmayabilir" veya "bloğu koşulla aynı satıra koyabilirseniz ve 80 karaktere sığarsa, kaşlı ayraçları atla ". Göreceğiz.


Eski bir Java programcısı olarak, otomatik biçimlendirme sorunun gerçek cevabı olarak tamamen katılıyorum. Editörünüzün otomatik olarak parantez eklemesine bile gerek yok - tek başına otomatik girinti, belirsizlikleri önlemekten çok yardımcı olabilir. Tabii ki şimdi Python'a geçtim, kodumu düzgün bir şekilde biçimlendirmeye alışkın oldum.
Alan Plum

Aynı şeyi parantez için de hissediyorum. Her şey karmaşıklık hakkında. İdeal olarak sadece bir satır bloğumuz olurdu. Buna okunabilirlik diyorum, gereksiz diş telleri değil.
Igor Popov

9

Üç sözleşmeden:

if(addCurleyBraces()) bugFreeSofware.hooray();

ve:

if(addCurleyBraces())
    bugFreeSofware.hooray();

ve (açılış ve kapanış ayracı kullanan herhangi bir girinti stilini temsil eder):

if(addCurleyBraces()) {
    bugFreeSofware.hooray();
}

Sonuncuyu şu şekilde tercih ederim:

  • Tüm if ifadeleri aynı şekilde yazılmışsa okumayı daha kolay buluyorum.
  • Yazılımı biraz daha sağlam ve hatasız hale getirebilir. Bununla birlikte, tüm modern IDE'ler ve gelişmiş metin editörleri, yorum biçimlendirmesini bozmadığı veya ekip standartlarına aykırı olmadığı sürece herkesin kullanması gerektiğini düşündüğüm güzel otomatik girintili özelliklere sahiptir (çoğu durumda özel bir biçimlendirme şeması oluşturmak mümkündür) ve ekiple paylaşın). Demek istediğim, girintinin doğru yapılması durumunda hata girişi riskinin biraz azalması.
  • Boole ifadesinin ve ifadelerinin farklı satırlarda yürütülmesini tercih ederim. Hata ayıklama amacıyla bir satırı işaretlemeyi seviyorum. Bir deyimi işaretleyip ona adım atabileceğim bir IDE kullanıyorsam bile, bu etkileşimli bir işlemdir ve hata ayıklamaya başladığımı unutabilirim ya da en azından birkaç kod boyunca adım atmam biraz zaman alacak (hata ayıklama sırasında her seferinde konumu manuel olarak işaretlemem gerektiğinden).

8

Diş telleri kullanmayla ilgili temel argümanlarınız ek satırlar kullanmaları ve ek girinti gerektirmeleri.

Satırlar (neredeyse) ücretsizdir, kodunuzdaki satır sayısını en aza indirmek objektif olmamalıdır.

Ve girinti, ayraç kullanımından bağımsızdır. Basamaklı 'kullanma' örneğinizde, parantezleri atlasanız bile onlara girintili olmanız gerektiğini düşünüyorum.


8

Düzenli ve özlü kod yazarken güçlü bir inancım, ama her zaman kıvırcık parantez kullanırdım. Hızlı bir şekilde belirli bir kod satırı var kapsamını görmek için uygun bir yol olduğunu bulmak. Belirsizlik yok, sadece önünüzde beliriyor.

Bazıları bunun bir tercih örneği olduğunu söyleyebilir, ancak bir programın mantıksal akışını dahili olarak tutarlıysa takip etmeyi çok daha kolay buluyorum ve böyle bir IF ifadesi yazmanın tutarlı olduğuna inanmıyorum;

if(x < y)
    x = y;
else
    y = x;

Ve bunun gibi bir başkası;

if(x < y)
{
    x = y;
    x++;
}
else
{
    y = x;
    y++;
}

Sadece bir genel stil seçip ona sadık kalmayı tercih ederim :)


7

Ana konulardan biri, kontrol ifadesinden ( for, neyiniz ifvar) ve ifadenin sonundan ayrı olarak, tek astarlı ve tek olmayan astar bölgelerine sahip olmanızdır.

Örneğin:

for (...)
{
  for (...)
    for (...) 
    {
      // a couple pages of code
    }
  // which for block is ending here?  A good text editor will tell you, 
  // but it's not obvious when you're reading the code
}

4
Neden yine de for döngüsü için birkaç sayfa kodunuz var?
Adam Jaskiewicz

b / c Ben duyarsız bir keseciyim ve fonksiyon çağrılarının "maliyetinden" kurtulmak için takıntılıyım. :)
rampion

4
Birkaç kod sayfası genellikle ayrı bir işlevde olmalıdır.
Jonathan Leffler

1
pardon, demek istediğim böyle bir topluluğun rolünü oynuyordum. Ancak, aynı sorun küçük bir görünümden bakıldığında daha kısa bölgeler için ortaya çıkabilir. Ve bu kodlayıcının kontrolü dışında.
rampion

7

Eskiden "kıvırcık parantez bir zorunluluktur!"

if (foo)
    snafu();
    bar();

İyi birim testleri ile, okunabilirliği geliştirmek için basit ifadeler için kıvırcık parantezleri güvenle çıkarabilirim (evet, bu öznel olabilir).

Alternatif olarak, yukarıdaki gibi bir şey için, muhtemelen şöyle görünmesini isterim:

if (foo) snafu();

Bu şekilde, koşula bar () eklemesi gereken geliştirici, kıvırcık parantez eksikliğini tanımaya ve eklemeye daha yatkın olacaktır.


2
"İhtiyacım yok" dedin ve kullanmak için bir sebep verdin: okunabilirlik!
tvanfosson

4
Bunu bulmak için Birim Testine güvenmem. LINT belki, Birim testi no!
Kristen

2
@Kristen - Birim testi fikri, yöntemin davranışını ortaya koymaktır. Davranış değişirse (yukarıda açıklandığı gibi) birim testi başarısız olur. Ben problemi görmüyorum.
Liggy

Ama neden UT'ye gitmeden önce düzeltilmesi gereken göze çarpan bariz olanı almak için Birim Testine güvenelim?
Andrew

7

Bazı kişisel yargıları kullanın.

if (foo)
  bar();

tek başına iyidir. Daha sonra böyle bir şey koyarak moronlar hakkında gerçekten endişelenmedikçe:

if (foo)
  bar();
  baz();

Moronlar hakkında endişelenmiyorsanız, iyisiniz (ben - temel kod sözdizimini doğru şekilde alamazlarsa, bu sorunlarının en azıdır)>

Buna karşılık, çok daha okunabilir.

Kalan zaman:

if (foo) {
  bar();
  baz();
}

Hatırlayabildiğim sürece bu benim favorim oldu. Bunlara ek olarak:

if (foo) {
  bar();
  baz();
} else {
  qux();
}

Benim için çalışıyor.

Dikey alan tek başına çok alakalı değil, okunabilirlik. Bir satırdaki açılış ayracı, gözünüz bir sonraki satıra geçene kadar sözdizimsel bir elemanın konuşmasını durdurur. Sevdiğim gibi değil.


İlk stili tercih ettiğim tek zaman, bir şeylerin yanlış olması durumunda hemen geri dönmem veya bir hata atmam gerektiğidir. Gibi if (parameter == null) return null;.
nawfal

7

Tamam, bu ölüme cevaplanan eski bir soru. Ekleyecek bir şeyim var.

Öncelikle şunu söylemeliyim: KIRMIZI KULLANIN. Sadece okunabilirliğe yardımcı olabilirler ve montaj yazmadığınız sürece okunabilirlik (kendiniz ve diğerleri için!) Öncelik listenizde çok yüksek olmalıdır. Her zaman okunamayan kod, her zaman hatalara yol açar. Parantezlerin kodunuzun çok fazla yer kapladığını görürseniz, yöntemleriniz muhtemelen çok uzundur. Doğru şekilde yapıyorsanız, herhangi bir yöntemin çoğu veya tümü bir ekran yüksekliğine sığmalıdır ve Bul (F3) arkadaşınızdır.

Şimdi benim eklemem için: Bununla ilgili bir sorun var:

if (foo) bar();

Yalnızca bar () çalışacaksa vurulacak bir kesme noktası ayarlamayı deneyin. Bunu, C # 'da imleci kodun ikinci yarısına koyarak yapabilirsiniz, ancak bu açık değildir ve biraz acıdır. C ++ ile hiç yapamadınız. C ++ kodu üzerinde çalışan en üst düzey geliştiricilerimizden biri, 'if' ifadelerini bu nedenle iki satıra ayırmakta ısrar ediyor. Ve ona katılıyorum.

Öyleyse bunu yapın:

if (foo)
{
    bar(); //It is easy to put a breakpoint here, and that is useful.
}

2
Çubuğa sağ tıklayın ve Kesme Noktası Ekle'yi seçin ... Hiç zor değil. Aletlerinizi tanıyın.
Bob

Gösterge çubuğuna sağ tıklamak hiçbir şey yapmaz; metni sağ tıklatmak mı demek istediniz? Her neyse, yalnızca "if" ifadesi doğru olduğunda ve "bar ()" kendi satırındayken kesme noktasının çarpılmasını istiyorsanız, imleci o satırın herhangi bir yerine koyabilir ve F9 tuşuna basabilir veya gösterge marjı. Bununla birlikte, tüm kod tek bir satırdaysa, imleci "bar ()" üzerine getirmeniz veya F9 tuşuna basmadan önce tam olarak sağ tıklamanız gerekir ve gösterge kenar boşluğunu tıklamak işe yaramaz (' Eğer'). "Zor" değildir, ancak kod iki satırdayken daha az konsantrasyon gerektirir.
taş

Oh, ha ha, "bar ()" ı sağ tıklayın. Metin demek istedin. Anladım. Tabii ya da sadece F9'a basın ...
taş

>> siz ") bar (" imleci konumlandırmak veya sağ F9 basmadan önce tam olarak oraya tıklamak zorunda (I imleç tam olarak orada önce ya F9 veya sağ tıklayarak basarak pozisyon ifade)
Taş

7

parantezli kodun çok fazla yer kaplamasını önlemek için, Kod Tamamlandı kitabında önerilen tekniği kullanıyorum :

if (...) {
    foo();
    bar();
}
else {
    ...
}

Neden indirdiğimi anlamıyorum, her zaman kullandığım her braket çifti için bir satır kaydeder
Eric

2
Bu daha popüler olarak K&R stili olarak bilinir. Kernighan ve Ritchie'nin C Programlama Dili kitabına dayanarak: en.wikipedia.org/wiki/The_C_Programming_Language_(book) . Ve sizi rahatsız etmemeli.
jmucchiello

Teşekkürler! Ben sadece kişisel bir tat olduğunu düşündüm. Bu sözdizimini kendim rahatsız edici buluyordum, ancak Code Complete'i okuduktan sonra kabul ettim ve şimdi gerçekten keyif aldım.
Nathan Prather

Ben "neden kimse henüz bunu önerdi ???" Kapatma dirseğini kapattığı blokla hizalar, yani "if" veya "while", vb. Anlamsız bir "{" değildir. +1.
nickf

Açık parantezler her zaman kendiliğinden hatlara yerleştirilirse if, bunu izleyen tek bir girintili çizgi, herhangi bir parantez gerektirmeden tek bir ifadeyi kontrol etmek olarak görsel olarak kabul edilebilir. Bu nedenle, açık-destek tek başına stil, bir ififadenin anlamsal olarak tek bir eylem olan bir şeyi kontrol ettiği durumda (yalnızca tek bir adımı içeren bir dizi adımdan farklı olarak) boşluktan tasarruf sağlar . Örneğin, if (someCondition)/ `new newException (...)` atın.
supercat

6

Diyelim ki bazı kodlarınız var:

if (foo)
    bar();

ve sonra başka biri gelir ve ekler:

if (foo)
    snafu();
    bar();

Yazılma şekline göre, bar (); artık koşulsuz yürütüldü. Kıvırcık parantezleri ekleyerek, bu tür bir yanlışlıkla hatayı önlersiniz. Kod, bu tür hataların yapılmasını zorlaştıracak veya imkansız hale getirecek şekilde yazılmalıdır. Bir kod incelemesi yapıyordum ve özellikle birden çok satıra yayılan eksik parantezleri görürsem, bir kusur yaratacağım. Gerekçelendirildiği durumlarda, böyle bir hata yapma şansının tekrar minimumda tutulması için bir satırda tutun.


Bu nokta zaten soruda belirtilmişti.
Mike Scott

Aslında pek değil. Evet, bu tür bir hata için potansiyelden bahsetti, ancak kodunuzu hataya dayanıklı hale getirme ve en iyi uygulamaların bir parçası olarak hata potansiyelini kaldırma hakkında konuşuyordum.
Elie

Gerçekten hata geçirmez kod diye bir şey var mı?
Bob

Hayır, ama daha zorlaştırabilirsiniz. Bunu neden yaptığınız hakkında daha iyi bir fikir edinmek için Jason Cohen tarafından "Akran Kod İncelemesinin En İyi Tutulan Sırları" bölümünü okuyun (bazı sayfaların kenarlarındaki bağlantıya bakın).
Elie

Bu Mike Scott kim ve neden cevap polisi? İnsanlar her zaman bariz olanı belirtmek zorunda kalıyorlar. Öyleyse Mike neden kullanıcıların bu sorun hakkında yayınladığı ek açıklama hakkında yorum yapmaya devam etmedi. Tüm cevaplar soruya atıfta bulunmuyor mu?
bruceatk

6

Çizgileri azaltmak gerçekten diş telleri bırakmak için iyi bir argüman değildir. Metodunuz çok büyükse, muhtemelen daha küçük parçalara dönüştürülmeli veya yeniden yapılandırılmalıdır. Bunu yapmak şüphesiz okunabilirliği basitçe parantez çıkarmaktan daha fazla artıracaktır.


5

İlk örneğiniz gibi, uygun olduğunda onları her zaman atlarım. Bakarak görebildiğim ve anlayabildiğim temiz, özlü kod Kaydırma ve satır satır okumak zorunda olduğum koddan daha kolay bakım, hata ayıklama ve anlama daha kolaydır. Bence çoğu programcı buna katılıyor.

Birden fazla yuvalama, if / else cümleleri vb. Yapmaya başlarsanız elden çıkması kolaydır, ancak çoğu programcının çizgiyi nerede çizeceğini söyleyebileceğini düşünüyorum.

Ben argüman gibi tür görmek if ( foo == 0 )vs if ( 0 == foo ). İkincisi, yeni programcıların hatalarını önleyebilir (ve hatta bazen gaziler için), birincisi kodu korurken hızlı bir şekilde okumak ve anlamak daha kolaydır.


4

Çoğu zaman bir şirket veya bir FOSS projesi için bir kodlama standardı olarak yerleşir.

Sonuçta bir başkasının kodunuzu alması gerekir ve her geliştiricinin üzerinde çalıştıkları kod bölümünün belirli stilini bulmak zorunda kalması büyük bir zaman kaybıdır.

Ayrıca, birisinin günde bir kereden fazla Python ve bir Cish dili arasında gittiğini düşünün ... Python'da girintileme, dilin blok sembolünün bir parçasıdır ve teklif ettiğiniz gibi bir hata yapmak oldukça kolay olacaktır.


Python hakkında yorum yapmak için +1. Diller arasında sürekli geçiş yaparken nasıl "aptal" olabileceğime hep şaşırdım.
Kena

3

Err daha güvenli tarafında - sadece bir hata daha potansiyel olarak düzeltmek zorunda kalmayacaksınız.

Tüm bloklarım kıvrımlara sarılırsa kişisel olarak daha güvende hissediyorum. Tek satırlar için bile, bunlar hataları kolayca önleyen basit gösterimlerdir. Bloğun gövdesini, bloğun gövdesini bloğun dışındaki aşağıdaki ifadelerle karıştırmamak için blokta ne olduğunu açıkça görmeniz açısından kodu daha okunabilir hale getirir.

Bir astarım varsa, genellikle aşağıdaki gibi biçimlendiririm:

if( some_condition ) { do_some_operation; }

Çizgi çok hantalsa aşağıdakileri kullanın:

if( some_condition )
{
    do_some_operation;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.