Що ви думаєте про цей новий синтаксис if-then [закритий]


11

Я просто думав про те, що було б дійсно крутим, щоб я мав у своєму контролі if-elif-else.


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

Таким чином, в основному then, запуск буде виконуватися, коли будь-яка з умов виконується ЗА ВСЕ, крім іншої умови Ви вважаєте, що це корисно? Це схоже на спробу, за винятком іншого, python.

Я думаю, що дехто з вас забирає дуже попередню реалізацію. thenБлок буде так само , як elseблок в try-exceptблоці в пітона. Справжня причина, яку я припускаю, полягає в таких ситуаціях.


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

thenБлок поширюється до першої , якщо так само , як elseє. Тож гніздування працює чудово. І якщо вам потрібно запустити метод перед операторами if, це дійсно не має нічого спільного з цим випадком використання.


наскільки це може бути вкладене?
aggietech

6
+1 за роздуми поза межами, але я б не голосував за те, щоб реально його втілити. Дивіться мою відповідь, чому нижче.
Wonko the Sane

1
Тож "тоді" діє, як finallyу Java?
Алекс Фейнман

1
Я вважаю thenтрохи заплутаною. Зазвичай thenмає на увазі виникнення після if. Я маю на увазі, ви говорите, if condition, then stuff()але тоді продовжуйте говоритиthen stuff that applies to both
Метт Оленік

2
+1 для цікавої думки, але я погоджуюсь з відповідями, які подають це під Bad Idea. Це просто не інтуїтивно, і я міг бачити, як це дійсно відключає деякі кодери.
BlairHippo

Відповіді:


17

Я думаю, це виглядає жахливо. Якщо ви хочете, щоб код запускався після різних умов, то або (a) перевірте ці умови, або (b) встановіть змінну на вказаний статус успіху.


2
Я згоден - дуже важко зрозуміти, що це означає, без пояснень, таких, як ти дав.
tcrosley

Чому потрібно пояснити, як щось працює занадто багато, щоб очікувати?
Falmarri

5
Тому що це робить код важче читати.
Ансан

Я не дуже впевнений, що це справедливо. Кожна конструкція в коді повинна бути пояснена один раз.
Маг

14

Як правило, ви вже можете це зробити за допомогою перемикача / корпусу, і перемикач / кейс забезпечує більш точний налаштування контролю над тим, що ви пропонуєте.

Він також логічно не читається. Якщо інше, якщо B, то C. Не означає комусь, що C буде виконано, якщо або A, або B оцінюють як істинне.


2
У Python немає тверджень про перемикач / випадок
Falmarri

2
Я не думаю, що питання було сформульовано безпосередньо у відповіді лише на Python, але якщо це був намір, будь ласка, позначте як Python.
Брайан Р. Бонді

Ну, це прямо не сформульовано до пітона. Приклад був у python. Але якщо ваша відповідь на те, чому це не потрібно, "є заяви про перемикання", а у python таких немає.
Фальмарі

1
@Falmarri: Досить справедливо, тому я гадаю, що моя відповідь на це полягатиме в тому, що Python краще підтримати класичні заяви переключення.
Брайан Р. Бонді

код у питанні в Python не означає, що питання стосується Python, оскільки це може бути і псевдокодом. Якщо мова йде лише про Python, то його слід позначати як таке
phuclv

8

Цікаве, але мені здається (правда, дещо задане моїми способами) запрошення щодо проблем з читанністю, логікою та синтаксисом.

Редагувати: Ваш if-elif дуже простий - що робити, якщо було 10 elifs? 20? Чи всі умови повинні бути правдивими? Які шанси на це?
Ваш if-elif дуже простий - що робити, якщо було 10 elifs? 20? Хіба це не зробить це досить нечитабельним?

Крім того, це може бути легко досягнуто перевіреною усталеною методологією:

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

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

Що станеться, якщо "stuff_that_applies_to_both" має відбутися перед окремими кроками? Ваш код не обробляє цей випадок:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

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

Нарешті, цей синтаксис дозволяє досягти більшої гнучкості при більшій кількості умов: if (thisCondition або thatCondition або 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();
}

Я використовував if / else, але міг так само легко використовувати оператор перемикання з прапором:

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

Зауважте, що мені насправді не потрібен прапор conditionApplies - я міг би додати функцію "stuff_that_applies_to_both ()" до обох умов, що не знаходяться за замовчуванням - я це робив так, що це більше нагадує синтаксис, визначений вище, хоч "тоді" а не "інше".

Тому мені здається дуже спеціалізованим синтаксисом, де більш загальний синтаксис заповнює рахунок і багато іншого.

