JavaScript'teki tek satırlık ifadelerde kaşlı ayraçlar gerekli mi?


163

Bir keresinde kıvırcık parantezleri tek satırlık ifadelerde bırakmanın JavaScript'te zararlı olabileceğini duydum. Artık sebebini hatırlamıyorum ve Google araması pek yardımcı olmadı.

JavaScript'teki kıvırcık parantez içindeki tüm ifadeleri çevrelemeyi iyi bir fikir haline getiren bir şey var mı?

Soruyorum, çünkü herkes öyle görünüyor.


5
Not: Bir satırda birden fazla ifadeniz olsa bile, yalnızca ilk ifade kapsamı üstlenir, bu nedenle "tek satır ifadeleri" değil, tek ifadedir
Kris Ivanov


@Blorgbeard: hayır, aslında bu cevaba daha önce cevap verdim.
Kule

Hah, görüyorum.
Boş ver

Yanıtlar:


204

Hayır

Ancak tavsiye edilir. Eğer ifadeyi genişletirseniz, onlara ihtiyacınız olacaktır.

Bu tamamen geçerli

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

Bununla birlikte, siz her zaman parantez kullanmanız önemle tavsiye edilir, çünkü siz (veya bir başkası) ifadeyi genişletirse, gerekli olacaktır.

Aynı uygulama, tüm C sözdizimi stili dillerinde destekle izlenir. C, C ++, Java, hatta PHP bile parantez olmadan bir satır ifadesini destekler. Sadece iki karakter kaydettiğinizi ve bazı insanların canlandırıcı stilleri ile bir satırı bile kaydetmediğinizi fark etmelisiniz. Tam bir ayraç stilini (aşağıdaki gibi) tercih ederim, bu yüzden biraz daha uzun olma eğilimindedir. Ödünç alma, son derece net kod okunabilirliğine sahip olmanızla çok iyi karşılanmaktadır.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}

28
+1, bilgilendirici cevap. Şahsen olsa da, bu "önerilen" şeyi yapmak için hiç yararlı bulmadım. Hiç piton kodlamadım, bu yüzden sadece bir şeyler eklemek ve girintinin önemli olmasını beklemiyorum. Bir ifade eklersem, ayraçlar da eklerim. Her zaman. Beni ısırdığı bir kez hatırlayamıyorum. C değil, C # değil JavaScript.
Jakob

16
@Kirk: Douglas Crockford bunu öneriyor. Bunun öznel bir kişisel karar olduğuna katılıyorum, ancak bir grupta çalışırken parantezleri yazmak daha kolay.
Josh K

10
@Josh, oh, iyi Crockford söyledi. Bu son söz olmalı. ;) (sadece şaka yapıyorum) Mesele, bu noktanın öznelliğinin tüm C-benzeri dillere yayılması ve her iki pozisyon için de güçlü görüşler bulunabilmesidir.
Kirk Woll

11
Kişisel deneyimlerim, ekipler üzerinde çalışırken braket yerleştirilmemenin büyük vidalara yol açabileceğini gösteriyor.
Sirs

4
Her zaman parantez kullanmak {} iyi bir uygulamadır. @Arx'ın dediği gibi, onları dışarıda bırakırsanız hata için çok daha fazla alan var. Apple , iOS'un SSL /
TLS'sinde

94

Okunabilirlik yönü var - bileşik ifadeler olduğunda çok kafa karıştırıcı olabilir. Girintileme yardımcı olur, ancak derleyici / yorumlayıcı için hiçbir şey ifade etmez.

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //Only on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //Only on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached

Ve sonra bir genişletilebilirlik yönü var:

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 

Düşünce, her zaman paranteziniz varsa, o bloğun içine başka ifadeler eklemeyi bildiğinizdir.


4
Biz her zaman bir-liner olarak kullanmalısınız yüzden: if (a===true) alert(a);. Şimdi açık!
João Pimentel Ferreira

