Kıvrımlı kaşlı ayraçlar kendi çizgisinde mi görünmeli? [kapalı]


273

Kıvrımlı kaşlı ayraçlar kendi çizgisinde olmalı mı yoksa olmamalı mı? Bu konu hakkında ne düşünüyorsun?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

ya da olmalı

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

ya da

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Lütfen yapıcı olun! Nedenini açıkla, deneyimlerini paylaş, gerçeklerle ve referanslarla destekle.


104
"== true" küme ayracı yerleştirme seçiminden daha rahatsız edici buluyorum.
Dan Dyer

11
@Dan: Koşullu ifadeyi her zaman açıklamanın, açıklığa büyük ölçüde yardımcı olduğunu düşünüyorum.
Sihirbaz79

4
Bunun önemli olmasının tek sebebi, IDE / editörünüzün eşleşen parantez tanıma özelliğini desteklememesiydi.
leeand00

4
@ leeand00: bazılarımız hala çalışmak / açıklama eklemek için karmaşık / yabancı kodlar yazdırabiliriz . İyi bir yazıcı güzel olsa da çoğu sorunu hafifletir.
Shog9

2
Üzgünüm soru kapalı. Bir miktar girinti tabanlı sözdizimi kullanımından sonra başka bir parantez yapısına geçtim (belki garip). Son satırdaki ilk ama kapanış ayracın gibi. (kod satırından sonra)
cnd

Yanıtlar:


88

Ben öğrenciyken, aynı satıra kıvırcık ayraçlar koyardım, böylece daha az satır olur ve kod daha az sayfaya yazdırılırdı. Bir satırdaki tek şey olarak basılan tek bir dirsek karakterine bakmak can sıkıcıdır. (çevre, kağıt israfı)

Ancak büyük uygulamaları kodlarken, içlerinde sadece parantez bulunan bazı çizgilere izin vermek, verdiği 'gruplama' hissini göz önünde bulundurarak uygun maliyetlidir.

Hangi stili seçerseniz seçin, tutarlı olun, böylece kendi beyninizin ilgili kod parçalarında çoklu stilleri işlemesi bir yük olmaz . Farklı senaryolarda (yukarıdaki gibi) farklı stilleri kullanmanın uygun olduğunu söyleyebilirim, bağlamı yüksek seviyede değiştirmek daha kolaydır.


