Bu yeni if-then sözdizimi hakkında ne düşünüyorsunuz [kapalı]


11

Sadece if-elif-else kontrollerimde olması çok güzel bir şey düşünüyordum.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Yani temelde bir thenkoşul dışında koşullardan biri çalıştırıldığında çalıştırılacaktır. Bunun faydalı olduğunu düşünüyor musunuz? Bu, python'un try-haricindeki deneyine benzer.

Bence bazılarınız çok ilk bir uygulamayı nitelendiriyorsunuz. thenBlok gibi olacaktı elsebir blok try-exceptpiton blok. Bunu önermemizin asıl nedeni böyle durumlar içindir.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

thenTıpkı eğer blok ilk kapsama aldığı elseolduğunu. Yani yuvalama iyi çalışıyor. Ve if ifadelerinden önce bir yöntem çalıştırmanız gerekiyorsa, bunun bu kullanım durumu ile gerçekten ilgisi yoktur.


bu ne kadar iç içe olabilir?
aggietech

6
Kutunun dışında düşünmek için +1, ancak aslında uygulamak için oy vermezdim. Cevabımı neden aşağıda görebilirsiniz.
Wonko the Sane

1
Peki 'o zaman' finallyJava'daki gibi davranıyor mu?
Alex Feinman

1
thenBiraz kafa karıştırıcı buluyorum . Genellikle thenbir sonra meydana geldiği ima edilir if. Yani, diyorsun if condition, then stuff()ama sonra söylemeye devam etthen stuff that applies to both
Matt Olenik

2
İlginç bir düşünce egzersizi için +1, ancak Bad Idea altında bunu cevaplayan cevaplara katılıyorum. Sadece sezgisel değil ve bunu GERÇEKTEN bazı kodlayıcıları açtığını görebiliyordum.
BlairHippo

Yanıtlar:


17

Bence korkunç görünüyor. Kodun çeşitli koşullardan sonra çalışmasını istiyorsanız (a) bu koşulları yeniden kontrol edin veya (b) belirtilen başarı durumuna bir değişken ayarlayın.


2
Katılıyorum - verdiğiniz gibi bir açıklama yapmadan ne anlama geldiğini anlamak çok zor.
tcrosley

Neden bir şeyin beklenenden çok fazla çalıştığının açıklanmasını gerektiriyor?
Ekim'de Falmarri

5
Çünkü kodun okunmasını zorlaştırır.
Antsan

Bunun adil olduğundan emin değilim. Koddaki her yapı bir kez açıklanmalıdır.
Magus

14

Genellikle bunu bir anahtar / kasa ile yapabilirsiniz ve bir anahtar / kasa teklif ettiğiniz şey üzerinde daha ince ayarlanmış kontrol sağlar.

Ayrıca mantıksal olarak düzgün okunmuyor. Eğer A ise B ise o zaman C. A veya B doğru olarak değerlendirilirse C'nin yürütüleceğini ima etmez.


2
Python'un switch / case ifadeleri yok
Falmarri

2
Sorunun doğrudan Python'a doğru cevaplandığını düşünmüyorum, ancak niyet buysa lütfen Python olarak da etiketleyin.
Brian R. Bondy

Eh, doğrudan python ile ilgili değil. Örnek python'daydı. Ancak bunun neden gerekli olmadığına yanıtınız "anahtar ifadeler" ise, python bunlara sahip değildir.
Ekim'de Falmarri

1
@Falmarri: Yeterince adil, bu yüzden benim cevabım Python'un klasik anahtar ifadelerini desteklemek için daha iyi olacağını düşünüyorum.
Brian R. Bondy

sorudaki kod Python'dadır, sorunun Python ile ilgili olduğu anlamına gelmez, çünkü bu da sözde kod olabilir. Bu sadece Python ile ilgili ise, o zaman bu şekilde etiketlenmelidir
phuclv

8

İlginç, ama bana öyle geliyor ki (kuşkusuz bir şekilde benim yoluma girdi) okunabilirlik, mantık ve sözdizimi sorunları için bir davet.

Düzenleme: if-elif çok basit - 10 elif olsaydı? 20? Tüm koşulların doğru olması gerekir mi? Bunun şansı nedir?
İf-elif'iniz çok basittir - 10 elif olsaydı? 20? Bu oldukça okunmaz olmaz mı?