1
Kıvırcık-sol köşeli ayraç ve kıvırcık-sağ köşeli ayraç kullanmak koşulların net olmasını sağlar. Aramızdaki hayalperestler için, sol ve sağ uçan kuş olarak da adlandırılır.
HalfMens

61

Soru bir satırdaki ifadeleri soruyor. Bununla birlikte, sağlanan birçok örnek, birden fazla satır ifadesine dayanarak parantezleri bırakmamanın nedenlerini göstermektedir. Tercih ettiğiniz kodlama stili ise, bir satırda parantez kullanmamak tamamen güvenlidir.

Örneğin, soru bunun iyi olup olmadığını sorar:

 if (condition) statement;

Bunun iyi olup olmadığını sormaz:

 if (condition)
   statement;

Ben daha az gereksiz sözdizimi ile kodu daha okunabilir yapar çünkü parantezleri bırakarak tercih edilebilir olduğunu düşünüyorum.

Kodlama tarzım, kod bir blok olmadığı sürece hiçbir zaman parantez kullanmamaktır. Ve asla tek bir satırda (noktalı virgülle ayrılmış) birden fazla ifade kullanmayın. Bunu kolay okunur ve anlaşılır buluyorum ve 'if' ifadelerinde asla kapsam belirleme sorunları yaşamıyorum. Sonuç olarak, tek bir if koşul ifadesinde parantez kullanmak 3 satır gerektirir. Bunun gibi:

 if (condition) {
   statement;
 }

Daha az dikey alan kullandığı ve kod daha kompakt olduğu için bir satır if ifadesi tercih edilir.

Başkalarını bu yöntemi kullanmaya zorlamam, ama benim için çalışıyor ve parantezleri bırakmanın kodlama / kapsam belirleme hatalarına yol açtığı örneklerle daha fazla anlaşamadım.


1
Her zaman birisinin her zaman diş telleri içermesi gerektiğini hissettim ... ama şimdi tekrar düşünüyorum. Sen var airbnb yanınızda stil rehberi!
senderle

1
Yine de çoğu kod formatlayıcının bunu 2 satırlı bir formata değiştirdiğini ve sorunlu koda geri döndüğünüzü unutuyorsunuz. Dikey boşluk argümanı sadece aptalca. Okunabilirlik her zaman kazanır ve bugünün ekranları çok büyüktür.
Kim

1
Her bir parantez için tek satırlık ifadelerinizi çevrelemek için eklenen 2 satır, kodunuzu koruyan - hatta çok dikkatli bir geliştiricinin - neden olabileceği potansiyel bir hasarla karşılaştırıldığında büyük bir maliyet değildir. Siz kendiniz efsanevi becerilere sahip harika bir geliştirici olabilirsiniz, ancak meslektaşlarınızın olduğunu varsayamazsınız. KISS, bir bağlamla bir şeyler sarın ve başkaları için mümkün olduğunca kolay hale getirin yoksa sonunda sorun yaşarsınız.
Maciej Tokarz

@senderle Bunu kontrol etmek için eslint kuralı burada bulunabilir: eslint.org/docs/rules/curly#multi /*eslint curly: ["error", "multi"]*/
silkfire

15

Teknik olarak hayır ama başka türlü kesinlikle Evet !!!