6
Öte yandan, yeni satırdaki destek bir ANSI STANDARDI, K&R değildir. Ancak standartlarla ilgili güzelliği, çok farklı olanları olmasıdır (ayrıca bkz. Uncyclopedia.wikia.com/wiki/AAAAAAAAAA !
Quandary

"daha az satır var" Terabayt Uzay ve birçok Piksel var. Neden daha fazla hat kullanmam gerekiyor?
12431234123412341234123 21:16

1
@ 12431234123412341234123: Sanırım bazı insanlar kod incelemesi için kodu yazdırıyor çünkü. Her biri kesinlikle gerekli olmayan yeni satır, boşa harcanmış kağıt veya ölçeğinde boşa harcanan bir km². Ancak, eğer yazdırmazsanız (kesinlikle bilmiyorum), ANSI K&R'den çok daha iyidir. Ayrıca, baskı almak isteyen herkes muhtemelen otomatik bir kod formatlayıcı kullanmalıdır - bu nedenle kodlama tarzından değil, bir takım mesele olması gerekir.
Quandary

247

Asla 3. yöntemi yapmamalısın.

Parantezlere bakmak, ilk defa birkaç tuşa basışınızı kurtarabilir, ancak bir sonraki kodlayıcı, diğer cümlenize, bloğun eksik parantezlerin çok acı çektiğini fark etmeden bir şeyler ekler.

Diğer insanlar için kodunuzu yazın.


113
Keşke bu küçük bilgeliğin nereden kaynaklandığını bilseydim. O kadar yaklaşık anlamsız olduğu gibi olabildiğince olsun ... okumaya rahatsız etmeyecektir kişiler için kod yazarken Çünkü
Shog9

69
İkinci programcı bir şey eklediğinde kendi ayraçlarını ekleyebilir. Aptal değil ve böyle basit şeyler için diş telini çıkarmayı teşvik eden bir kodlama kongresinde bakmayı bilecek.
Ken Bloom,

25
İsteğe bağlı diş telleri isteğe bağlı değildir. C’de verilen ve soyundan gelenlere çok daha kötü tasarım kararları var. C # beni öfkeye soktuğu
Adam Crossland

28
Ne kadar akıllı olmanız veya kodlama standardının tek satırlı eğri perdelerin etrafına ne kadar gömülü olduğu önemli değildir: Bir problemi veya böceği çözmek istiyorsanız, eğrilerin ihmal edildiğini özleyeceksiniz. Toplam 2 saniyelik bir çalışma için, açık olmak gerçekten çok mu kötü?
Ürdün

11
Tamamladığınız # 3 stilinin bir avantajı var: Ekranınızda bir kerede daha fazla kod elde edersiniz.
Loren Pechtel 21:11

203

Uzun zamandır ben bu kadar eşit değerde olduğunu veya savundu eşit çok yakın altına kadar doğru seçim yaparak olası kazanç uzakta olduğunu savunarak maliyeti bu konuda.

Tutarlı olmak yine de önemlidir . Ben de bozuk para çevirip kod yazmaya başlayalım dedim.

Programcıların daha önce bu şekilde değişime direnç gösterdiğini gördüm. AŞ bunu! Kariyerim boyunca birçok kez yer değiştirdim. C # 'sımda PowerShell'imden farklı stiller bile kullanıyorum.

Birkaç yıl önce, giriş talep etmeye karar veren bir ekip (~ 20 geliştirici) üzerinde çalıştım ve daha sonra bir karar verdim ve daha sonra bunu tüm kod tabanında uygulamıştım. Karar vermek için 1 haftamız var.

Bir sürü inilti ve göz yuvarlanma. "Yolumu seviyorum, çünkü daha iyi" çok ama madde yok.

Sorunun daha ince noktalarını incelerken, birisi bu konuyla aynı çizgi stili ile nasıl başa çıkacağını sordu:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Parametre listesinin nerede bittiği ve gövdenin başladığı yerin hemen belli olmadığını unutmayın. Karşılaştırmak:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Dünyanın dört bir yanındaki insanların bu sorunla nasıl başa çıktıklarına dair bazı okumalar yaptık ve açık desteklemeden sonra boş bir satır ekleme modelini bulduk:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Görsel bir mola yapacaksanız, bunu bir ayraçla da yapabilirsiniz. Sonra görsel aralarınız da tutarlı hale gelir.

Düzenleme : K&R kullanılırken 'ekstra boş satır' çözümüne iki alternatif:

1 / İşlev değişkenlerini işlev gövdesinden farklı bir şekilde girinti

2 / İlk argümanı işlev ismi ile aynı satıra koyun ve yeni argümanlardaki diğer argümanları o argümanla aynı hizaya getirin.

Örnekler:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Düzenle

Tutarlılığın diğer hususlardan daha önemli olduğunu hala savunuyorum, ancak yerleşik bir emsalimiz yoksa, bir sonraki adımda ilerlemenin yolu budur.


33
Bilginize, makul bir insan gibi gelebilirim, ama aslında bir deliyim. Basit, tek satırlı bloklar için ne parantez ne de yeni satırlar kullanacağım, eğer 'if (foo) bar ()' hepsi bir satır olacak. Kodumu bir sorun olmayacak kadar basit hale getirmek için çabalıyorum.
Jay Bazuzi 11:10

38
Bu konuyu tam olarak göndermek için buraya geldim. Açma ayracını aynı satırda tutan tonlarca insan (özellikle sınıf ve yöntemlerin başında) boş bir satır izler çünkü aksi halde, sınıf / yöntem başlığını vücuttan ayırmak zordur. Yine de fazladan bir hat kullanacaksanız, ayracı buraya koyup girintinin sağladığı avantajdan daha kolay görülebilir.
Yevgeniy Brikman

27
Boş satırı görmedim - başka bir satıra girdiklerinde MyFunction () parametrelerinin çift girintisine daha aşina olurum.
Armand

34
Parametreleri bunun gibi birden fazla satıra bölmek çıldırtıcı.
Fosco

10
"Function parametresi" argümanı kırmızı bir ringa balığıdır. Açıkçası, argümanlar çift amaçlı olmalıdır. Aşağıdaki koddan ayırt etmek için hiçbir sorun yok.
David Ongaro

99

Kardinal kurallar:

  1. Projenin mevcut kodlama standardını izleyin.
  2. Kodlama standardı yoksa ve başka birinin sahip olduğu bir kod tabanını düzenliyorsanız, ne kadar sevdiğiniz / ne hoşunuza gittiğiniz önemli değil, mevcut kodun stiliyle tutarlı olun.
  3. Yeşil alanlı bir proje üzerinde çalışıyorsanız - diğer ekip üyeleriyle görüşün ve resmi veya resmi olmayan bir kodlama standardı üzerinde fikir birliğine varın.
  4. Tek geliştirici olarak yeşil alanlı bir proje üzerinde çalışıyorsanız - kendi kararınızı verin ve ardından acımasızca tutarlı olun.

Üzerinde herhangi bir dış kısıtlama olmasa bile, mevcut (yaygın olarak kullanılan) bir kodlama standardı veya stil kılavuzunu aramak en iyisidir (IMO) ve bunu izlemeye çalışın. Kendi tarzınızı yuvarlarsanız, birkaç yıl içinde pişmanlık duymanız için iyi bir şans var.

Son olarak, mevcut stil denetleyicileri ve kod biçimlendiricileri kullanılarak uygulanan / uygulanabilen bir stil, el ile "uygulanması" gerekenden daha iyidir.


10
Bu cevap daha fazla oyu hak ediyor.
AShelly

1
tutarlılık anahtarıdır
MediaVince

70

İlk yöntemin yararı, dikey olarak daha kompakt olması, bu nedenle ekranınıza daha fazla kod sığdırabilmenizin nedeni budur. İkinci yöntemin lehine duyduğum tek argüman açılış ve kapanış parantezlerinin eşleştirilmesini daha kolay hale getirdiği, ancak çoğu IDE'nin bunun için bir klavye kısayolu var ve bu aslında bir açılış braketini bir kapanışla eşleştirmek yerine yanlış bir cümle. braket Bir kapanış braketini aynı girinti seviyesindeki "blok başlangıcı" ifadesiyle eşleştirebilirsiniz (eğer öyleyse), bu yüzden bloğun başlangıcının nerede olduğunu belirlemek kadar kolaydır.

Bir satırın tamamını sadece bir parantez için harcamak için bir neden göremiyorum, önceki / while / if yapı zaten görsel olarak bir bloğun başlangıcını gösterir.

Bununla birlikte, kapanış dirseğinin kendi çizgisinde olması gerektiğine inanıyorum, çünkü bir bloğun sonunu ve çentiklenme yapısını görünür bir şekilde gösterecek bir şeye ihtiyacımız var.


12
Hayır ... Diyorum ki, neden kodun netliğini arttırmayacak bir şey yaparak ekranınıza sığabilecek kod miktarını azalttınız?
EpsilonVector

6
Kodlamaya başladığımda, her ayracı kendi satırında sevdim, şimdi ilk yöntemi tercih ediyorum
NimChimpsky 21.09

57
Tüm programlara bakmanın, kodlanması gereken kodun çok fazla olduğu durumlarda DRAMATICAL olarak düştüğünü gösteren Buhar Çağı'na (Weinberg, "Bilgisayar Programcılığı Psikolojisi") kadar geri dönecek olan çok büyük bir araştırma grubu var. bir kerede görülmeli (yani, bir ekranlı, bir yazıcı sayfası). Bu fenomen, dikey alanı boşuna boşa harcamamak için değerli bir kaynak olarak görmeyi GÜÇLENDİRMEKTEDİR ve dolayısıyla ilk yöntem tercih edilmektedir.
John R. Strohm

10
LOL @ "ENTIRE hattını boşa harcıyor". AMAN TANRIM! Bu değil!! = P
Nick Spreitzer,

6
@Julio Üniversitede yöntem 1'i güçlü bir şekilde tercih ettim ve yöntem 2'yi okuyamazdım. Standart 2'nin olduğu C # kullanan bir şirkette çalışmaya gittikten sonra, ben de aynı şekilde hoşlandım. Şimdi ya okuyabilir ya da kullanabilirim; İkisi de beni rahatsız etmiyor. Bir veya diğerine kuvvetli biçimde ters tepki gösteren insanlar, genellikle aşina olmadıkları bir şeye aşırı tepki gösterir.
KChaloux

46

tercih ederim

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

bitmiş

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

çünkü çizgi you.postAnswer();ilk bakışta okumak ve bulmak çok daha kolaydır. İkinci olarak, üstümdeki çizgiyle ( you.hasAnswer()) birleşerek gözlerimin okumaya daha fazla odaklanması gerekiyor.


7
Bu, programınız ekranınızın yüksekliğini aşıncaya kadar geçerlidir. ;)
weberc2

