Kapsamı belirtmek için whitespace vs. {} 'i kullanan bir dilin artıları ve eksileri nelerdir? [kapalı]


17

Kapsamı belirtmek için beyaz boşluk veya parantez gibi jeton kullanmanın daha iyi olup olmadığı konusunda bir çatışma var gibi görünüyor. Pek çok övgü python'un tutarsız girinti sorununa çözümünü gördüm, ancak çoğu katılmıyorum:

Belirteç olarak boşluk olan herhangi bir dilin ölmesi gerekir.

daha sonra aynı cevapta yayınlanmıştır:

Gerçekte denemedene kadar token karşıt boşluk olarak sortof oldum. Muhtemelen kişisel beyaz boşluk düzenimin python-land'daki herkesin kullandığı şeyle hemen hemen eşleşmesine yardımcı oldu. Belki biraz minimalist olduğum için, ama yine de girintili olacaksanız, neden {} s ile uğraşasınız?

Her bir taraf için bazı net argümanlar görebilirim:

boşluk kullanarak:

  • koddaki tutarsız girintiyi azaltmaya yardımcı olur
  • aynı amaca hizmet etmek için görünür simgeleri boşlukla değiştirerek ekranı temizler

jeton kullanarak:

  • kodu farklı seviyelere kesmek ve yapıştırmak çok daha kolay (girintiyi düzeltmek zorunda değilsiniz)
  • Daha tutarlı. Bazı metin editörleri boşlukları farklı görüntüler.
  • şu anda daha popüler.

Kaçırdığım herhangi bir puan var mı? Hangisini tercih edersin? Uzun bir süre biriyle veya diğeriyle çalıştıktan sonra bilgelik sözleri var mı?


PS. Diller her kontrol yapısı için aynı jetonu kullanmadığında nefret ediyorum. VB End Ifve End Whileifadeleri ile gerçekten can sıkıcı , diğer birçok dil sadece her şey için {} 's kullanır. Ama belki bu farklı bir sorunun konusu ...


2
"Kesmek ve yapıştırmak çok daha kolay" demezdim. Sadece biraz daha kolay.
Kugel

1
Kod bloklarını küçük ve düzenli tuttuğunuz sürece, jetonlar gerçekten önemli değil ... bu arada, 'kutsal savaş' etiketini seviyorum, lol
Scott

"Bazı metin editörleri boşlukları farklı görüntüler.": ?? "şu anda daha popüler.": Popülerlik genellikle bir fikrin kalitesi ile ilgili değildir.
Giorgio

Beyaz sözdizimini seviyorum ve CoffeeScript ve Haskell'de kodlamayı çok sevdim (evet zor olduğunu biliyorum). JavaScript ve C'de bir grup kodladım ve geri dönemiyorum}. Bununla birlikte, kutu div'leriyle değiştirildiklerinde Lisp s-ifadeleri en iyisidir
:)

Ben sadece beyaz boşluk güvenmek zorunda kalırsanız hataları tespit zorlaştırıyor düşünüyorum. Örneğin: stackoverflow.com/questions/21205836/… OP kodu ile cevap arasındaki tek fark fazladan boşluktur. For} döngüsünün içinde hangi kodun hangisinin olduğunu açıklamak için bir} sahip olmak çok daha nettir.
AncientElevator9

Yanıtlar:


15

Bence bir çok programcı (ben dahil) her kararı "mantıklı" hale getirme eğiliminde. Bu iyi, ama her sorunun mantıklı bir cevabı yok. Örneğin, şeflerin elmalı turta ve kirazlı turtanın artılarını ve eksilerini soran chefoverflow (böyle bir şey varsa) hakkında sorular yayınladığından şüpheliyim. Hangisini daha çok sevdiğiniz bir soru.

Bunu akılda tutarak, bence en basit cevap "Bazıları parantez sever, bazıları beyaz boşluk sever" demek ve bunu bırakmaktır.



Ayrıca, bazıları için profesyonel olan bir şey başkaları için bir aleyhte olabilir.
Larry Coleman

Mükemmel nokta. Şahsen birlikte çalıştıklarını düşünüyorum ve sope açık olduğu sürece şikayet etmeyeceğim (çok).
Michael K

8
Ben senin benzetmene katılmıyorum. Boşluğa bağlı sözdiziminin, programcı verimliliğini, onu seven programcılarda bile engellediğine inanmak için oldukça nesnel nedenler var. İnsanların siyanürün tadını sevmediğini söylemek gibi - herkes zehirli olduğunu söylediklerinde sadece “mantıklı”. Hayýr. Ne kadar sevdiđin önemli deđil, hala seni öldürecek.
Timwi

4
PS Aslında aradığınız kelime rasyonalize etmek . Ayrıca, herkesin sadece programcıları değil, rasyonelleşme eğilimi vardır.
Timwi

11

