it-swarm.dev

Kıvırcık diş telleri kendi çizgilerinde mi görünmeli?

Kıvırcık parantezler kendi çizgilerinde mi olmalı yoksa değil mi? 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çıklayın, deneyimleri paylaşın, gerçeklerle ve referanslarla destekleyin.

284
Tamara Wijsman

Ben bir öğrenciyken aynı çizgiye kıvırcık parantez koyardım, böylece daha az satır olacak ve kod daha az sayfaya yazdırılacaktı. Bir satırdaki tek şey olarak yazdırılan tek bir parantez karakterine bakmak sinir bozucu. (çevre, kağıt israfı)

Ancak büyük uygulamaları kodlarken, sadece parantez içeren bazı satırlara izin vermek, 'gruplama' hissi göz önüne alındığında uygun fiyatlı.

Hangi stili seçerseniz seçin, tutarlı olun, böylece kendi beyninizin ilgili kod parçaları içinde birden fazla stili işlemesi için bir yük haline gelmez. 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.

90
dbza

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

Diş telleri üzerine atlamak size ilk kez birkaç tuş vuruşu kazandırabilir, ancak bir sonraki kodlayıcı, başka bir şeye ekler, bloğun eksik diş telleri eksik olduğunu fark etmeden çok fazla acı çekecektir.

Kodunuzu diğer insanlar için yazın.

251
rhettg

Uzun zamandır onların eşit değere sahip olduklarını ya da çok yakın doğru seçimi yaparak kazancın çok uzak olduğunu savundum , bununla ilgili tartışmanın maliyetinin altında.

Yine de tutarlı olmak önemlidir . Ben de bir bozuk para çevirip kod yazmaya başlayalım dedim.

Programcıların daha önce böyle bir değişime direndiğini gördüm. AŞ bunu! Kariyerim boyunca birçok kez değiştim. Hatta benim C # benim PowerShell daha farklı stilleri kullanın.

Birkaç yıl önce, girdi istemeye karar verdikten sonra bir karar vermeye karar verdiler ve daha sonra bunu tüm kod tabanına uygulayan bir ekip (~ 20 geliştirici) üzerinde çalışıyordum. Karar vermek için 1 haftamız olacaktı.

İnleme ve göz haddeleme Lots. Birçok "yolumu seviyorum, çünkü daha iyi" ama madde yok.

Sorunun daha ince noktalarını incelerken, birisi bu konuyla aynı çizgi üzerinde nasıl başa çıkılacağını sordu:

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

Parametre listesinin nerede bittiği ve gövdenin başladığı hemen belli değildir. Karşılaştırmak:

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

Dünyadaki insanların bu sorunla nasıl başa çıktıklarına dair bazı okumalar yaptık ve açık ayraçtan sonra boş bir çizgi ekleme şeklini bulduk:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Görsel bir mola yapacaksanız, bunu bir parantez ile de yapabilirsiniz. Sonra görsel molalarınız da tutarlı olur.

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

1/İşlev bağımsız değişkenlerini işlev gövdesinden farklı girintileme

2/İlk bağımsız değişkeni işlev adıyla aynı satıra yerleştirin ve yeni satırlardaki diğer bağımsız değişkenleri ilk bağımsız değişkene hizalayın

Örnekler:

1 /

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

2 /

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

/Edit

Hala tutarlılığın diğer hususlardan daha önemli olduğunu savunuyorum, ancak yerleşik bir emsalimiz yoksa , bir sonraki satırda küme ayracı gidilecek yol.

206
Jay Bazuzi

Temel kurallar:

  1. Projenin mevcut kodlama standardını izleyin.
  2. Kodlama standardı yoksa ve bir başkasının sahip olduğu mevcut bir kod tabanını düzenliyorsanız, ne kadar çok beğenirseniz/beğenmeseniz de mevcut kodun stiliyle tutarlı olun.
  3. Bir yeşil alan projesi üzerinde çalışıyorsanız - diğer ekip üyeleriyle görüşün ve resmi veya gayri resmi bir kodlama standardı üzerinde fikir birliğine varın.
  4. Tek geliştirici olarak bir yeşil alan projesi üzerinde çalışıyorsanız - kendi fikrinizi oluşturun ve acımasızca tutarlı olun.

Üzerinde herhangi bir dış kısıtlama olmasanız bile, (IMO) mevcut (yaygın olarak kullanılan) kodlama standardını veya stil kılavuzunu aramak ve bunu denemek en iyisidir. Kendi stilinizi döndürürseniz, birkaç yıl içinde pişman olmaya gelme şansınız yüksektir.

