Apa pendapat Anda tentang sintaks if-then baru ini [ditutup]

11

Saya hanya memikirkan sesuatu yang akan sangat keren untuk dimiliki dalam kontrol if-elif-else.


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

Jadi pada dasarnya a thenakan dijalankan ketika salah satu kondisi dijalankan KECUALI kondisi yang lain. Apakah Anda pikir ini berguna? Ini mirip dengan coba-kecuali-yang lain dari python.

Saya pikir beberapa dari Anda sedang merencanakan implementasi yang sangat awal. The thenblok akan menjadi seperti elseblok di try-exceptblok di python. Alasan sebenarnya saya menyarankan ini adalah untuk situasi seperti ini.


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

The thenblok scoped untuk yang pertama jika seperti elseini. Jadi bersarang berfungsi dengan baik. Dan jika Anda perlu menjalankan metode sebelum pernyataan if, itu benar-benar tidak ada hubungannya dengan use case ini.

Falmarri
sumber
bagaimana bersarangnya ini?
aggietech
6
+1 untuk berpikir di luar kotak, tetapi saya tidak akan memilih untuk benar-benar mengimplementasikannya. Lihat jawaban saya mengapa di bawah ini.
Wonko the Sane
1
Jadi 'lalu' bertindak seperti finallydi Jawa?
Alex Feinman
1
Saya merasa thenagak membingungkan. Biasanya thentersirat terjadi setelah suatu if. Maksud saya, Anda katakan if condition, then stuff()tetapi kemudian lanjutkan untuk mengatakanthen stuff that applies to both
Matt Olenik
2
Memberi +1 untuk latihan pemikiran yang menarik, tapi saya setuju dengan jawaban yang diajukan di bawah Gagasan Buruk. Hanya saja tidak intuitif, dan saya bisa melihat ini BENAR-BENAR tersandung beberapa coders.
BlairHippo

Jawaban:

17

Saya pikir itu terlihat mengerikan. Jika Anda ingin kode dijalankan setelah berbagai kondisi, maka (a) periksa kembali kondisi tersebut atau (b) tetapkan variabel ke status keberhasilan yang ditunjukkan.

Josh K.
sumber
2
Saya setuju - sangat sulit untuk mengambil artinya tanpa penjelasan seperti yang Anda berikan.
tcrosley
Mengapa perlu penjelasan tentang bagaimana sesuatu bekerja terlalu banyak untuk diharapkan?
Falmarri
5
Karena itu membuat kode lebih sulit dibaca.
Antsan
Saya tidak begitu yakin itu adil. Setiap konstruk dalam kode harus dijelaskan satu kali.
Magus
14

Secara umum Anda sudah bisa melakukan ini dengan switch / kasing dan saklar / kasing memberikan kontrol yang lebih baik atas apa yang Anda usulkan.

Itu juga tidak membaca dengan benar secara logis. Jika A lain jika B maka C. Tidak menyiratkan kepada seseorang bahwa C akan dieksekusi jika A atau B dinilai benar.

Brian R. Bondy
sumber
2
Python tidak memiliki pernyataan switch / case
Falmarri
2
Saya tidak berpikir pertanyaan itu diucapkan langsung ke Python hanya jawaban, tetapi jika itu maksudnya silakan tandai sebagai Python juga.
Brian R. Bondy
Yah, itu tidak secara langsung diucapkan ke arah python. Contohnya adalah dalam python. Tetapi jika respons Anda mengapa ini tidak diperlukan adalah "ada pernyataan switch", well python tidak memilikinya.
Falmarri
1
@ Falmarri: Cukup adil, jadi saya kira jawaban saya adalah Python akan lebih baik untuk mendukung pernyataan switch klasik.
Brian R. Bondy
kode dalam pertanyaan tersebut adalah dalam Python tidak berarti bahwa pertanyaannya adalah tentang Python, karena itu bisa menjadi pseudocode juga. Jika itu hanya tentang Python maka harus ditandai seperti itu
phuclv
8

Menarik, tetapi bagi saya (diakui agak diatur dalam cara saya) undangan untuk keterbacaan, logika, dan masalah sintaksis.

Sunting: If-elif Anda sangat sederhana - bagaimana jika ada 10 elif? 20? Apakah semua kondisi harus benar? Apa peluangnya?
If-elif Anda sangat sederhana - bagaimana jika ada 10 elif? 20? Bukankah itu membuat ini cukup terbaca?

Juga, dapat dengan mudah dicapai dengan metodologi yang telah terbukti:

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

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

Apa yang terjadi jika "stuff_that_applies_to_both" perlu terjadi sebelum masing-masing langkah? Kode Anda tidak menangani kasus ini:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

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

Akhirnya, sintaks ini memungkinkan fleksibilitas yang lebih besar dengan lebih banyak kondisi: if (thisCondition atau thatCondition atau otherCondition) {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();
}

Saya telah menggunakan if / else, tetapi bisa dengan mudah menggunakan pernyataan switch dengan flag:

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();

Perhatikan bahwa saya tidak benar-benar memerlukan flag conditionApplies - saya bisa menambahkan fungsi "stuff_that_applies_to_both ()" untuk kedua kondisi non-default - saya hanya melakukan ini sehingga lebih mirip sintaks yang ditentukan di atas, meskipun "lalu" daripada yang "lain".

Oleh karena itu, bagi saya tampaknya menjadi sintaksis yang sangat khusus, di mana sintaksis yang lebih umum mengisi tagihan dan banyak lagi.

+1 untuk memikirkan fitur yang mungkin (terus lakukan itu!), Tetapi saya tidak akan memilih untuk mengimplementasikannya.


