C # geliştiricileri neden yeni açılım parantezlerini kullanıyor? [kapalı]


44

Son birkaç yılın çoğunu esas olarak C # ve SQL ile çalışarak geçirdim. Bu süre zarfında çalıştığım her programcı, bir fonksiyon ya da kontrol akış ifadesinin açılış ayracını yeni bir satıra yerleştirme alışkanlığıydı. Yani ...

public void MyFunction(string myArgument)
{
     //do stuff
}

if(myBoolean == true)
{
    //do something
}
else
{
    //do something else
}

Özellikle if / else ifadelerinde, bu alanın ne kadar boşa harcandığı beni her zaman etkiledi. Ve biliyorum ki C # 'nın sonraki sürümlerinde alternatifler var:

if(myBoolean == true)
    //do something on one line of code

Ama neredeyse hiç kimse onları kullandı. Herkes yeni moda kaşlı ayracı işini yaptı.

Sonra uzun bir aradan sonra JavaScript'i tekrar kullandım. Benim hafızamda, JavaScript geliştiricileri aynı kaşlı ayraç-yeni satırını yaparlardı ancak tüm yeni kütüphaneler ve diğer şeylerle, geliştiricilerin çoğu açılıştan sonraki aylığı açıkladı:

function MyJavaScriptFunction() {
    //do something
}

Bunun anlamını görebilirsiniz, çünkü kapama ve fonksiyon işaretleyicileri JavaScript'te popüler hale geldiğinden, çok fazla alan tasarrufu sağlar ve işleri daha okunaklı hale getirir. Bu yüzden neden C # 'da bitmiş bir şey olarak görünmediğini merak ettim. Aslında, yukarıdaki yapıyı Visual Studio 2013'te denerseniz, açılış desteğini yeni bir satıra yerleştirerek aslında sizin için yeniden düzenler!

Şimdi, sadece Kod İnceleme SE bu soruyu gördü: https://codereview.stackexchange.com/questions/48035/questions-responses-let-me-tell-you-about-you hangi Java öğrendim bir Çok fazla aşina olmadığım bir dil, deklarasyondan hemen sonra kaşlı ayraçlarınızı modern JavaScript tarzında açmak için titizlik sayılır.

Her zaman C # 'nın Java'dan sonra modellendiğini ve aynı kodlama standartlarının çoğunda bulunduğunu anladım. Ancak bu durumda, öyle görünmüyor. Öyleyse, iyi bir sebep olması gerektiğini düşünüyorum: Bunun nedeni nedir? C # geliştiricileri (ve Visual Studio) neden yeni bir satıra kıvrımlı parantez açılmasını zorlar?


30
Kongre sadece budur.
Oded

19
Visual Studio hiçbir şeyi zorlamaz, kod stili yapılandırılabilir. Bir şeyin varsayılan olması gerekir. Hangi varsayılan "daha iyi", en yüksek derecenin bisikletidir.
Phoshi

23
Çizginin sonundaki ayraç eski K&R C standardıdır. Kernighan ve Ritchie, bilgisayar yalnızca 25 satır içerdiğinde (başlık ve durum satırları eklerseniz 23) C dilini icat etti. Artık gerçek bu değil, değil mi? Önemli olan proje boyunca tutarlılıktır. Orada olan kendi satırına ayracı (aslında, koduyla aynı seviyeye girintili) gösteren kod geliştirir bilimsel çalışmalarda da anlama insanlar estetik düşünüyorum ne düşündüğünü rağmen.
Craig

10
C #, şartlı bir durumdan sonra tek bir kod satırının değerlendirilmesini her zaman destekledi. Aslında, şimdi bile yaptığı tek şey bu. Bir dallanma ifadesinden sonra kodu parantez içine koymak, bu talimatı bir goto yapar (derleyici, jmp komutlarını kullanarak kapsam oluşturur). C ++, Java, C # ve JavaScript, çoğu zaman aynı temel ayrıştırma kurallarına sahip olan C'ye dayanarak az ya da çoktur. Yani bu anlamda, C # "Java tabanlı" değil.
Craig