Ayrıca, denenmiş ve doğrulanmış bir metodoloji ile kolayca elde edilebilir:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Tek tek adımlardan önce "stuff_that_applies_to_both" ifadesinin olması gerekiyorsa ne olur? Kodunuz bu durumu ele almıyor:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Son olarak, bu sözdizimi daha fazla koşulla daha fazla esnekliğe izin verir: if (thisCondition veya thatCondition veya anotherCondition) {stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

If / else kullanıyorum, ama kolayca bir bayrak ile bir anahtar deyimi kullanılmış olabilir:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Aslında conditionApplies bayrağına ihtiyacım olmadığını unutmayın - Ben varsayılan olmayan koşullara "stuff_that_applies_to_both ()" işlevini ekleyebilirdi - Ben sadece bu yüzden yukarıda tanımlanan sözdizimi gibi görünüyor, daha sonra "sonra" "else" yerine.

Bu nedenle, daha genel bir sözdiziminin faturayı ve daha fazlasını doldurduğu çok özel bir sözdizimi gibi görünüyor.

Olası bir özelliği düşündüğünüz için +1 (bunu yapmaya devam edin!), Ancak uygulamak için oy vermezdim.


1
"Denenmiş ve gerçek yerleşik metodoloji" için +1 - bir sorun için makul bir çözüm varsa, genellikle kullanmak en iyisidir :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Bu mümkün değil. sadece 1 elif doğru olabilir çünkü daha fazla değerlendirmeyi durdurur.
53'te Falmarri

Benim hatam - "ve" demek istediğin zaman "ya da" olarak okudum. Ancak, cevabımın yanındayım - işaret ettiğinden güncelleyeceğim.
Wone the Sane

Burada yazdığınız sözdiziminin gerçekten önerdiğimden daha açık olduğunu düşünüyor musunuz? Koşullarınızı sadece iki kez kontrol etmekle kalmaz, aynı zamanda yuvalama yapmak yuvalanmadan her zaman daha iyidir
Falmarri

1
Sizinki gibi, “o zaman” sizin, daha fazla ve daha fazlasını ekledikçe, gittikçe daha az olası hale gelen tüm koşullara gerçekten uygulanmadığı sürece. Ve kişisel olarak, bir C / C ++ / C # arka planından geldiğimde, bölünmüş sözdiziminden biraz daha az kafa karıştırıcı buluyorum (yani "if" veya belki bir "elsif" de burada bir şeyler yapmak ve sonra aşağı atlamak ve bir şeyler yapmak Şahsen ben, sözdizimini tüm şartlara sahip olmak için daha okunabilir buluyorum. Doğru olmayabilir, ama bu benim günlük dünyamda daha köklü bir kavram.
Wonko the Sane

2

Bugün böyle bir şey kullanmayı düşünmezdim. Ama emin olmak için tekrarlamak kadar sık ​​kullanacağım.

Kod en azından gereksiz yuvalama olmadan daha iyi görünecektir. Ben tercih etsem Else Ifde elif. Ben değiştirecekti Thenile Dove son Elseile Otherwise.



Oh, yeni bir dil tasarladığını sanıyordum. Sadece isim değişikliklerinin daha kesin olmasını öneriyordum, isterseniz elif'i bırakın, ancak sonuncusu normalden farklı olmalı gibi görünüyor.
Peter Turner

Yeni bir dil için değil, python için de gerekli değil. Genel olarak bir sözdizimi kuralı için yeni bir fikir. Bu, nispeten az yan etkisi olan herhangi bir dile uygulanabilir.
Ekim'de Falmarri

0

Harika bir fikir gibi görünüyor. Ancak hayal ediyorum tek sorun daha hata eğilimli olmasıdır. Bir if / else if yazmak ve o zaman blah () çağırmak gibi. Eğer blah istemiyorsa fazladan bir yazı yazmak, o zamandan blah'ı kaldırmak ve ifs / elseif'lerinize eklemek. Daha sonra siz veya başka bir programcı başka bir ifade eklediğinizde, blah'ın çağrılmasını bekleyebilirsiniz, ancak istemeyebilirsiniz.

Ya da birkaç ifs olabilir, bir falan yazabilir ve tüm ifs unutabilir ama biri bunu gerektirecek bir şey kırabilir. Ayrıca, if bloğunun altına koyacaksanız her birini takip etmelerine ihtiyacınız varsa. Muhtemelen başka bir bool ayarlamak (NoUpdate = true) ve doğrudan altında daha net olan ve bir if tarafından ayarlanabilen bir if (! NoUpdate) {} yazmanız yeterlidir.

Sadece hatalara daha yatkın göründüğünü söylüyorum, fikri sevmiyorum. Ben bir dilde görmek sakıncası olmaz ama benim dil destekliyorsa onu kullanacağım herhangi bir durum hayal edemiyorum.


Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an ifBunun tam olarak önlenmesi gereken şey budur. Bir elif ifadesinin bütün mesele bu. Elif de gerekli değil, eğer ifadeler ile kontrol edilebilir, ancak karmaşıklaşır.
Falmarri

0

Sözdiziminizi kafa karıştırıcı buluyorum, ancak kavramda bir değer görüyorum. Kavramsal olarak, konuyu düşündüğümde, kendimi isterken bulduğum şey, temelde son elseateşlenmediği durumlarda işleri yürütecek olan bir "boş" . Bu açıdan baktığımda, aşağıdakiler yoluyla benzer bir sonuç elde edebileceğinizi öneririm:

  yapmak
  {
    eğer (koşul1)
      ... sadece koşul1 için şeyler
    aksi halde (koşul2)
      ... sadece condition2 için şeyler
    Başka
    {
      ... her iki koşul için de
      break;
    }
    ... her iki koşul için de
  } süre (0); // Mola için devam noktası

Başka bir seçenek bazı durumlarda şunlar olabilir:

  if ((koşul1 && (işlem1,1)) ||
       (koşul2 && (işlem2,1)) ||
       (Action_for_neither, 0))
    action_for_either;

Biraz iğrenç görünüyor, ancak bazı durumlarda, kodu çoğaltmak veya kullanmaktan goto(istenen birinin buraya ekleyebileceği karikatür hariç) o kadar kötü olmayabilir) istenen olay sırasını ifade etmenin iyi bir yolu olmayabilir.

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.