Son olarak, mevcut stil denetleyicileri ve kod formatlayıcıları kullanılarak uygulanan/uygulanabilen bir stil, manuel olarak "uygulanması" gerekenden daha iyidir.

103
Stephen C

İlk yöntemin yararı, daha dikey olarak kompakt olması, böylece ekranınıza daha fazla kod sığabilmeniz ve bu yüzden onu tercih etmem. İkinci yöntem lehine duyduğum tek argüman, açılış ve kapanış parantezlerini eşleştirmeyi kolaylaştırıyor, ancak çoğu IDE'nin bunun için bir klavye kısayolu var ve aslında bir açılış parantezini kapanışla eşleştirmek yerine yanlış bir deyim. köşeli ayraç Bir kapanış köşeli aygırı aynı girinti düzeyinde "blok başlangıcı" ifadesiyle (eğer, başka bir süre için, eğer) eşleştirebilirsiniz, böylece bloğun başlangıcının nerede olduğunu belirlemek de kolaydır.

Önceden/while/if yapısı önceden görsel olarak bir bloğun başlangıcını gösterdiğinde, tüm bir satırı sadece bir parantez için harcamak için hiçbir neden göremiyorum.

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

72
EpsilonVector

Tercih ederim

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

bitmiş

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

çünkü you.postAnswer(); satırının okunması ve ilk bakışta bulunması çok daha kolaydır. İkinci olarak, üstündeki çizgiyle (you.hasAnswer()) karıştırılır ve gözlerimi okumak için daha fazla odaklanmak zorunda kalır.

49
JD Isaacks

İlk yöntemi tercih ederim. Diş telleri tamamen ayrı bir çizgiye değmez.

Mesele şu ki parantez önemli değil. Onlar sadece sözdizimsel çöp, kodun ne için olduğunu, amacını ve nasıl uygulandığını anlamak için kesinlikle gereksizdirler. Bunlar, mevcut düşük ekran alanı nedeniyle operatörlerin görsel gruplandırmasının imkansız olduğu eski stil C benzeri dillere bir övgüdür.

Hiç parantez olmadan Tamam olan diller (Python, Haskell, Ruby) vardır. Bu sadece parantezlerin çöp olduğunu doğrular ve mümkün olduğunda onlar için bir satırı hak etmemesi gerekir:

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

Python kullanın ve bağımsız değişkeni tamamen kaldırın.

37
Mark Ransom

Kıvırcık parantezlerin konumu

meta veri

programlayıcı tarafından IDE) yapılandırılabilir. Bu şekilde, yazar ne olursa olsun, tüm koddaki sinir bozucu parantezler aynı görünür.

28
Jonathan

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

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

bu örnekte olduğundan daha fazla

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

; { Benim için ; İle biten bir satırdan daha yanlış görünüyor bu yüzden bunu fark etme olasılığı daha yüksek.

19
bmb

Değişir.

Javascript veya jQuery kodlama, ilk formu kullanın:

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

Ama eğer C # kodlaması yapıyorsam, ikinci formu kullanıyorum çünkü C # 'da bunu yapmanın kanonik yolu bu.

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 # 'da.

19
Robert Harvey

Hafif bir varyantı tercih ederim 1)

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

Neden?

  • Bence her zaman kendi çizgisine parantez koymak okunabilirliği azaltır. Ekranıma yalnızca belirli miktarda kaynak kodu sığdırabilirim. Köşeli ayraç stili 2) çok sayıda iç içe döngü ve koşullu ağrılı algoritmaları acı verici bir şekilde uzun yapar.

  • Ancak, else'ın yeni bir satıra başlamasını istiyorum çünkü if ve else görsel olarak bir arada. else önünde bir parantez varsa, neyin neye ait olduğunu bulmak çok daha zordur.

  • 3) kendini diskalifiye eder. Köşeli parantezlerden çıkıp unutursanız hepimiz ne gibi kötü şeyler olabileceğini biliyoruz.

15

Bir kitabın yazarlarının kodlarının şu şekilde biçimlendirilmesini istediği bir yerde okudum:

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

Ancak yayıncılarından gelen alan kısıtlamaları, bunu kullanmak zorunda oldukları anlamına geliyordu:

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

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

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

a) yeni bir kapsam gösterir
b) Uyuşmazlığınız olduğunda fark etmek daha kolay (bu, IDE içinde sizin için hataları vurgulayan bir sorun).

10
ChrisF