Tam bir fanboy gibi görünme riski altında, bence boşlukun “koddaki tutarsız girintiyi azaltmaya yardımcı olduğunu” iddia eden herkes Visual Studio'yu hiç kullanmadı. Tek bir komutla (varsayılan kısayolun Ctrl + K, D olduğunu düşünüyorum), tüm girinti anında tutarlıdır¹. Ayrıca, kodu yapıştırırken girinti, hiçbir şey yapmadan anında düzeltilir ve yeni kod yazarken veya bir ifveya başka bir bloğa bir şey sarılırken de aynı durum geçerlidir (yeniden biçimlendirme }yazılırken gerçekleşir). Ayrıca, tamamlanmış bir deyimden sonra Enter tuşuna basmak, önceki deyim,ifya da benzeri bir ifadeyle, yanlışlıkla bir ifadenin hala bir zamanın altında olduğunu düşünmeyi çok zorlaştırır if.

Ben marka çalışıyorum noktasıdır değil Visual Studio harika olduğunu. Yapmaya çalıştığım nokta, IDE'nin girintiyi düzeltmeyi (ve diğer biçimlendirme sorunlarını) otomatikleştirebilmesidir, ancak yalnızca programın anlamı biçimlendirmesine bağlı değilse. Bu, programcıya gerçek programlama görevine odaklanmak için daha büyük bir fırsat verir. Python's gibi bir sözdizimi ters etki yaratır: Python kodunun girintisini "düzeltebilecek" bir IDE yazmak mümkün değildir, çünkü girintinin kendisi semantiğin bazılarını belirtir.


¹ (VS reformasyon, birden fazla satıra yani dizi sabitleri reddeden bir özel durum olduğunu biliyoruz, ama bu değil).


8
Python girintisinin düzeltilmesi gerekmez, çünkü kırılmaz (birisi fark etmeden!). Purify (bellek sızıntılarını algılamaya yardımcı olan program) yazmak da imkansızdır, C ++ bellek yönetiminin daha üstün olduğu anlamına gelmez.
dbkk

2
@Dean: Neden bu kadar çok insan her şey için Resharper'a ihtiyaç duyduklarını düşünüyor? Açıkladığınız şey zaten Resharper olmadan Visual Studio'da.
Timwi

2
@dbkk: Girintiniz, ifherhangi bir yere satır ekler eklemez kesilir . Ardından girintiyi manuel olarak düzeltmeye devam etmeniz gerekir.
Timwi

2
muhtemelen girintinin tembel, tutarsız vb. olduğu bir ekip üzerinde çalışmadınız ve kod farklarını imkansız kıldığı için düzeltilmesi önerilmez.
Kevin

2
@Kevin: Doğru, yapmadım ve açıkçası istemem. Hepsini tek seferde düzeltmekte ısrar ediyorum, bu da sadece önemsiz boşluğu etkileyen ve gelecekteki tüm farkları düzelten sadece bir okunamayan fark yaratıyor. Başka her şey verimsiz ve projeye zarar verebilir.
Timwi

3

Şahsen ben kodun başka bir kapsamda olduğunu fark etmek için kendi satırında bir belirteç alarak tanıtılan boş satır gerekir bulmak.

Python insanlar gittikten nefret ediyorum:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

token topraklarında insanlar kopyalayıp yapıştırıp nefesi temizlemediğinde nefret ediyorum ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

veya jeton için ayrı bir satır kullanmayın .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

Üçünü de okuyabiliyorum, ama beklediğim gibi değiller ve onları ayrıştırmak için çaba harcamalıyım ve Joel'in söylediği gibi , işler beklediğiniz gibi çalışmadığında sizi hayal kırıklığına uğratıyor.


3

Pro: Bildiğim kadarıyla Python dünyasında girinti / kıvırcık ayraç yerleştirme kutsal savaşları yok. Bu kararı geliştiriciler adına vermek muhtemelen biraz acı kurtardı.

Con: Anonim işlevler bir satırla sınırlıdır. Kulağa hoş geliyor, ancak sık sık kendimi lambdaScheme'de çok satırlı yazı yazarken buluyorum (çoğunlukla tek bir yere mapveya applytam olarak bir yere beslemek için , ayrı ayrı beyan etmek mantıklı olmaz).



Çok satırlı ifadeler Python'da desteklenir - satırın sonuna sadece \ koy.
dbkk

8
Adil olmak gerekirse, çok satırlı lambdaların eksikliği genel olarak boşluk değil Python'un bir sınırlamasıdır. Boşlukla ayrılmış dilde, bir lambda tanıtırsanız ve girintili bir blok takip ederse, blok lambda gövdesi olarak kullanılır.
Kendine not -

@Not - Tamam, evet, adil. Python, deneyimlediğim tek boşlukla ayrılmış dil. @dbkk böylece söylüyorsun lambda n: a = n \\na.sort() \\na[0:3] olmaz sözdizimi hatası döndürür? `` Hile, tek satırlı lambdalarınızı birden çok satıra yaymanıza olanak tanır, ancak yine de birden fazla gerçek satır almazsınız .
Inaimathi