13
@ weberc2 Programınız ekran yüksekliğini aştığında, iki satırın daha az değişmeyeceğini düşünüyorum.
Mageek

13
10 yıl önce, ekran alanı hakkında hemfikir olurdum. Bugün 1920 * 1200 ekran kullanıyorum. Beynimin bir kerede işleyebildiğinden daha fazla LOT koduna uyuyor. İlk yöntem, okumak zorunda kalmadan farklı kapsam açılmasını / kapanmasını görmemi sağlıyor.
LightStriker

3
Bu yöntemi neden tercih ettiğimi asla bilemedim ama bu tam olarak bunun için.
Declan McKenna

2
@Mageek Gecikmeli, ancak 2 satır değil, her kapsam için 2 satır. O (N), O (1) değil. Aslında bu konuda çok da güçlü hissetmiyorum; uzun parametre listelerini okunabilir kılan bir stil seçmeniz daha önemlidir.
weberc2

38

Ben ilk yöntemi tercih ederim. Parantezler tamamen ayrı bir çizgiye değmez.

Mesele şu ki diş telleri önemli değil. Onlar sadece kodun ne anlama geldiğini, amacını ve uygulanma şeklini anlamada kesinlikle gereksiz olan sözdizimsel çöplerdir . Bunlar sadece düşük ekran alanı nedeniyle operatörlerin görsel gruplandırmasının mümkün olmadığı eski tarz C benzeri dillere bir övgüdür.

Hiç parantez olmadan Tamam olan diller (Python, Haskell, Ruby) vardır. Bu yalnızca diş tellerinin çöp olduğunu ve mümkün olduğunda onlar için bir çizgiyi haketmemesi gerektiğini doğrular:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
Haskell veya Ruby hakkında bir şey bilmiyorum ama Python boşluk için hassas, bu yüzden blokları belirtmek için parantez veya diğer sınırlayıcılar gerektirmiyor. Diş telleri sadece sözdizimsel gürültü değildir; gerçek bir amaca hizmet ederler.
Robert Harvey

14
@Robert, C'de hem boşluk hem diş teli kullanmanız gerekir. Python'da sadece boşluk bırakmalısınız. Hangisi daha iyi?
P

5
@Pavel, C 'de beyaz boşluk yapmak zorunda değilsin.
Ken Bloom,

7
@KenBloom C programları boşluksuz olarak okumak imkansızdır. Yani zaten onları yapmak zorundasın.
P

6
Diş tellerinin iyi bir fikir olup olmadığına bakılmaksızın, onları kullanmayan dillerin sadece varlığı, onlar için veya aleyhinde bir tartışma gibi görünmez. Sadece iyi bir dil veya iyi bir dil tasarımı olmadığını, onlarsız bir dilin mümkün olduğunu öne sürüyor.
Jason,

37

Python'u kullanın ve argümanı tamamen kaldırın.


17
+1SyntaxError: not a chance
Seth

6
Bu sadece projelerin geniş, büyük çoğunluğu için bir seçenek değildir. Ayrıca, gruplama için girinti, sorunların payına sahiptir.
Bryan Oakley