Ah, Bir Gerçek Ayraç Stili .

Kutsal Bir Yol için her şeye sahiptir - hatta bir peygamber (Richard "benim yolum ya da otoyol" Stallman).

Adam pek çok şey hakkında çok yanılmıştı, ancak GNU, parantez söz konusu olduğunda yerinde.


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

Basit cevap: Hata ayıklamak daha kolay olan nedir?

// 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 önce sorunu teşhis ettiniz?

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

"Atık alanı" argümanına gelince, bunu satın almıyorum: Programı daha net hale getirmek için zaten mantıksal gruplar arasına boş satırlar ekleme eğilimindeyim ...

9
Matthieu M.

İkinci örnek, okunabilirlik konusunda çok büyüküm. Ben başka bir şekilde engeller eğer bakarak duramıyorum = (

9
Bryan Harrington

Kimsenin fark edemeyeceği gibi değil, ancak bu nedenle parantezler koşullu olarak aynı çizgiye aittir (çok uzun şartlar hariç, ancak bu bir Edge vakası) :

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

 while (true); 
 {
 char c; 
 getchar (); // Girilmesini bekleyin 
} 

Hızlı! Bu kod ne işe yarar? "Sonsuz döngü giriş istiyor" cevabını verdiyseniz, yanılıyorsunuz! Girdiye bile ulaşamıyor. while(true) konumunda yakalanır. Sonunda noktalı virgül dikkat edin. Bu model aslında olması gerektiği gibi daha yaygındır; C, bir bloğun başlangıcında değişkenlerinizi bildirmenizi gerektirir, bu yüzden yeni bir tane başlatılmıştır.

Bir kod satırı bir düşüncedir. Diş telleri, koşullu veya döngüyü içeren düşüncenin bir parçasıdır. Bu nedenle, aynı satıra aittirler.

8
Christian Mann

İlk yöntemi seviyorum. Daha temiz IMO gibi görünüyor ve daha kompakt, sevdiğim.

EDIT: Ah, üçte biri. Hatta daha küçük/daha temiz olduğu için mümkün olan en iyi olanı seviyorum.

5
Ullallulloo

Yazabilirsiniz:

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

Soruyu cevaplamak için; Kendi satırlarında kıvırcık kaşlı ayraçları tercih ederdim, ancak tarayıcılarda otomatik noktalı virgül eklemeden kaynaklanan hataları düşünmekten kaçınmak için javascript için Mısır stilini kullanmaya başladım. Ve Java kodlama) Varsayılan küme ayracı stiliyle savaşmak (veya yapılandırmak) için hiçbir ilgim yoktu, bu yüzden ben de Mısır'la gittim. Şimdi ikisinde de iyiyim.

5
FeatureCreep

Buradaki hemen hemen tüm yanıtlar "Ne yaparsanız yapın, bir ya da iki tane ile sopa" konusunda bazı varyasyonlar söylüyor.

Bu yüzden bir an düşündüm ve itiraf etmeliyim ki, bu kadar önemli görmüyorum. Herkes dürüstçe aşağıdakileri takip etmek zor olduğunu söyleyebilir?

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

Başka kimseden emin değilim ... ama zihinsel olarak stiller arasında gidip gelen kesinlikle sıfır sorunum var. Kodun ne yaptığını anlamak birkaç dakikamı aldı, ancak bu sadece rastgele C benzeri sözdizimini yazmamın bir sonucu. :)

Benim düşünceme göre olmayan görüşüme göre, açılış parantezleri kod okunabilirliği ile neredeyse tamamen alakasız. Yukarıda listelenen, bir stil veya diğerinin fark yarattığı birkaç köşe vakası vardır, ancak çoğunlukla boş satırların mantıklı kullanımı bunu temizler.