10
Bir not olarak, if(myBoolean == true)bana pek mantıklı gelmiyor. Biz varken, değilken if ((myBoolean == true) == true)?? Sadece if (myBoolean)ve bu kadar yeter. Üzgünüm, benim evcil hayvan peeve.
Konrad Morawski

Yanıtlar:


67

Çizginin sonundaki ayraç, eski K & R C standardı, Brian Kernighan ve Dennis Ritchie'nin UNIX işletim sistemini ve C programlama dilini birlikte icat ettikten sonra 1978'de yayınladıkları C Programlama Dili kitabı . çoğunlukla Ritchie tarafından tasarlandı).

Eskiden "gerçek bir ayraç tarzı" hakkında alev savaşları vardı.

Ritchie C dilini icat etti ve Kernighan ilk dersi yazdı, bilgisayar ekranları sadece birkaç satır metin gösterdiğinde. Aslında, UNICS (daha sonra UNIX) geliştirme, bir kullanıcı arayüzü için daktilo, yazıcı ve kağıt bant kullanan bir DEC PDP-7 ile başladı. UNIX ve C PDP-11'de, 24 satırlık metin terminalleri ile tamamlandı. Bu yüzden dikey alan gerçekten çok önemliydi. Bugün hepimizin biraz daha iyi ekranları ve daha yüksek çözünürlüklü yazıcıları var, değil mi? Yani, seni tanımıyorum ama şu anda önümde üç (3) 24 "1080p ekran var. :-)

Ayrıca, bu küçük kitabın pek çoğu C Programlama Dili , destekleri kendi satırlarının yerine satırların sonuna yerleştirmenin, baskıda kayda değer miktarda para biriktirdiği iddia edilen kod örnekleridir.

Gerçekten önemli olan, bir proje boyunca veya en azından verilen bir kaynak kod dosyasındaki tutarlılıktır .

Orada olan kendi satırına ayracı (aslında, koduyla aynı seviyeye girintili) gösteren insanlar estetik düşünüyorum ne düşündüğünü rağmen kod anlama geliştirir bilimsel çalışmalar da. Hangi kodun hangi bağlamda çalıştığını okuyucuya görsel ve içgüdüsel olarak çok açık bir şekilde gösterir.

if( true )
    {
    // do some stuff
    }

C #, bir dallanma ifadesinden sonra tek bir komutu değerlendirmeyi her zaman desteklemiştir. Aslında, şimdi bile yaptığı tek şey bu. Bir dallanma ifadesinden sonra kodu parantez içine koymak, yalnızca bir komutun gitmesini sağlar (derleyici, jmp komutlarını kullanarak kapsam oluşturur). C ++, Java, C # ve JavaScript, çoğu zaman aynı temel ayrıştırma kurallarına sahip olan C'ye dayanarak az ya da çoktur. Yani bu anlamda, C # "Java tabanlı" değil.

Özetle, bu ise bir dini / alev savaş sorunu biraz. Ama olan oldukça açık bloklar halinde kod düzenlenmesi iyileştirdiğini yapım çalışmaları insan anlama. Derleyici daha az umursayamazdı. Fakat bu, aynı zamanda, bir dalın üzerine ayraç olmadan asla bir kod satırı koymamamın nedeni ile de ilgilidir - benim veya başka bir programcının daha sonra orada başka bir kod satırını tokatlayabilmesi ve geçmeyeceği gerçeğinden kayması çok kolaydır. satırla aynı bağlamda hemen önce veya sonra yürütülür.

EDIT : Sadece gerçek dünyadaki çok ciddi sonuçları olan bu konunun mükemmel bir örneği için Apple goto failböceklerine bakın.

if( true )
    doSomething();

olur ...

if( true )
    doSomething();
    doSomethingElse();

Bu durumda, doSomethingElse()testin sonucuna bakılmaksızın her zaman uygulanır, ancak ifade ile aynı seviyeye doSomething()geldiğinden, kaçırılması kolaydır. Bu gerçekten tartışılabilir değil; bu kadar geriye çalışır. Bu, bakım sırasında kaynak koduna girilen büyük bir hata kaynağıdır.

Yine de, JavaScript kapatma sözdiziminin estetik olarak kendi satırlarındaki parantezlerle biraz saçma göründüğünü kabul ediyorum. :-)


