1

Тема: Яка різниця??

Є конструкція if/else. Навіщо придумувати конструкцію try/catch?? Яка між ними різниця??

Звичайнісінький електрик, як наприклад, Лех Валенса.

2

Re: Яка різниця??

Гуглиться ж ізі)
https://habrahabr.ru/post/21376/

Тут мала би бути якась влучна фраза(вибачте, що витратив кілька секунд вашого часу на прочитання).
Подякували: Master_Sergius, 221VOLT, ostap34PHP, leofun014

3

Re: Яка різниця??

if/else - розгалуження
try/catch - обробка виключень

Подякували: koala, ostap34PHP, leofun013

4

Re: Яка різниця??

elektryk написав:

Є конструкція if/else. Навіщо придумувати конструкцію try/catch?? Яка між ними різниця??

Це якийсь дуже тонкий тролінг?

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/
Подякували: /KIT\, koala, ostap34PHP, bvn, FakiNyan, 221VOLT, leofun017

5

Re: Яка різниця??

try...catch використовується для обробки помилок, if...else просто для виконування якоїсь дії, якщо щось дійсне...

coderhero.win - ІТ, програмування, новини, уроки, статті
Подякували: 221VOLT, ostap34PHP2

6

Re: Яка різниця??

DOP написав:

Гуглиться ж ізі)
https://habrahabr.ru/post/21376/

А без Росії не впораєтеся? http://replace.org.ua/topic/4376/

Подякували: bvn, FakiNyan, 221VOLT, ostap34PHP, leofun015

7

Re: Яка різниця??

elektryk
Навіщо вам ноги, коли руки маєте?

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: ostap34PHP, bvn, koala, 221VOLT, leofun015

8

Re: Яка різниця??

найближчий родич is/else це

switch(expression) {
    case n:
        code block
        break;
    case n:
        code block
        break;
    default:
        code block
} 

от без цієї конструкції можна обійтися, використовуючи if/else
в python так і зробили

Подякували: Monolith, 221VOLT2

9

Re: Яка різниця??

ping написав:

найближчий родич is/else це

switch(expression) {
    case n:
        code block
        break;
    case n:
        code block
        break;
    default:
        code block
} 

от без цієї конструкції можна обійтися, використовуючи if/else
в python так і зробили

Прихований текст
Не запутуйте його ще більше! *STOP*
...
Подякували: 221VOLT, Monolith, ostap34PHP3

10 Востаннє редагувалося elektryk (05.08.2017 20:56:13)

Re: Яка різниця??

0xDADA11C7 написав:

elektryk  Навіщо вам ноги, коли руки маєте?

Ви правий. Ось освою ДжавуСкріпт і доведу, що можна конструкцією if/else замінити try/catch, а тим більше тернарний оператор.

Звичайнісінький електрик, як наприклад, Лех Валенса.

11

Re: Яка різниця??

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

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...
Подякували: LoganRoss, leofun012

12

Re: Яка різниця??

тернарний оператор можна замінити, але навіщо? він мені вдвічі скорочує код

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: LoganRoss, ReAl, leofun013

13

Re: Яка різниця??

0xDADA11C7 написав:

тернарний оператор можна замінити, але навіщо? він мені вдвічі скорочує код

Гаразд, хай живе.

Звичайнісінький електрик, як наприклад, Лех Валенса.
Подякували: 0xDADA11C71

14

Re: Яка різниця??

ping написав:

найближчий родич is/else це

switch(expression) {
    case n:
        code block
        break;
    case n:
        code block
        break;
    default:
        code block
} 

от без цієї конструкції можна обійтися, використовуючи if/else
в python так і зробили

Хай ця конструкція буде. Вона корисна. В моїй практиці був випадок коли цих кейсів більше десятка. Замахаєшся замінювати їх іфами. Та й вийде якась потвора.

Звичайнісінький електрик, як наприклад, Лех Валенса.
Подякували: 0xDADA11C71

15 Востаннє редагувалося ReAl (07.08.2017 00:05:55)

Re: Яка різниця??

elektryk написав:

Хай ця конструкція буде. Вона корисна. В моїй практиці був випадок коли цих кейсів більше десятка. Замахаєшся замінювати їх іфами. Та й вийде якась потвора.