"Bu kişisel tercihi" unutun, "kod iyi çalışır", "benim için iyi çalışıyor", "daha okunabilir" yada yada BS. Bir hata yaparsanız ve kodlama yaparken bir hata yapmanın çok kolay olduğuna inanıyorsanız bu çok ciddi sorunlara yol açabilir (İnanmayın ?, ünlü Apple'ın hataya gitmesine bakın ).

Argüman: "Kişisel tercih"

Hayır öyle değil. Mars'tan ayrılan tek kişilik bir takım değilseniz, hayır. Çoğu zaman kodunuzu okuyan / değiştiren başka insanlar olacaktır. Herhangi bir ciddi kodlama ekibinde bu tavsiye edilen yöntem olacaktır, bu yüzden 'kişisel tercih' değildir.

Argüman: "kod iyi çalışır"

Spagetti kodu da öyle! Onu oluşturmanın uygun olduğu anlamına mı geliyor?

Tartışma: "benim için iyi çalışıyor"

Kariyerimde bu problem yüzünden çok fazla hata oluştuğunu gördüm. Muhtemelen kaç kez yorum yaptığınızı 'DoSomething()'ve neden 'SomethingElse()'çağrıldığına şaşkın olduğunuzu hatırlamıyorsunuz :

if (condition) 
    DoSomething();
SomethingElse();

Veya 'SomethingMore' ekledi ve çağrılmayacağını fark etmedi (girinti aksini ima etse bile):

if (condition)
  DoSomething();
  SomethingMore();

İşte sahip olduğum gerçek bir hayat örneği. Birisi find & replace "console.log"=> çalıştırmak için tüm günlüğü kapatmak istedi //"console.log":

if (condition) 
   console.log("something");
SomethingElse();

Sorunu görüyor musunuz?

"Bunlar çok önemsiz, bunu asla yapmam" diye düşünseniz bile; her zaman sizden daha düşük programlama becerilerine sahip bir ekip üyesi olacağını unutmayın (umarım takımın en kötüsü değilsiniz!)

Argüman: "daha okunabilir"

Programlama hakkında bir şey öğrendiysem, basit şeyler çok hızlı bir şekilde çok karmaşık hale gelir. Bunun çok yaygın olduğu:

if (condition) 
    DoSomething();

farklı tarayıcılar / ortamlar / kullanım senaryoları veya yeni özellikler eklendikten sonra aşağıdakilere dönüşür:

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");

Ve bununla karşılaştırın:

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }

Not: Bonus puanları yukarıdaki örnekte hatayı fark edenlere gider.


2
iyi bariz hata DoSomethingMore (); Ama başka bir hata daha var. a null ve b null ise, yalnızca "b hatası", hiçbir zaman "a hatası" almazsınız.
rocketsarefast

Örneklerinizle, geliştirme ekibiniz nasıl kod yazacağını bilmiyor, kaşlı ayraçlar onlara yardımcı olmayacak ...
Carlos ABS

bazı örnekler Apple geliştirici ekibinden
Caner

13

Sürdürülebilirlik sorunu yok!

Hepinizle ilgili sorun, her yerde noktalı virgül koymanızdır. Birden fazla ifade için kıvırcık parantezlere ihtiyacınız yoktur. Bir ifade eklemek istiyorsanız, virgül kullanın.

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");

Bu, beklediğiniz gibi çalışacak geçerli bir koddur!


2
Şunu yapmayın if, elseve alertdeğil If, Elseve Alert?
Anish Gupta

Vay, bunu bilmiyordum, beni bilgilendirdiğin için teşekkürler! Çoğu insan bu önemli ayrıntıyı dışarıda bırakıyor.
Hendeca

13
Bu JavaScript'te çalışıyor olsa da, neden bunu yapmak isteyeceğinizi benden öteye taşıyor. Geliştiricilerin çoğunluğunun bunun farkında değilim (bunu okumadan önce kendim de dahil), o zaman hızlı bir şekilde geliştiriciler arasında bir sürdürülebilirlik sorunu haline geleceğinden şüphelendiğimi tahmin ediyorum. Bazen, en akıllı yol en iyisi değildir.
Simon

14
Bu korkunç. Birisi bir virgül içine noktalı virgül açmak için bir açıklama ve unutur eklerse şimdi ikinci bloktaki son açıklamaya, olabileceğin bir hata var gerçekten çok hat bakmak yolu sonundaki virgül ve noktalı virgül nedeniyle sert noktaya benzer.
Ingo Bürk