FWIW, işteki kodlama stillerimiz biraz daha yapılandırılmış bir form 1 ve değiştirilmiş bir form 3 kullanmaktadır. (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 güçlü bir şekilde tercih edenler, form 1'in bu sürümünü daha iyi bulabilirler mi, çünkü boş satır daha güçlü bir görsel ayrım sağlar.

4
jkerian

Bunun henüz ortaya çıkmadığına şaşırdım. İkinci yaklaşımı tercih ediyorum çünkü bloğu daha kolay seçmenize izin veriyor.

Diş telleri aynı sütunda ve kendi satırında başladığında ve bittiğinde, kenar boşluğu veya 0 sütunundaki imleçle seçim yapabilirsiniz. Bu genellikle fare seçimi veya klavye seçimi ile daha az tuş vuruşu ile daha cömert bir alana karşılık gelir.

Başlangıçta şartlı olarak aynı hatta parantez ile çalıştım, ancak geçiş yaptığımda çalıştığım oranı hızlandırdım. Elbette gece ve gündüz değil, ama koşullarınızın yanındaki parantezlerle biraz çalışmanızı yavaşlatan bir şey.

4
Tim O'Neil

Benim kişisel tercihim ilk yöntem için, çünkü muhtemelen ilk PHP öğrenmek budur.

Tek satırlı if ifadeleri için şunu kullanacağım

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

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

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

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

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

teorik bir olasılık, ama hiç kullanacağım bir şey değil. Bu,

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

Şahsen ikinci yolu seviyorum.

Ancak, en iyi iş güvenliğine yol açacağı için en iyi şekilde göstereceğim yöntem benim görüşüme göre! Üniversitemden bir öğrenci ödevim konusunda benden yardım istedi ve kodu böyle görünüyordu. Tüm program tek bir blok gibi görünüyordu. İlginç olan, yaptığı programdaki hataların% 95'inin eşleşmeyen parantezlerden gelmesidir. Diğer% 5 diş telleri eşleştiğinde belirgindi.

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);
2
AndrejaKo

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

İkincisine baktığımda, kullanılmayan çizgiler yüzünden (son kapanış ayracı dışında sadece parantez olanlar), kodun sürekliliğini kırıyor gibi geliyor. Bu kadar hızlı okuyamıyorum çünkü genellikle kod amaçlı bir ayırma veya bunun gibi bir şey anlamına gelen boş satırlara özellikle dikkat etmeliyim, ancak hiçbir durumda "bu satır kıvırcık bir ayraca ait" (sadece anlamı tekrar ediyor) girinti).

Her neyse, tıpkı metin yazarken olduğu gibi ... bir paragrafın başına bir girinti eklemek gereksizdir, eğer ondan önce boş bir satır varsa (paragraf değişikliğinin iki işareti), biz parantezler için satırları boşa harcamanıza gerek yoktur düzgün girintileme.

Ayrıca, daha önce de belirtildiği gibi, ekrana daha fazla kod sığdırmaya izin verir, aksi takdirde biraz ters etki yaratır.

2
Joanis

Platforma/dile/kurallara bağlıdır

Java dilinde:

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

C # dilinde

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

C dilinde:

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

Java çocuklar C # kodunda kendi stillerini kullanmak ve tam tersi) nefret ediyorum.

2
OscarRyz

İlk yöntemi sadece daha kompakt ve ekranda daha fazla kod izin verdiği için kullanıyorum. Ben kendimi hiç parantez kadar eşleştirme ile ilgili bir sorun olmadı (Ben durumu eklemeden önce if ifadesi ile birlikte her zaman onları yazmak ve çoğu ortam eşleşen küme atlamak için izin verir).

Eğer parantezleri görsel olarak eşleştirmeniz gerekiyorsa, ikinci yöntemi tercih ederim. Ancak bu, bir kerede daha az kod kullanılmasına izin verir ve bu da daha fazla kaydırmanızı gerektirir. Ve bu en azından benim için okuma kodu üzerinde düzgün bir şekilde hizalanmış parantezlere sahip olmaktan daha büyük bir etkiye sahip. Kaydırmaktan nefret ediyorum. Daha sonra, tek bir if deyiminde kaydırma yapmanız gerekirse, büyük olasılıkla çok büyüktür ve yeniden düzenleme gerekir.

Fakat; en önemlisi tutarlılıktır. Birini veya diğerini kullanın - asla ikisini birden!

1
gablin

Söyleyebileceğim tek şey, eğer 3. yöntemin bir hayranıysanız, dünyadaki her IDE kod biçimlendirici tarafından zulüm göreceksiniz).

1
Phil Cohen

Parantezleri hizalı tutan ancak alan israf etmeyen 4. bir seçenek var:

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

Tek sorun, çoğu IDE'nin otomatik formatlayıcılarının bunu boğmasıdır.

0
AShelly

İlk 12'de programlama öğrenirken, parantezleri bir sonraki satıra koydum çünkü Microsoft kodlama öğreticileri böyle. Ben de o zaman 4 boşluklu TABS ile girintili.

Birkaç yıl sonra, Java ve JavaScript öğrendim ve aynı satırda daha fazla parantez gördüm, bu yüzden değiştim. Ayrıca 2 boşluklu boşluklara girintili olmaya başladım.

0
Ming-Tang