+1 для роздуму над можливою функцією (продовжуйте робити це!), Але я б не голосував за її реалізацію.


1
+1 за "перевірену і правдиву усталену методологію" - якщо є розумне рішення проблеми, зазвичай краще використовувати її :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Це неможливо. лише 1 еліф може бути правдивим, оскільки він перестає оцінювати більше.
Falmarri

Моя помилка - я читав це як "і", коли ти мав на увазі "чи". Однак я стою біля своєї відповіді - я оновлю її від того, на що ви вказали.
Wonko the Sane

Ви дійсно вважаєте, що синтаксис, який ви тут розмістили, зрозуміліший, ніж я запропонував? Ви не тільки перевіряєте свої умови двічі, але і гніздування завжди краще, ніж гніздування
Falmarri

1
Як і ваші, якщо ваше "тоді" справді не застосовується до всіх умов, що, коли ви додаєте все більше і більше їх, стає все менш імовірним. І особисто, виходячи з фону C / C ++ / C #, я вважаю, що гніздування є дещо менш заплутаним, ніж розділений синтаксис (тобто робити щось тут у "якщо" чи, можливо, "elsif", а потім робити стрибки вниз і щось робити інше в "тоді". Я особисто вважаю синтаксис більш зрозумілим, щоб усі умови були разом. Можливо, це не так, але це більш усталене поняття в моєму повсякденному світі
Wonko the Sane

2

Я б не проти використовувати собі щось подібне сьогодні. Але, щоб бути впевненим, я б використовував його приблизно так часто, як і повторення, поки не використовую.

Код принаймні виглядав би краще без зайвого гніздування. Хоча я вважаю Else Ifза краще elif. Я б замінити Thenз Doі остаточним Elseз Otherwise.


Добре поговоріть із творцями пітона, а не я =]
Фальмарі

О, я думав, ви розробляєте нову мову. Я просто пропонував зміни назви бути точнішими, залиште elif, якщо хочете, але останнє ще здається, що воно повинно відрізнятися від звичайного іншого.
Пітер Тернер

Ну, це не обов'язково для нової мови, але це не обов'язково і для python. Просто нова ідея для синтаксичного правила загалом. Це можна застосувати до будь-якої мови із відносно невеликими побічними ефектами.
Falmarri

0

Це здається крутою ідеєю. Однак єдина проблема, яку я собі уявляю, - це ти більше схильний до помилок. Як, наприклад, записати if / else if і викликати blah (). Написання додаткового іншого, якщо цього не хочеться, вилучивши благ з того часу і додавши його до своїх ifs / elseifs. Тоді, коли ви чи інший програміст додасте ще одне твердження, ви можете очікувати виклику бла, але ні.

Або ви можете мати декілька ifs, написати благ і забути всі ifs, але потрібно один, який би щось порушив. Також є ймовірність, якщо вам потрібно, щоб вони дотримувались кожного, якщо ви поставите його під блок if. Можливо, встановіть bool в else (NoUpdate = true) і просто напишіть if (! NoUpdate) {} прямо під яким ясніше і може бути встановлено символом if

Я просто кажу, що здається більш схильним до помилок, не те, що мені не подобається ідея. Я не хотів би бачити це мовою, але я не можу уявити будь-яку ситуацію, де я би використовував його, якщо моя мова це підтримує.


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 ifЦе ТОЧНО, що це повинно запобігти. У цьому вся суть заяви Еліфа. Еліф теж не потрібен, його можна перевірити, якщо заяви, але це ускладнюється.
Falmarri

0

Я вважаю ваш синтаксис заплутаним, але я бачу деяку цінність у концепції. Концептуально, коли я розглядав це питання, те, що я вважав, що хочу, - це "неправе", яке в основному виконувало б справи у випадках, коли останні elseне стріляли . Дивлячись на це з цього кута, я б припустив, що можна досягти подібного результату через:

  робити
  {
    якщо (умова1)
      ... тільки для умови1
    інше, якщо (умова2)
      ... матеріал тільки для condition2
    ще
    {
      ... речі для жодної умови
      перерва;
    }
    ... речі для обох умов
  } while (0); // Точка продовження перерви

Іншим варіантом може бути:

  if ((умова1 && (action1,1)) ||
       (умова2 && (дія2,1)) ||
       (action_for_neither, 0))
    action_for_either;

Трохи неприємно виглядає, але в деяких випадках може не бути жодного хорошого способу виразити бажану послідовність подій, крім дублювання коду чи використання goto(що може бути не так вже й погано, за винятком мультфільму, який хтось може вставити сюди).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.