Отожбо. А якщо додати, що компілятор при оптимізації великий switch балансує або взагалі табличним робить (якщо мітки підряд), то це ще швидкість підінмає.
Також важливо, що switch оцінює аргумент один раз, для volatile-аргумента (регістр периферії, може щось міжпоточне) у випадку ланцюжка if/else if/… треба у тимчасову змінну спочатку записати.

Я вже не кажу про protothreads, там без switch взагалі ніяк (крім адрес міток в gcc).

p.s. У до-С-шні часи тернарний оператор

 a =  (b ? sin : cos)(c);

виглядав так

 a := if b then sin else cos fi (c);

Ну, він був не зовсім тернарний, бо elif можна було ставити :-)
Покористуватися не вийшло, на лабах був лише алгол-60, 68-го не було, а пізніше вже паскаль/С під рукою були :)

printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");

16

Re: Яка різниця??

elektryk, не могли б ви хоча б коротко описати й показати в яких саме випадках можна зробити одне й теж за допомогою if/else та try/catch?

Ви знаєте переклад цих ключових слів з англійської? Якщо буквально перекласти ці слова на українську, то if/else виглядатиме приблизно так:

якщо (одне === іншому) {
  // виконати якусь дію в цьому блоці
} інакше {
  // виконати іншу дію
}

а try/catch так:

спробувати {
  // виконати якусь дію в цьому блоці
} зловити (помилку){
  консоль.записати(помилку)
}

Стосовно заміни в JavaScript switch/case на if/else, то до недавнього часу я завжди використовував if/else, до поки мені не прийшлось працювати в команді розробників і миритись з особливостями написання ними коду. Я побачив де можна дійсно зручніше використовувати switch/case:

// Setting availability of software groups.
switch (detail.DownloadType) {
    case DownloadType.Undefined:
        break;
    case DownloadType.Core:
    case DownloadType.Agent:
    case DownloadType.OfflineLinuxAgent:
        this.hasApplications = true;
        break;
    case DownloadType.LocalMountUtility:
    case DownloadType.DocRetrieverForSharePoint:
    case DownloadType.LinuxLiveDVD:
    case DownloadType.ApplianceRUU:
        this.hasUtilities = true;
        break;
    case DownloadType.AddOnForKaseya:
    case DownloadType.DataProtectionPlugin:
        this.hasPlugins = true;
        break;
    case DownloadType.AzureReplicationTargetUpdater:
        this.hasScripts = true;
        break;
}

Тобто switch/case зручно використовувати, коли є декілька варіантів умови для одного блоку.

Подякували: 0xDADA11C7, ostap34PHP2

17

Re: Яка різниця??

Порада: якщо кілька варіантів case роблять одне й те саме, або ж доповнюють одне одного

Прихований текст

case A:
    smth=true;
case B:
    smth_else = true;
    break;

то дуже бажано дописувати щось на кшталт fallthrough в коментар:

case A:
    smth=true;
case B: //fallthrough - тут продовжується попередній код!
case C: //fallthrough
    smth_else = true;
    break;
case D: 
    smth_other = false;
    break;

Випадки B і C пропускають потік виконання крізь себе, тому потребують позначок. Інакше можна такого наваяти при змінах...
Ну і поліморфізм замінює собою switch-case, якщо має сенс створювати окремі класи прототипи для цих DownloadType.

Подякували: LoganRoss1

18

Re: Яка різниця??

Ось такий код не пропускає TypeScript:

case A:
    smth=true;
case B: //fallthrough - тут продовжується попередній код!
case C: //fallthrough
    smth_else = true;
    break;
case D: 
    smth_other = false;
    break;

Погоджуюсь, що тут дуже легко заплутатись, я б такого точно не написав.

Стосовно поліморфізму, яким можна замінити switch-case, то я щось сходу так і не уявив що мається на увазі.

Уточнення: у моєму прикладі вище, код написано на TypeScript, а DownloadType має тип enum.

19

Re: Яка різниця??

elektryk написав:

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

В моїй практиці за таке руки відбивали  :D
Не треба так.

Подякували: Monolith, ostap34PHP, leofun013