Haskell, CoffeeScript boşluk kullanır ancak tek satır lambda sınırlaması yoktur.
aoeu256

3

artıklık ekler. Fazlalık çok kötü, çok azı kötü. Ve elle girmek kötü, esp. eğer kullanmak zor.

Kötü / IDE olmayan zamanlarda, boşluk stili biraz daha iyi olabilir. Ancak güçlü IDE ile diş telleri daha iyidir.


1
Artıklık hakkında iyi bir noktaya değindin galiba. Bir süredir derleyiciler için ayrıştırıcı kurtarma üzerinde mulling yapıyorum (Clang'ın kod için Fix-Its yayınlamak için çok ilginç girişimlerini izleyerek) ve gerçekten burada yardımcı olan artıklık olduğu. Bu nedenle, hiçbir yedeklemenin mükemmel bir dünyada harika olmasına rağmen, gerçek dünya programlaması için aslında zararlı olmadığını düşünüyorum. Normalde gereksiz bilgi kaynakları aynı fikirde değilse, yazım hatası / hatası yapılmış olabilir; fazlalık olmadan, bu potansiyel hata tespit edilmez! Olduğu söyleniyor, ben diş teli tercih etmiyorum;)
Matthieu M.

"Gürültü" Erik Meijer'in Haskell videolarında kullandığı kelimeydi.
user16764 21:12

Bir bloğu silerseniz ve tersini yaparken} veya {ile yanlışlıkla silmeyi unutursanız ne olur? Artıklık, KURU IMO'ya aykırıdır.
aoeu256

2

Beyaz bir dille bulduğum sorun, çok sayfalı koşullu ifadelerdi. İkinci sayfanın ortasına bir çizgi eklemek ve tüm karmaşanın ortasında bir boşluk almak, kodunuzun mantığını büyük ölçüde değiştirebilir. Ve birinin kodu "doğru" olsa bile, onu okumaya çalışmak korkunç bir tahmin oyunu yapar. Bu "başka" hangi "if" içindir? Görünmez boş karakterleri sayabildiğimden çok daha kolay parantez sayabilirim. Ve bu sitedeki gönderme makineleri onları tek bir alana parçalamaya devam ediyor.

IMHO "{{{{{" is more reliable than "     ".

9
Çok sayfalı koşullu ifadeler kullanıyorsanız başka sorunlarınız da vardır. Sadece yapma. Aslında, kıvırcık parantezlerde bile, kod okunamayan bir karmaşa haline gelir. Bu aslında boşluk girintisinin bir başka yararıdır: böyle korkunç bir kod yazmanızı önler.
Konrad Rudolph

1
Cidden, şartlı birden fazla sayfa uzunluğunda mı?
Winston Ewert

2

Ben gerçekten sanmıyorum karşı .
Pythoneerler genellikle parantez programcılarını girintiyi kolayca ihlal edecekleri için eleştiriyorlar çünkü yapabilirler.
Aslında Python ve onun girinti kapsamını bilmeden önce her zaman% 100 tutarlı girinti kullandım.

Gerçek şu ki, parantez dilleri derleyicide doğru girinti uygulayabilir ve her iki dünyanın da en iyisini elde ederiz. Görmek? hiç karşı değil .

Pythoneers, girinti sözdiziminin bir parçası olduğunda parantezlerin işe yaramaz olduğunu savunurlar, ancak değildir, parantezler okunabilirliği artırır. Python'u programlamayı denedim ve bu benim için çok ilginç bir dil, ama if-elif2 veya 3'ten fazla girinti seviyesinden zincirlere sahip olmayı denediniz mi? artık çok düzgün görünmüyorlar.

Not: Diş telleri yazdım ama daha genel bir şekilde, sınırlayıcı belirteçleri kastediyorum. Açılış ayracı gereksiz olarak görülebilir, ancak bir dil böyle gidebilir (aslında tam olarak böyle diller olduğundan eminim ama onları iyi bilmiyorum):

if condition:
    statement
    other_statement()
end

PS2: 2019, bu cevaptan 4 yıl sonra. Python'u öğrendim ve anlamsal girintisine tamamen alıştım ve hiç okumak zor değil. Özellikle girinti bloklarının tanımlanmasına yardımcı olmak için dikey çubuklar çizen modern IDE'lerin yardımıyla.


Bu sözdizimini seviyorum çünkü iyi bir uzlaşma ve parantezlerden kaçınıyor. Ancak tek satırlık ifadeler için maliyetlidir, örneğin C'de parantezleri tamamen bırakabiliriz :(
Jo So

yuvalanmış ise ... elif sözlükleri kullanmayı deneyebilir ve / veya devam edebilir, geri dönebilir, iç içe işlevler ...
aoeu256

@ aoeu256 tamamen sorunun yanıtı ve cevabım da değil.
Petruza
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.