1
+1 untuk "metodologi yang sudah dicoba dan benar" - jika ada solusi yang masuk akal untuk suatu masalah, biasanya yang terbaik adalah menggunakannya :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Itu tidak mungkin. hanya 1 elif yang bisa benar karena berhenti mengevaluasi lebih banyak.
Falmarri

Kesalahan saya - saya membacanya sebagai "dan" ketika Anda bermaksud "atau". Namun, saya mendukung jawaban saya - saya akan memperbaruinya dari apa yang Anda tunjukkan.
Wonko the Sane

Apakah Anda benar-benar berpikir sintaks yang Anda posting di sini lebih jelas daripada yang saya sarankan? Anda tidak hanya memeriksa kondisi Anda dua kali, tetapi non-bersarang selalu lebih baik daripada bersarang
Falmarri

1
Seperti yang akan Anda lakukan, kecuali jika "maka" Anda benar-benar berlaku untuk semua kondisi, yang, ketika Anda menambahkan lebih banyak dari mereka, menjadi semakin kecil kemungkinannya. Dan secara pribadi, berasal dari latar belakang C / C ++ / C #, saya menemukan bersarang sedikit lebih membingungkan daripada sintaks split (yaitu melakukan sesuatu di sini di "jika" atau mungkin "elsif", dan kemudian melakukan lompatan ke bawah dan melakukan sesuatu lain di "lalu" .Saya, secara pribadi, menemukan sintaks lebih mudah dibaca untuk memiliki semua kondisi bersama-sama. Mungkin tidak benar, tetapi itu adalah konsep yang lebih mapan dalam dunia saya sehari-hari.
Wonko the Sane

2

Saya tidak keberatan menggunakan sesuatu seperti ini hari ini. Tapi, untuk memastikan saya akan menggunakannya sesering saya menggunakan ulangi sampai.

Kode setidaknya akan terlihat lebih baik tanpa bersarang berlebihan. Meskipun saya lebih suka Else Ifuntuk elif. Saya akan mengganti Thendengan Dodan final Elsedengan Otherwise.


Nah, bicaralah dengan pencipta python, bukan aku =]
Falmarri

Oh, saya pikir Anda sedang merancang bahasa baru. Saya hanya menyarankan perubahan nama menjadi lebih tepat, tinggalkan elif jika Anda mau, tetapi yang terakhir sepertinya harus berbeda dari yang lain.
Peter Turner

Yah itu belum tentu untuk bahasa baru, tetapi juga belum tentu untuk python. Hanya ide baru untuk aturan sintaksis secara umum. Ini dapat diterapkan pada bahasa apa pun dengan efek samping yang relatif sedikit.
Falmarri

0

Sepertinya ide yang keren. Namun satu-satunya masalah yang saya bayangkan adalah Anda lebih rentan terhadap bug. Seperti menulis if / else if dan memanggil blah () pada saat itu. Menulis tambahan lain jika itu tidak ingin bla, menghapus bla dari itu dan menambahkannya ke ifs / elseifs Anda. Kemudian ketika Anda atau programmer lain menambahkan pernyataan lain, Anda mungkin berharap bla dipanggil tetapi tidak.

Atau Anda dapat memiliki beberapa ifs, tulis bla dan lupakan semua seandainya hanya satu yang memerlukan ini yang akan menghancurkan sesuatu. Kemungkinan juga adalah jika Anda membutuhkan mereka untuk mengikuti setiap jika Anda akan meletakkannya di bawah blok if. Mungkin mengatur bool di tempat lain (NoUpdate = true) dan hanya menulis a if (! NoUpdate) {} langsung di bawah yang lebih jelas dan dapat diatur oleh jika

Saya hanya mengatakan sepertinya lebih rentan terhadap bug, bukan berarti saya tidak suka ide itu. Saya tidak keberatan melihatnya dalam bahasa tetapi saya tidak bisa membayangkan situasi di mana saya akan menggunakannya jika bahasa saya mendukungnya.


sumber
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 ifInilah yang seharusnya mencegah hal ini. Itulah inti dari pernyataan elif. Elif juga tidak perlu, itu bisa diperiksa dengan pernyataan if, tetapi menjadi rumit.
Falmarri
0

Saya menemukan sintaks Anda membingungkan, tetapi saya melihat beberapa nilai dalam konsep. Secara konseptual, ketika saya mempertimbangkan masalah ini, apa yang saya dambakan adalah "unelse", yang pada dasarnya akan melakukan hal-hal dalam kasus-kasus di mana yang terakhir elsetidak menyala. Melihatnya dari sudut itu, saya akan menyarankan bahwa seseorang dapat mencapai hasil yang serupa melalui:

  melakukan
  {
    jika (kondisi1)
      ... barang hanya untuk kondisi1
    lain jika (kondisi2)
      ... barang hanya untuk kondisi2
    lain
    {
      ... barang tanpa syarat
      istirahat;
    }
    ... barang untuk kedua kondisi
  } while (0); // Titik kelanjutan untuk istirahat

Pilihan lain dalam beberapa kasus adalah:

  if ((condition1 && (action1,1)) ||
       (condition2 && (action2,1)) ||
       (action_for_neither, 0))
    action_for_either;

Tampak agak jahat, tetapi dalam beberapa kasus mungkin tidak ada cara yang baik untuk mengekspresikan urutan peristiwa yang diinginkan selain menduplikasi kode atau menggunakan goto(yang mungkin tidak terlalu buruk, kecuali untuk kartun yang seseorang dapat masukkan di sini).

supercat
sumber