@Bryan, bunun çok pratik olmadığını anladım. Sadece bir yorumdan daha güçlü, orada olması gereken bir bakış açısı olduğunu düşündüm. Ve asla girdiğiniz çentikten kaynaklanan problemleri çözmedim, muhtemelen sekmeleri ve boşlukları karıştırmam.
Mark Ransom

Go kullanın ve argümanı tamamen
kaldırın

4
Sonra boşluk çubuğuna çok fazla bir kez basın ve derleyicinin / tercümanın size gülüşünü izleyin. Bu, çoğu telli dilde olmaz.
Pharap

27

Kıvrımlı kaşlı ayraçların konumu

meta veri

Programcı tarafından IDE'de konfigüre edilebilir. Bu şekilde, yazara bakılmaksızın tüm kodlardaki sinir bozucu parantezler aynı görünüyor.


7
Tamamen katılıyorum. Veri değil sunum.
Petruza,

Mesele şu ki, herkesin kendi kararını vermesine izin verirseniz, işler bittiğinde işler çok çabuk dağılır.
Andy,

1
@Andy: Bu tam olarak nokta, IDE görünüşlerini değiştirecek, ama sadece IDE'de! Gerçek kaynağa dokunulmayacak. Sürüm kontrolü için, küme parantezleri ayarının ortak bir duruma ne olursa olsun çeviren kancalar ekleyebilirsiniz, böylece herkes kodu aynı şekilde kontrol eder.
klaar

@klaar Kullandığım her modern IDE, sekmeleri boşluklara çevirecek ve parantezleri kendi çizgisine veya "açılış" çizgisinin sonuna getirecek; Bu durumlarda kaynağa neden dokunulmadığını düşündüğünüzden emin değilim ve bu da yorumumun nedeni. Genellikle geliştiricilerin ayarlarına bağlı olarak IDE'ler tarafından değiştirilir, yani bir işlem sırasında diş telleri kendi çizgisine taşınırken gürültü yapan birçok değişiklik göreceğim, böylece birisinin yaptığı GERÇEK değişikliği gizlendi.
Andy

@Andy: Tanımladığınız gürültü sorununu gidermek için beyazlık ve diş teli ile ilgili bu tutarsızlıkları tek bir standart uppon taahhüdüne dönüştüren kancaları kullanma imkanı yok mu? Her iki durumda da, uygun bir versiyonlama sistemi , boşluk veya diğer saçma şeyler gibi küçük şeyleri aşmalıdır.
klaar

19

Değişir.

Javascript veya jQuery kodluyorum, ilk formu kullanın:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Ama eğer C # kodluyorsam, ikinci formu kullanıyorum, çünkü bu C # 'da yapmanın kurallı yolu.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Örneğinizin yazılabileceğini unutmayın

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

C # ile.


1
Bir blok ifadesi bir ifade olduğu için, bunun gibi birçok dilde yazılabilir. Ekleme! :-)
Tamara Wijsman

2
“Çerçeve Tasarım Kuralları” na göre “kanonik yol” açılış ayracını aynı satıra (yani ilk biçim) koymaktır. Sadece söylüyorum ...
Uwe Honekamp

3
@Uwe: Belki de. Ancak Microsoft, tüm MSDN C # örnekleri için "hizalı parantez" yaklaşımını benimsedi ve Visual Studio'da pişirildi, bu yüzden ...
Robert Harvey

@Uwe: Bu Cwalina'nın kitabı ve bundan çok daha fazlası olduğu gibi korkunç bir isim. MSDN'deki FDG'nin bu konuda söyleyecek hiçbir şeyi yok. Ayrıca, Çerçeve Tasarım Kuralları neden C # kodlama uygulaması hakkında bir şey söylüyor ?
R. Martinho Fernandes

3
Aslında, Javascript'te aynı satıra kıvırcık ayraçlar koymalısınız. Kıvrımlı kaşlı ayraçlar kendi çizgisinde ise hatalara neden olabilirsiniz. Örneğin, bkz. Encosia.com/…
Joseph Hansen

18

İlkini tercih ediyorum çünkü bu örnekteki hatayı görmek benim için daha zor.

if (value > maximum);
{
    dosomething();
}

bu örnekte olduğundan daha

if (value > maximum); {
    dosomething();
}

; {Sadece ile biten bir çizgiden daha bana daha yanlış görünüyor ;ben bunu fark daha yatkın değilim bu yüzden.


11
İyi bir argüman yaptınız, ama şahsen, bu 5 yıllık programlamda sadece bir kere oldu. Neden işe yaramadığını anlayamadım, SO'da yayınladım ve biri hızlıca bana yarı kolonu gösterdi. Ancak, bu 1 daha az çizgiyi kullanmak her yoğunlaştırıldığında, okumayı zor buluyorum.
JD Isa

6
"; {" Göz kırpıyor, huysuz bir yüze ya da bıyığı olan birine benziyor.
glenatron

+1 Cevapta harika bir örnek: çok ince bir hata, kolayca gözden kaçırılabilir. Bunu gösteren düzende kışkırtmayı da düşündüm.
therobyouknow

10
Elbette herhangi bir makul IDE boş kontrol bildirimini işaretler ve düzgün bir derleyici bir uyarı verir.
Dunk

@Dunk Argümanınızdaki tek kusur (şiddetle katılıyorum), bugünlerde birçok insanın yorumlanmış dilleri kullanması (JavaScript, PHP, vb.) Birçok "programcı" nın bir derleyiciden derleyici bilmeyeceği yönünde. latte.
Craig 18

15

1 hafif bir değişkeni tercih ederim)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Neden?

  • Ben her zaman kendi satırında parantez koyarak okunabilirliği azalttığını düşünüyorum . Ekranıma yalnızca belirli bir miktarda kaynak kod sığdırabilirim. Braket stili 2) çok fazla iç içe döngü ve koşullayıcı ile acı algoritmaları zorlu hale getirir.

  • Ancak, ben istiyorum elseçünkü yeni bir satıra başlamak ifve elsebirbirine ait görsel. Önünde bir dirsek varsa else, neye ait olduğunu tespit etmek çok daha zordur.

  • 3) kendini diskalifiye eder. Destekleri dışarıda bırakıp unutursanız, ne kötü şeyler olabileceğini hepimiz biliyoruz.


