Java anahtar durumları: parantezli veya parantezsiz


86

Kaşlı ayraçlarla birlikte aşağıdaki iki parçacığı düşünün:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

Diş teli olmadan:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

Küme parantezi içeren kod parçacığında, her bir durumu küme parantezi içine alarak yeni bir kapsam oluşturulduğunu biliyorum. Bununla birlikte, her vaka yeni kapsama ihtiyaç duymuyorsa (yani, değişken adları yeniden kullanılmıyorsa), bir vaka ile parantez kullanımının herhangi bir tür performans cezası var mı?

Yanıtlar:


100

Diş tellerini bir kılıfla kullanmanın herhangi bir performans cezası var mı?

Yok.

Küme parantezleri derleyicinin bir değişkenin kapsamını, koşulunu, işlev bildirimini vb. Anlamasına yardımcı olmak için vardır. Kod bir çalıştırılabilir dosyada derlendiğinde çalışma zamanı performansını etkilemez.


21

Uygulama açısından performans cezası yoktur.

Ayrıştırılacak daha çok şey olduğundan, derleme açısından küçük bir performans cezası, ancak gerçekten bu konuda endişelenen biri varsa, kodunu tek bir satıra yazmaları gerekir :-)

Ve şimdi yazımızın fikir kısmına gelince ... Her zaman {ve} ekledim çünkü sürdürülebilirliğin bir cezası var, çünkü muhtemelen onları daha sonraki bir tarihte koymanız gerekecek ve bu onları koymak bir acı olabilir daha sonra ... ama bu% 103 kişisel tercih.


Cevabı kendim göremediğim için biraz merak ediyorum ... @TofuBeer, parantezleri ne zaman eklemelisin? Ayrıca, bakım kolaylığı konusuna tamamen katılıyorum, sadece ATM'nin bakım sorununu görmüyorum. DÜZENLEME: boşver. Aşağıdaki cevapların geri kalanını okudum.
nyaray

Bazı durumlarda C ++ ile yaparsınız, bu nedenle her iki dilde de çalışıyorsanız, ikisine de girmek kötü bir alışkanlık değildir.
TofuBeer

13

Bildiğimiz gibi, anahtar durumları için parantez gerekli değildir. Küme ayraçlarının kullanılması, bir vakanın kapsamı hakkında karışıklığa neden olabilir.

Bir açılış ayracı genellikle bir işlevin başlangıcı veya bir döngünün başlangıcı veya sınıf bildiriminin başlangıcı veya dizi başlatmanın başlangıcı vb. Gibi anlamlı bir şeyle ilişkilidir. Beyan. Bu nedenle, süslü parantezlerin kullanılması, cahil bir okuyucu için durum için farklı bir kapsam fikrini ima ediyor gibi görünüyor. Bu nedenle, daha iyi programlama okunabilirliği için kaşlı ayraç kullanmaktan kaçınmak daha iyidir.

Yani, şöyle bir şeyim olduğunda

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"1'den Merhaba" yazdırılır. Ancak küme parantezinin kullanılması, cahil bir okuyucuya vakanın '}' ile bittiğini, zaten kıvrımlı parantezlerin döngüler, yöntemler vb. Durumlarda genellikle neyi ifade ettiğini bilmesi gerektiğini düşündürebilir.

'C' de etikete atla ifadelerimiz olduğu gibi, kontrol sadece büyük / küçük harf durumuna geçer ve yürütülmesine devam eder. Yani, bu anlayışla, anahtar için vaka yazarken küme parantezi kullanmak sadece KÖTÜ bir uygulamadır.

Teknik olarak konuşursak, kodunuzun herhangi bir bloğunu, geçerli sözdizimi ile kullanıldığında ek bir çift küme parantezi ile çevreleyebilirsiniz. Switch'te parantez kullanmak en azından bana çok kötü görünüyor çünkü yukarıda söylediğim gibi farklı bir his veriyor.

Önerim: Switch durumlarda çevreleyen parantez kullanmaktan kaçının.


5
Buna katılmıyorum. Küme parantezleri kullanmak VE parantezlerin dışında kod yazmak çok kötü bir biçim olurdu, evet, ancak bu, parantez kullanımını kendi içinde gözden düşürmez.
Max Roncace

Diş telleri, örneğinizde bahsettiğiniz durumu tam olarak önlemek için oradadır ...
Petr Dvořák

12

Diş telleri ile.

Switch ifadelerinde yanlış gidebilecek o kadar çok şey var ki, elimden geldiğince onlardan kaçınmaya çalışıyorum.

  1. Araları unutmak ve böylelikle vaka düşüşlerine sahip olmak
  2. Varsayılan bir vakayı unutmak ve böylece karşılanmamış bir koşulu yakalayamamak
  3. Değişkenleri kazara vaka ifadeleri arasında yeniden kullanmak veya daha da kötüsü vaka ifadeleri arasında bir değişkeni paylaşan bir değişkeni etkilemek