1
"Hemingwayian" yaklaşımını tercih ederim : çok temiz. Ve arasındaki boşluk bırakmadan ifve (benzeriif(true) doSomething();
victorf

8

Kıvırcık parantezleri bir satır ifadesinde kullanmak için programlama nedeni yoktur.

Bu sadece kodlayıcıların tercihleri ​​ve okunabilirliği ile ilgilidir.

Kodunuz bundan dolayı kırılmaz.


7

@Josh K (Java, C vb. İçin de geçerlidir) tarafından belirtilen nedene ek olarak, JavaScript'teki özel bir sorun otomatik noktalı virgül yerleştirmektir . Wikipedia örneğinden:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

Bu nedenle, bu şekilde kullanılırsa beklenmedik sonuçlar da verebilir:

if (x)
   return
   a + b;

Yazmak gerçekten daha iyi değil

if (x) {
   return
   a + b;
}

ama belki burada hata tespit etmek biraz daha kolaydır (?)


Yazarlar geçici ve satır başına ya da işe yarayana kadar ödenmedikçe, tüm bu örnekler bana korkunç geliyor.
Cees Timmerman


4

Çok sayıda iyi yanıt var, bu yüzden parantezler atlanabildiğinde “kuralımı” söylemek dışında tekrar etmeyeceğim: tek ifadeleri olarak 'geri dönen' veya 'fırlatan' (örn.) Koşullar üzerinde . Bu durumda akış kontrolü zaten sona erdiği açıktır:

“Kötü durum” bile, sonlanan akış kontrolü nedeniyle hızlı bir şekilde tanımlanabilir (ve sabitlenebilir). Bu kavram / yapı “kuralı” aynı zamanda birçok dil için de geçerlidir.

if (x)
    return y;
    always();

Tabii ki, bu yüzden de bir linter kullanabilirsiniz ..


3

İşte bu yüzden tavsiye edilir

Diyelim yazıyorum

if(someVal)
    alert("True");

Sonra bir sonraki geliştirici gelir ve "Oh, başka bir şey yapmam gerek" der, bu yüzden yazarlar

if(someVal)
    alert("True");
    alert("AlsoTrue");

Gördüğünüz gibi "AlsoTrue" her zaman doğru olacaktır, çünkü ilk geliştirici parantez kullanmadı.


Bu doğru değil, 'else' eksik: if (someVal) uyarısı ("True"); başka uyarı ("AlsoTrue"); doğru olur. Ben kullanmak istemem çünkü {} çok daha iyi okunabilir olması için seviyorum.
Gerrit B

1
Ha? Başka bir ifadem yoktu. Kıvırcık parantez olmadan, birisi yeni bir çizgi eklerse hatalara yol açabileceğini söylüyordum. Demek istediğimi anlamadın.
Amir Raminfar

Bence söylediği şey, 2. satır ne olursa olsun idam edilecek. Parantez içermeyen bir If ifadesi yalnızca 1 satır yürütebilir.
PostCodeism

3

Şu anda bir madenci üzerinde çalışıyorum. Şimdi bile iki büyük senaryoda kontrol ediyorum. Deneysel olarak öğrendim: Kıvırcık parantezler ',', 'if', 'else' içermiyorsa, eğer *, eğer fonksiyon * için arkasındaki kıvırcık parantezleri kaldırabilirsiniz, 'iken', 'do', 'fonksiyon'. Sayısız çizgi kesiliyor.

function a(b){if(c){d}else{e}} //ok  
function a(b){if(c)d;else e}   //ok

Tabii ki kapanış ayracı başka bir kapanış ayracı tarafından takip edilmezse noktalı virgülle değiştirmeniz gerekir.

İşlev virgülle bitmemelidir.

var a,b=function()c;  //ok *but not in Chrome
var b=function()c,a;  //error  

Chrome ve FF'de test edildi.


2

Her zaman buldum

if(valid) return;

gözümde daha kolay

if(valid) {
  return;
}

ayrıca şartlı gibi

(valid) ? ifTrue() : ifFalse();

kişisel görüşümü okumaktan daha kolay

if(valid) {
  ifTrue();
} else {
  ifFalse();
}

ama sanırım kodlama tarzı geliyor


2

Soruyu doğrudan yanıtlamıyor, ancak aşağıda bir satırdaki koşul hakkında kısa bir sözdizimi bulunmaktadır

Ör:

var i=true;
if(i){
  dosomething();
}

Şu şekilde yazılabilir:

var i=true;
i && dosomething();


1

Bu cevabı benzer bir deneyimle ararken buldum, bu yüzden deneyimle cevaplamaya karar verdim.

Parantezsiz ifadeler çoğu tarayıcıda çalışır, ancak parantezsiz yöntemlerin aslında bazı tarayıcılarda çalışmadığını test ettim.

26 Şubat 2018 itibarıyla, bu ifade Pale Moon'da çalışıyor, ancak Google Chrome'da çalışmıyor.

function foo()
   return bar;

0

Bir ifadenin başlangıç ​​girinti düzeyi, üstündeki açık ayraçların sayısına eşit olmalıdır. (alıntılanmış veya yorumlanmış kaşlı ayraçlar veya önişlemci yönergelerindeki yönergeler hariç)

Aksi takdirde K&R iyi girinti tarzı olacaktır. Stillerini düzeltmek için, bir satıra kısa basit if ifadeleri koymanızı öneririm.

if (foo) bar();    // I like this. It's also consistent with Python FWIW

onun yerine

if (foo)
   bar();   // not so good

Bir editör yazıyordum, otomatik format düğmesinin çubuğu foo ile aynı satıra kadar emmesini sağlarım ve bu şekilde dönmeden basarsanız çubuğun etrafına parantez eklemesini yaparım:

if (foo) {
  bar();    // better
}

Daha sonra, if ifadesinin gövdesine çubuğun üstüne veya altına yeni ifadeler eklemek kolay ve tutarlıdır

if (foo) {
  bar();    // consistent
  baz();    // easy to read and maintain
}

-1

Bazen ihtiyaç duyuluyor gibi görünüyor! Kendime inanamadım, ancak dün bana bir Firebug oturumunda (son Firefox 22.0) gerçekleşti

if (! my.condition.key)
    do something;

idam do şey rağmen my.condition.key oldu doğrudur . Diş telleri ekleme:

if (! my.condition.var) {
    do something;
}

bu sorunu düzeltti. Görünüşe göre parantez olmadan çalıştığı örneklerin sayısız var, ancak bu durumda kesinlikle işe yaramadı.

Çok kesinlikle gereken bir hat üzerinde birden fazla ifadeyi koymak eğilimindedir İnsanlar hep tabii ki, parantez, gibi şeyler yüzünden

if (condition)
    do something; do something else;

bulmak zor.


Parantez eksikliğinin if koşulunu doğru hale getirdiği senaryoyu merak ediyorum, hatırlayabilir veya gerçek bir örnek verebilir misiniz?
gitsitgo

Koşullu ifade her zaman ifadeden önce değerlendirilir. Bunun gerçek bir örneğini de görmek çok merak ediyorum çünkü tercümandaki bir hatayı temsil ediyor.
Noktalı virgül

-1

Sadece kıvırcık parantezleri başkalarından da bırakabileceğinizi belirtmek isterim. Görüldüğü gibi , John Resig en tarafından bu makalede .

if(2 == 1){
    if(1 == 2){
        console.log("We will never get here")
    }
} else 
    console.log("We will get here")

[Qt parantez stili] [1] elseküme ayracı kullanımını eşleştirmek için her iki tarafında bloklar gerektirir - bu örnek elsebir kod incelemesini geçmek için bloktaki parantezleri gerektirir . [1]: wiki.qt.io/Qt_Coding_Style#Braces
pixelgrease

Neden inişli çıkışlı? Yukarıdaki ifade% 100 doğrudur.
Johnston

-1

Eğer ifadeler birden fazla satır kıvırcık olmayan parantez elde etmek için bir yolu var .. (Vay ne ingilizce ..) ama tür tedius:

if(true)
   funcName();
else
   return null;


function funcName(){
  //Do Stuff Here...
}

Kıvırcık parantezleri atlarken çok fazla yeni çizgiye sahip olmanız gerekmez. Yukarıdaki iki satırda da yazılabilir: if (true) funcName()ve else return null
phobos
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.