1
Bunu çalıştığım yer çevresinde gördüm. İlginç.
Almo,

1
Ayrıca bu stili daha çok seviyorum, çünkü elsegerektiğinde çizginin üzerine yorum yapmama ve / veya if-block ile else-block arasında işlerin daha az tıkalı görünmesini sağlamak için boş bir satır koymamı sağlıyor. Parantez stili # 2, eylemleri koşullardan uzaklaştırma dışında hiçbir şey yapmaz. Bununla birlikte, favorim kesinlikle
python'un

4
Ekrandaki kod satırı sayısını en üst düzeye çıkarmak önemlidir, o zaman tamamen yeni satırları ortadan kaldırın. Bir ekranda çok fazla çizgi çekebileceksiniz. Hiçbir şey okumamayı tercih ederim, okurken düşünmeme ve düşünmeme neden olur. benim daha okunabilir tanımım. Diş telleri ile aklım onları görmezden geliyor. Diş telleri olmadan aklım kontrol bloklarını duraklatmak ve hizalamak zorundadır. Uzun bir duraklama değil, ama hiç olmayan bir duraklama.
Dunk

1
Evet, ve eğer başka birine aitse, AMA {ve} ve as} 'ın ayrı bir satırda olduğunu, {ayrıca ayrı bir satırda olması gerekir. “Ekranımda sadece belirli bir miktar kaynak kodunu sığdırabilirim” Ve bu yüzden 3) “kendini diskalifiye etmek” demek kesinlikle bir seçenek değil. On yıl çalıştıktan sonra 3) Yeni bir kod satırı eklerken parantez eklemeyi unutmadım, şimdiye kadar hiç kimseyi de tanımıyorum. Kodu insanlara ayarlamam gerekiyorsa, düzgün okuyamayanlar nerede bitiyor? Bazı dil özelliklerini kullanmayı bırakmak, çünkü bazı kod okuyucuları bunları anlayamayabilir mi?
Kaiserludi

10

Bir yerde, bazı kitapların yazarlarının kodlarını bu şekilde biçimlendirmek istediklerini okudum:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Ancak yayıncılarının alan kısıtlamaları, bunu kullanmak zorunda kalmaları anlamına geliyordu:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Şimdi bunun doğru olup olmadığını bilmiyorum (daha fazla bulamadığım için), ancak sonuncu stil kitaplarda çok yaygın.

Kişisel düzeyde, parantezleri ayrı bir satırda şöyle tercih ederim:

a) yeni bir kapsamı gösterirler
b) Bir uyuşmazlığı olduğunda fark etmek daha kolaydır (bu IDE'de sizin için hataları vurgulayan bir sorundan daha az olsa da).


... İkinci seçenek aynı zamanda her iki noktanızı da kolaylaştırır (yalnızca girinti / girinti hedefine hizmet eden girintiyle). :)
weberc2

10

Ah, Bir Gerçek Brace Stili .

Her şey Kutsal Yol için düşünüldü - hatta bir peygamber bile (Richard "benim yolum ya da otoyol" Stallman).

Adam bir çok şey için yanlıştı, ama GNU diş teli söz konusu olduğunda dikkat çekiyor.


[Güncelleme] Işığı gördüm ve şimdi Allman'a ibadet ediyorum


9
GNU stilinin noktasını lisp kodunu model dışında görmüyorum. Küçük bir fayda için çok iş gibi görünüyor.
Robert Harvey

GNU tarzını kullanan hiç kimseyi tanımıyorum. Tüm yol boyunca 1TBS.
Jé Queue

Tabii ki, lisp tarzı dışında, tabiki söylemedikçe, blok başına iki girinti seviyesinden daha kötü yapamazsınız.
ergosys

4
Parantez stilleri üzerindeki link için +1. Tarzınız ne olursa olsun, birçok harika insanın size karşı olmadığını gösterir.
Florian F

@RobertHarvey Fazladan bir iş yok, eğer öyleyse, kod yazmak için doğru aracı kullanmazsınız ya da dint'i doğru yapılandırırsınız. Avantaj çok daha okunabilir bir koddur, braketteki her hatayı çok hızlı görürsünüz ve alt blokları yok sayarken yalnızca kodu kolayca okuyabilirsiniz.
12431234123412341234123 21:16

9

İkinci örnek, okunabilirlik konusunda çok büyüğüm. Eğer blokları başka bir yoldan izlemeye dayanamıyorum.


1
Araştırma, bir kod tabanı ekranın yüksekliğini aştığında kompakt kodu okumanın daha kolay olduğunu gösterir.
weberc2

5
@ weberc2, bu araştırma belgesine DOI sağlayabilir misiniz?
Grzegorz Adam Kowalski