Küme ayracı kullanmak, değişkenlerin durum ifadeleri arasında hem kasıtlı hem de yanlışlıkla paylaşılmasını önlemenin bir yoludur.


9
1. ve 2. maddeleri dahil etmek bu soru için yanıltıcıydı (benim için); Kapanış satırınız, parantezlerin yalnızca 3'ü çözdüğünü açıkça söylemelidir - parantezlerin ara verme ihtiyacını ortadan kaldırdığını düşündüğünüzü düşündüm, sonra denedim.
2013

3. nokta mantıklı bile değil. Switch ifadesinin üst kapsamında bildirilmedikçe değişkenleri yeniden kullanamazsınız. Bu, bir vaka içinde bir değişken bildirirseniz, o zaman başka bir case ifadesinde kullanılamayacağı anlamına gelir. Switch ifadesinin üzerinde (üst kapsamda) bir değişken bildirirseniz, kaşlı ayraç kullanıp kullanmamanız önemli değildir, case ifadeleri değişkene erişebilir.
dsingleton

Ben sadece (yeniden) keşfettim ki 1. durumda bildirilen değişkenler 2. durumda hala kapsamda olabilir. Örneğin: ...case 1: int a = 10; break; case 2: int a = 11; break; ...derlenmiyor. (Oracle JDK 8 ile test edildi)
anuragw

5

Bu soru muhtemelen "tartışmacı" (BRACE WAR!) Olarak kapatılacak ama ne olacak? Aslında vakalardan sonra diş tellerini seviyorum. Bana göre bu, çirkin anahtar sözdiziminin dil yapılarının geri kalanı gibi görünmesini sağlıyor. (Bu "durumda" küme ayracı kullanmanın bir cezası yoktur)


Sanırım bu biraz objektif bir soru ... Tartışmaya dayalı konuyu geri çekiyorum
Andy White

Diş telleri olmadan tercih ederim ... Diş tellerinin çok fazla gereksiz gürültü eklediklerini görüyorum.
cdmckay

Evet, bunun daha çok olmasını isterdim: case (FOO) {x = x + 1} case (BAR) {y = y + 1}
Andy White

Mantıklı boşluk == güzel. Gereksiz parantez == emmek.
Shog9

3
whitespace == sekmeler ve boşlukların karışımı == berbat (karışıma bir sekme ve boşluk yorumu ekleyeceğimi düşündüm)
Andy White

5

Değişken isimleri yeniden kullanılmadığı için parantezlerin çıkarılabileceğini söylüyorsunuz. Değişken adlarını yeniden kullanarak, aynı türde yeni bir değişken bildirmek istediğinizi varsayıyorum.

Küme ayraçları aslında aynı değişkeni caseyanlışlıkla farklı ' lerde tekrar kullanmamanızı sağlamak için çok kullanışlıdır . Bugün herhangi bir değişken tanımlamıyorlar, ancak yarın biri onları ekleyecek ve parantezler olmadan kod hataya açık.


3

Switch durumlarda parantez kullanmam.

  • Switch ifadesi zaten parantez olmadan yeterince barok görünüyor.

  • Geçiş durumları çok kısa olmalıdır. Değişkenleri bildirmeniz gerektiğinde, bu yanlış yaptığınızın bir işaretidir.

Şimdi, sporun 500'den fazla satırlık vakaları değiştirdiği bazı eski C kodunu sürdürmeye başladık ...


1

Bunu daha önce hiç düşünmemiştim. Bir dava maddesinde asla diş tellerine ihtiyaç duymadım, bu yüzden neden onlara ihtiyaç duyduğunuzu gerçekten anlayamıyorum. Şahsen ben "Bakımı daha kolay olacak" fikrine gitmiyorum, bu sadece saçmalık, eğer kod mantıklıysa ve belgelenmişse bakımı daha kolay olacaktır.

Küme ayracı yok ... daha az sözdizimi daha fazladır


{ve} her şeyi öne çıkarır, bu da okumayı kolaylaştırır (IMO).
TofuBeer

Evet. Bir zamanlar değiştirmek zorunda olduğum bir yöntemin hikayesini paylaşacaktım (bir satır kod eklemem yaklaşık 4 saat sürdü) ama kod deliydi (yazdırıldığında yaklaşık 10 sayfa uzunluğunda ve 4 sayfa genişliğinde), bu yüzden öyle değil tipik durum. Ama {} kullanmış olsaydı, eklemek bir dakika alırdı.
TofuBeer

Buradaki nokta şu ki, orijinal programcı kodun daha okunaklı olması için {} blokları yerleştirme çabasına girmiş olsaydı, aslında 10 sayfalık bir geçiş ifadesi yazıp kodu bir biraz daha az çılgın
Gareth Davis

swtich bir rüya olurdu .. eğer / elses ... COBOL programcıları tarafından C ++ kodunda yazılırsa iç içe geçmişti ... Bundan kısa bir süre sonra çıktım.
TofuBeer
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.