13
Koşullu bloklarla ilgili kısım biraz yanıltıcıdır. C koşulunda her zaman tek bir deyim vardır, ancak bir blok (aka birleşik deyim) bir tür ifadedir . C #, bu emsali izler. Her neyse, şartlı değerlendirme , tüm ortak talimat setlerinin doğrusal doğası nedeniyle her zaman bir tür şartlı geçiş veya dallanma talimatı anlamına gelir. Bloksuz bir koşul, nitel olarak bloklu bir koşuldan farklı değildir (kapsam belirleme hariç).
amon,

3
@Craig, hatırlayın, bu, Bell Labs'ın bir şey için pratik olması gerekmeyen “ilginç şeyler yapmak” için kiralandığı zamanlar, Bell Labs'taydı. Akıllı insanları bir binaya koyun, ilginç araştırmalar yapmalarını, "ilginç" olmadıklarından uzaklaştırmalarını söyleyin ve komik bir şey, İLGİNÇLER (transistörler ve Unix gibi) ortaya çıkma eğilimindedir. DARPA, başlangıçta aynı odaklanmaya sahipti ve temel araştırma adına bir sürü iyi çalışmayı finanse ettiler.
John R. Strohm

3
@Craig: Eski Pascal / Delphi günlerinde, genellikle Pascal'ın kullandığı beginve endparantezlerin yerinde kalması gibi tek satırlı bloklar için bu durumdan kaçınıyordum ; bu tür hataları özlemeyi zorlaştırıyordu ve ayrıca noktalı virgül yerleştirme konusunda daha katıydı - ama 4 gün geçen yıl nedeniyle ayracı yerleştirme birinin eksikliği olma sona erdi gömülü C bir sorun ayıklarken ..... ben kontrol tablolarında zorunlu parantez kılan bir derleyici seçeneği olması gerektiğini düşünüyorum!
Mark K Cowan

12
Lütfen "... ayraçın kendi çizgisinde olduğunu gösteren bilimsel çalışmalar ..." için referanslar verin. En az iki referans (Aksi olurdu olmadan çalışma değil, çalışmalar ), sadece havaya rastgele ateş etmiyor.
ErikE,

2
@Craig, bahsettiğiniz araştırma çalışmalarını nasıl bulacağınıza dair bazı ipuçları verebilir misiniz?
Grzegorz Adam Kowalski

30

C # geliştiricisinin bunu yapmasının nedeni, Visual Studio otomatik biçimlendiricinin varsayılan ayarı olmasıdır. Bu ayar değiştirilebilse de çoğu insan değişmez ve bu nedenle bir takımdaki tüm geliştiricilerin çoğunluğu ile gitmek zorundadır.

Neden bu Visual Studio'da varsayılan olarak, bilmiyorum.


15
Visual Studio'da varsayılandır çünkü Microsoft’un genel olarak kabul görmüş kodlama tarzıydı, geri dönüyordu ve aslında Microsoft’un en azından bazı takımlarında bu tarz sadece kendi satırlarındaki parantezler değil, kendi satırlarındaki parantezlerdi. ve girintili. Bu yüzden Visual Studio'da da bir seçenek. (Ben şahsen tercih ederim).
Craig

20
@Craig: Ewwwwwwwww
Monica ile

5
@BreferenceBean Hmm. Şahsen K & R stilini beğenmedim, çünkü parantezler satırların sonundaki gürültüde kayboluyor ve metin bana biraz dağınık görünüyor, bu sadece estetik bir tercih değil, aynı zamanda okunabilirlik / anlama üzerinde de gerçek bir etkiye sahip. Dikey boşlukları severim. Düşey boşluğun kıymetli olduğu eski günlerde 24 inç yazı içeren 12 inçlik monitörlerde biraz farklıydı.
Craig

10
@Craig: Parantez girintisi için bahane değil: P
Monica ile

2
@Craig Microsoft çalışanlarını mutsuz etmek için mi?
Mateen Ulhaq

18

Buradaki cevabın hipotezinde bulunduğum gibi - https://softwareengineering.stackexchange.com/a/159081/29029 - Allman'ın destekleriyle devam etme kararının Hejlsberg'in Delphi'yi tasarlamadan önce Delphi'yi yarattığı düşünülerek Pascal mirasının bir işareti olabileceğini düşünüyorum. . Yöntem adları için Pascal durumuyla aynı.