9

Basit cevap: hata ayıklamak daha kolay ne?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

Hangi durumda ilk önce konuyu teşhis ettiniz?

Kişisel tercihler için çok fazla umrumda değil (beyaz ve diğerleri de dahil olmak üzere daha birçok stil var) ve kod okuma ve hata ayıklama yeteneğimi engellemediği sürece umurumda değil .

“Atık alan” argümanı olarak, onu satın almıyorum: Programı daha net hale getirmek için yine de mantıksal gruplar arasına boş satırlar ekliyorum.


1
Her ikisi de kısa bir kod bloğundan dolayı hata ayıklamak kolaydır. Girinti tutarlıdır ve gerçek kod bloklarını görselleştirmeyi kolaylaştırır.
Htbaa

@ Htbaa: gerçekten :) Peki neden rahatsız ediyorsun?
Matthieu M.

@MatthieuM. İlk blok bana daha mantıklı geliyor, çünkü işlev imzası, for ifadesi ve if ifadesi arasındaki yeni satırlar (ikinci satırda) ilgisiz olduklarına inanmamı sağladı, ancak açıkça değil. Boş satırlar, ilgisiz kod bitlerini ayırmak içindir; diğer kod satırlarına yakın olan kod, aslında ilişkili oldukları anlamına gelir. Bunların hepsi elbette 'imo', ama amacının ne olduğunu merak ettim. DÜZENLEME: Herhangi bir uygun IDE, herhangi bir ayracın eksik olduğunu fark edecek ve kodunuzu yorumladığınızda size hataların dağılmasını sağlayacaktır.
klaar

7

Kimsenin farkına varamayacaksınız, ancak bu yüzden parantezler şartlı ile aynı çizgiye aittir (çok uzun şartlamalar hariç, ancak bu çok önemli bir durumdur):

C'de, bu geçerli bir yapıdır:

(Doğru) ise;
{
    char c;
    getchar (); // Giriş için bekleyin
}

Hızlı! Bu kod ne yapar? Eğer "girdi isteyen sonsuz döngü" cevabını verdiyseniz yanılıyorsunuz! Girdiye bile gelmiyor. Yakalanır while(true). Sonunda bu noktalı virgül dikkat edin. Bu model aslında olması gerektiği gibi görünmektedir; C değişkenlerinizi bir bloğun başlangıcında bildirmenizi gerektirir, bu yüzden yeni bir tane başlatıldı.

Bir kod satırı bir düşüncedir. Parantez, şartlı veya döngü içeren düşüncenin bir parçasıdır. Bu nedenle, aynı çizgiye aittirler .


Şimdiye kadar gördüğüm K&R tarzı için en iyi argüman budur, geri kalanı günümüzün kod katlama desteğine sahip IDE sistemleri ile gülünçtür. Bu sadece ;blok uçlarını destekleyen C tarzı diller için geçerlidir . Bu nedenle IMHO'nun modası geçmiş olduğu ve Go dilinin ispat ettiği bu blok biten sistemi küçümsüyorum. Bu senaryoda olmasa da, bu sorunu birçok kez gördüm. Genelde ifadeye bir şeyler eklemek ve unutmak istedikleri yerde olur.
Jeremy,

5

İlk yöntemi seviyorum. IMO daha düzenli görünüyor ve sevdiğim daha kompakt.

EDIT: Ah, üçüncüsü. Mümkün olduğunda en iyisini seviyorum, çünkü daha küçük / daha düzenli.


5

Yazabilirsin:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Soruyu cevaplamak için; Kıvrımlı parantezleri kendi hatlarında tercih ederdim; Ve java'yı tutulmada kodlarken, varsayılan ayraç stiliyle savaşmak (veya yapılandırmak) ilgim yoktu, bu yüzden Mısır'la da gittim. Şimdi ikisiyle de iyiyim.


bu şekilde kullanılmalı postAnswer()ve doSomething()üçlü operatör için değer döndürülmelidir, ki bu genellikle böyle değildir: çok iyi bir şekilde geri dönebilirler (değer yok). ve ayrıca (en azından c #) sonucu ?:bazı değişkenlere atanmalıdır
ASH

4

Neredeyse tüm cevaplar, "Ne yaparsanız yapın, bir veya iki ile yapışmak" konusunda bazı farklılıklar söylüyor.

Bu yüzden bir an için düşündüm ve itiraf etmeliydim ki, bu kadar önemli görmedim. Biri dürüstçe aşağıdakilerin takip etmenin zor olduğunu söyleyebilir mi?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Kimseden emin değilim ... ama zihinsel olarak stiller arasında geçiş yaparken kesinlikle sıfır problemim var. Kodun ne yaptığını bulmam biraz zaman aldı, ama bu rastgele C-benzeri sözdizimi yazmamın sonucuydu. :)

Çok alçakgönüllü görüşüme göre, açma parantezleri kod okunabilirliği ile neredeyse tamamen alakasızdır. Bir stilin veya diğerinin fark yarattığı yukarıda sıralanan birkaç köşe durumu vardır, ancak çoğu zaman, boş çizgilerin makul şekilde kullanılması bunu temizler.

FWIW, iş yerindeki kodlama stillerimiz biraz daha yapısal bir form 1 ve değiştirilmiş bir form 3 kullanıyor. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Form 2'yi şiddetle tercih edenler form 1'in bu versiyonunu daha iyi bulacaklarsa, boş satır daha güçlü bir görsel ayrım sağladığından dolayı merak ediyorum.


4
Örneğinizin gösterdiği gibi, girinti okunabilir kod için parantezden çok önemlidir. Aslında, bazı diller girintiyi ifadeleri yerleştirmenin tek yolu yapar!

1
Tamam, dürüstçe, tutarsız bir örneği okunması zor buluyorum. GERÇEKTEN zor değil, tutarlı olmasından daha zor.
Almo,

Almo ile aynı fikirdeyim. Bu "gerçekten zor mu" olayı değil. Zor olmasa bile, "kesinlikle daha zor" bir durum. Peki neden işleri zorlaştırıyor? İnsanların verdikleri "oyuncak" örneklerinde elbette çok az fark var. Tecrübelerime göre, başkalarından kötü kodlar aldığımda ve yöntem 1'i kullandıklarında, sadece mantığı izleyebilmek için devam edip yöntem 2'ye dönüştürmek gerekli olur. Sık sık gerekli olması nedeniyle; hangi yöntemin daha iyi ve anlaşılması daha kolay olduğu sorusunu otomatik olarak cevaplar.
Dunk

@Dunk: Etrafta böyle alakasız ayrıntıları değiştirerek farkedile geliştirilebilecek bir kodu anlayamıyorum.
jkerian

@ jkerian-Görünüşe göre projeden veya şirketten uzun süre önce ayrılan diğerlerinden çok fazla kod almadınız. Yıllarca tecrübeli biri tarafından bu duruma girmeyeceğimi bilemiyorum. Ama sonra tekrar, herkesin çalışma durumu farklı. Ayrıca, "resmi" kod incelemeleri yapmanız gerekiyorsa, biçimlendirme oldukça fark yaratır. Kodu doğal olarak okuyabilmek çok önemlidir. Elbette ayraçları eşleştirip durdurabileceğimi düşünebilirim, ancak bu süreci yavaşlatıyor. Bir yol duraklatma gerektirmez, diğerleri yapar. Bu yüzden başka bir seçeneğin neden önerilebileceğini anlamıyorum.
Dunk

4

Bunun henüz ortaya çıkmamasına şaşırdım. İkinci yaklaşımı tercih ediyorum çünkü bloğu daha kolay seçebilmenizi sağlıyor.

Parantezler aynı sütunda ve kendi satırlarında başlayıp bittiğinde, kenar boşluğundan veya imlecin 0 sütunundaki imleç ile seçim yapabilirsiniz. Bu, genellikle fare seçimiyle veya klavye seçimiyle daha az tuş vuruşuyla daha cömert bir alan anlamına gelir.

Başlangıçta koşullu ile aynı hat üzerinde parantez ile çalıştım, ancak değiştiğimde çalıştığım hızı artırdım. Elbette gece ve gündüz değil, ama koşullanıcılarınızın yanındaki kaşlı ayraçlarla çalışmanızı yavaşlatacak bir şey.


Benim gibi eski zamanlayıcılar, lanetli ayraçlar nerede olursa olsun bloğu seçmek için üç tuş kullanıyor.
ergosys

2

Şahsen ikinci yolu sevdim.

Ancak, göstereceğim yol bence en iyisidir, çünkü bu en büyük iş güvenliğine yol açar! Üniversitemden bir öğrenci, ev ödevlerinde yardım etmemi istedi ve bu onun kodu böyle görünüyordu. Tüm program tek bir blok gibi görünüyordu. İlginç olan, programdaki hataların% 95'inin uyumsuz diş tellerinden kaynaklanmış olmasıdır. Diş telleri eşleştikten sonra diğer% 5 açıktı.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
Kötü, kötü, korkunç örnek demek istiyorum. Sorun diş telleri değil! Bu çılgın girinti!
R. Martinho Fernandes,

@Martinho Fernandes Diş tellerinin ve çentiklerin bir araya geldiğini sanıyordum ...
AndrejaKo

2
ille de gerekli değildir ... yukarıdakilere düzgün bir girinti yapın ve daha sonra rastgele küme ayracı stillerini değiştirin, bunun anlaşılabilir olduğunu göreceksiniz.
jkerian

Aslında, bunu düşünmek, bu soruya kendi cevabımı motive etti.
jkerian

"Yaptığı programdaki hataların% 95'i uyumsuz parantezlerden geldi" - yalnızca yorumlanmış dillerde, derlenmedi.
Mawg

2

Benim kişisel tercihim ilk yöntemdir, muhtemelen PHP'yi ilk öğrendiğim yol budur.

Tek satırlı ififadeler için kullanacağım

if (you.hasAnswer()) you.postAnswer();

you.postAnswer();Çok uzun bir şey değilse , you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);muhtemelen ilk türe geri döneceğim gibi :

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Asla bir satır sonu kullanmayacağım ve bir elseifade varsa, bu yöntemi asla kullanmayacağım .

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

teorik bir olasılıktır, fakat hiç kullanmayacağım bir şey. Bunun dönüşmesi gerekecekti

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

Yapmamalılar; benim için ilk yöntem.

İkinciye baktığımda, kullanılmayan çizgiler (son kapanış ayracı dışında yalnızca üzerinde teller olan) nedeniyle, kodun sürekliliğini kırıyor gibi hissediyor. Hızlı okuyamıyorum çünkü genellikle kod amaçlı bir ayrım veya bunun gibi bir şey anlamına gelen boş satırlara özel olarak dikkat etmem gerekiyor, ancak hiçbir durumda "bu satır bir küme parantezine ait değil" (yalnızca anlamı yineliyor) girinti).