Şahsen "Roma'da Romalılar gibi yapın" atasözünü takip etmeye inanıyorum. Allman'ı C # dilinde, K & R ise Java'da kullanıyorum. O kadar alışkınım ki, sözleşmeyi herhangi bir şekilde değiştirmek bana zarar veriyor.

Bazı kongre çeşitliliğinin, şu anda hangi dili kodladıklarını hatırlamaya yardımcı olduğu ve çeşitli alışkanlıkları ayırt etmeyi kolaylaştırdığı için "çok dilli" bir geliştirici için gerçekten faydalı olduğuna inanıyorum. Konuşmak için zihinsel bir kas hafızası eşdeğeri.


7
Aslında, "çok dilli geliştirici" satırı için +1. Cilaları kendi hatlarında ciddiye almayı ve girintiyi tercih ediyorum. Ancak, örneğin, ASP.NET (MVC) projeleri üzerinde çalışırken, "doğru" stille C # ve "JavaScript" stille JavaScript'i sevdiğimi anlıyorum. Bu biraz yanak dili, ama dürüst olmak gerekirse, JavaScript'in kapanma sözdiziminin satır sonundaki destekle daha çekici olması. Bu yüzden başkaları kadar estetikte köleyim ...
Craig

Anders Hejlsberg, Borland'dan Microsoft'ta seçkin bir yazılım mühendisi olarak ayrılmadan önce , yöntem adları için PascalCase, Microsoft'ta uzun süredir bir standarttır .
Craig

2
İlginç bir şekilde, Allman'ı bütün ayraçlı diller için kullanıyorum. Ancak, ön işleme işlemlerinin girintili küme ayraçlı bloklara dönüştürülmesinin Java'da nasıl göründüğü ile daha fazla ilgilenmeye başladım. Örüntü tanıma fikrimi etrafına sardıktan sonra "java" kodu son derece temiz görünüyor olabilir. Python'un gerçekten de haklı olabileceğini düşünüyorum: Bir dilde parantez için gerçekten harika bir sebep yok .
tgm1024

Program akışını kontrol etmek için boşluk kullanmak deliliktir. Python bugünlerde popüler, ancak Python'un bu yönü ilk ortaya çıktığından beri biraz çılgınca.
Craig

@Craig Python fan burada, javascript ile bir şeyler yapmaya çalışıyor. Diğer cevabınıza ve goto failprogram akışını kontrol etmek için girintiyi kullanmakla ilgili düzenlemenize bakmak, insanların doğal olarak yapmak istediği şeydir. Yanlış girintili ise düz çalışmıyor. Bu parantezlerin ne anlama geldiğini çözmek zorunda kalmak, girintiyi gerçekten yansıtıp yansıtmadıklarını görmek, programı anlamak için yukarıda ve ek olarak yapılır. Girinti diş tellerine fazlalık değildir, peki diş telleri yararlı olduğunda programcılar neden kullanıyor? Derin yuvalama herhangi bir dilde anlaşılmazdır. Jus 'diyor.
Neil_UK

14

Java ile ilişkilendirdiğiniz kural, K&R tarzı veya "Tek gerçek ayraç tarzı" dır ve orijinal olarak C'den gelir. Bu sayfa , saygıdeğer Jargon Dosyasının girintili stilinin , ayrımın ne kadar eski olduğunu gösterir.

Her zaman Allman stilinin ve türevlerinin yazarların kod hakkında nasıl düşündüklerinin bir yansıması olduğunu düşündüm, blok sınırlayıcıları bazı dillerin kod bloklarının etrafında "başladığını" ve "sonunu" nasıl kullandığına benzer bir anahtar kelime seviyesine yükselttiğini düşündüm.


Bugünlerde OTBS'nin (gerçek bir ayraç stili) aynı zamanda tek bir kod satırı için bile kontrol ifadelerinden sonra hiçbir ayraçtan çıkmadığı anlamına geldiği izlenimi altındayım. Apple goto başarısızlık hata bakın.
Craig
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.