Her neyse, tıpkı bir metin yazarken olduğu gibi ... bir paragrafın başına bir girintinin eklenmesi gereksizdir, eğer ondan önce boş bir satır varsa (paragraf değişikliğinin iki işareti), doğru girintili.

Artı, daha önce de belirtildiği gibi, ekrana daha fazla kod sığdırılmasına izin verir, aksi halde biraz fazla üretkendir.


2

Bu platforma / dile / sözleşmelere bağlıdır

Java’da:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

C # ile

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

C’de:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Java adamlarının kendi stillerini C # kodu ile kullanması ve tam tersi olduğunda nefret ediyorum.


3
C tarzı beni her zaman rahatsız etti. Tutarlı ol!
Christian Mann

1

Söyleyebileceğim tek şey, eğer # 3 yönteminin hayranıysanız, dünyadaki her IDE kod biçimlendiricisine zulmedileceksiniz.


1

İlk yöntemi basitçe kullanıyorum çünkü ekranda daha kompakt ve daha fazla kod bulunuyor. Ben kendimi hiçbir zaman diş tellerini eşleştirmekle ilgili bir sorun yaşamadım ( ifKoşulları eklemeden önce ifadeyle birlikte bunları her zaman yazıyorum ve çoğu ortam eşleşen ayracı atlamanıza izin veriyor).

Eğer varsa vermedi görsel parantez çifti gerekir, o zaman ben ikinci yöntemi tercih ediyorum. Ancak bu bir seferde daha az kod sağlar ve bu da daha fazla kaydırma yapmanızı gerektirir. Ve bu, en azından benim için, okuma kodu üzerinde düzgün şekilde hizalanmış parantezlerden daha büyük bir etkiye sahip. Kaydırmadan nefret ediyorum. Sonra tekrar, eğer tek bir ififadede kaydırmanız gerekirse , büyük olasılıkla çok büyük ve yeniden düzenlemeye ihtiyaç duyuyor.

Fakat; hepsinden en önemlisi tutarlılık. Birini veya diğerini kullanın - asla ikisini de yapmayın!


0

12'de ilk programlama öğrenirken, Microsoft kodlama öğreticileri böyle olduğu için bir sonraki satıra diş tellerini koydum. Ayrıca o zaman 4 boşluklu TABS ile girintili çıkarıyorum.

Birkaç yıl sonra, Java ve JavaScript öğrendim ve aynı satırda daha fazla parantez gördüm, bu yüzden değiştim. Ben de 2 boşluklu SPACES ile girintiye başladım.


5
+1, -1. Herhangi bir editör, sekme uzunluğunu keyfi uzunluğunuza ayarlayabildiğinden, neden sekmeler girintiniz? Aksi halde, kodunuzu lanetlemek için 8'de gerçek girintileri seven birçoğumuza öncülük ediyorsunuz.
Jé Queue

0

Parantezleri hizalı tutan fakat yer israf etmeyen 4. seçenek vardır:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

Tek sorun, çoğu IDE'nin otomatik biçimlendiricisinin bunun üzerine boğulmasıdır.


9
... boğulacak çoğu programcının yaptığı gibi.
Jé Queue

4
Bu korkunç görünüyor. Tepeye bir çizgi eklemek veya üst çizgiyi kaldırmak istiyorsanız, yapmanız gereken ek çabayı düşünün. Çizgiyi silip devam edemezsiniz, küme ayracını yeniden takmayı unutmayın.
Bryan Oakley

lol bu harika! :) ilk tarzdan daha iyi!
nawfal

Görünüşe göre bir adı bile var. Horstman Syyle wikipedia'da bahsedilmiştir . Böyle bir kod temeli ile çalıştım, kullanımı fena değil.
Ocak'ta

-1

Bazı kodlama kısıtlamalarının veya bazı standartların proje yöneticisi tarafından belirlenmiş olduğu bir proje üzerinde çalışmadığınız sürece, bu proje üzerinde çalışan tüm programcıların kodlama sırasında izlemesi gereken sürece bağlıdır.

Şahsen ben 1. yöntemi tercih ederdim.

Ayrıca 3. yöntemde göstermek istediğini anlamadım.

Bu yanlış bir yol değil mi? Örneğin bir durumu düşünün ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

Şimdi, birisi if bloğuna daha fazla ifade eklemek isterse ?

Bu durumda 3. yöntemi kullanırsanız, derleyici sözdizimi hatasını atar.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
Daha da kötüsü, biri gelip şunları yaparsa olacaktır: if (you.hasAnswer ()) you.postAnswer (); başka sen.doSomething (); you.doSomethingElse (); - gözün kolayca
kayabileceği

@FinnNk: Kesinlikle!
Chankey Pathak

2
Birisi başka bir ifade eklemek isterse, destekleri kendi içine koyabilir. Tuzuna değecek bir programcının bunu çözebilmesi gerekir.
Robert Harvey

3. yönteminin yanlış olduğunu söylemek istedim.
Chankey Pathak

3
@Robert Harvey, çok deneyimli kodlayıcıların mevcut kodu değiştirirken kaşlı ayraç eklemeyi özlediklerini gördüm. Bence sorun, girintinin, diş tellerinden daha anlamlı bir ipucu olduğudur (özellikle birden fazla ayraç stili olduğu için), bu nedenle, girişte beklediğiniz gibi görünüyorsa eksik ayracı gözden kaçırmak oldukça kolaydır.
AShelly
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.