@proelixir

Страница 893 из 1045
Alex
03.03.2018
04:14:40
вот case заставляет продумывать и ЗАПИСЫВАТЬ все варианты развития событий даже если они тупы е и на первый взгляд излишни, но в долгую такая практика дает более предсказзуемые результаты

Alex
03.03.2018
05:41:12
А вот это уже реальный перегиб
почему? в других языках советуют даже писать if (cond) { полезное действие } else { // сюда мы не попадем никогда или printf() или throw HOW??? } на а когда в Elixir есть case и cond которые ругнуться если ты забыли указать все варианты, то выбор очевиден

if же это макрос в Elixir, иногда мне кажется его затянули туда чтобы у новичков не было слома парадигмы

Google
Alex
03.03.2018
05:48:02
к тому же когда я виду case в чужом коде, то первое что мне приходит в голову, что тут будут указаны все варинаты развития событий - явно. они там будут записаны и мне не придется фантазировать на тему "а что если"

Alexey
03.03.2018
06:10:52
Зчем if, когда есть pattern matching =)

abc
03.03.2018
06:54:33
Dmitry
03.03.2018
06:56:53
Я думаю что if имеет смысл только в однострочниках без else

Говорить о том, что case матчи все - не приходится, тут не Rust

Но мне просто if визуально не нравится

А ещё он заставляет от декларативного «сравни что-то с паттерном» переходить к императивному «а вот если это равно тому то»

Поэтому cond такое же фуфло

?
03.03.2018
07:01:04
Ой я тут поздно вкатился. &&...|| это тоже самое, что и иф?

Evgeny
03.03.2018
07:12:08
почему? в других языках советуют даже писать if (cond) { полезное действие } else { // сюда мы не попадем никогда или printf() или throw HOW??? } на а когда в Elixir есть case и cond которые ругнуться если ты забыли указать все варианты, то выбор очевиден
Где такое советуют? В императивных языках if без else встречается часто: void foo(Bar bar) { if(bar is null) bar = new Bar(1234); do_work(bar); ... if(something) return; ... } А в эликсире можно в императив.

Alex
03.03.2018
07:18:10
Где такое советуют? В императивных языках if без else встречается часто: void foo(Bar bar) { if(bar is null) bar = new Bar(1234); do_work(bar); ... if(something) return; ... } А в эликсире можно в императив.
была такая статься про такие "мелочи" с if и не только, искал но не нашел, но я в общем то полностью согласен с ее автором. там в качестве подопытного кролика выступал python, но принципы то везде одинаковы ну и что с того что встречается часто ? ))))

Alexey
03.03.2018
07:21:25
В хаскеле if без else нельзя использовать

Google
Alexey
03.03.2018
07:24:50
Как тут говорили if без else это неявно. Я поддерживаю.

Alex
03.03.2018
07:27:50
и похрен что текста больше

Evgeny
03.03.2018
07:29:41
if в эликрсире, скорее всего из руби приползло

Alex
03.03.2018
07:30:56
Это абберация от ФП. Никто так не пишет в императивных языках.
ну там надо принуждать себя всегда писать else

Alex
03.03.2018
07:45:51
Это абберация от ФП. Никто так не пишет в императивных языках.
ты лично знаешь всех кто пишет на императивных языках? ))))

Evgeny
03.03.2018
07:57:48
Да

Все кто пишут иначе не програмируют на императивных языках. Они только думают, что программируют на императивных языках.

Zwei
03.03.2018
08:08:09
В погоне за явностью так можно не только до if'а докопаться

Всегда же будет что-то сокрыто ради удобства

Скрытый else блок по-моему довольно безобидная неявность ещё

Evgeny
03.03.2018
08:14:36
Ага. А в целом это попахивает Специальной Олимпиадой.

Dmitry
03.03.2018
08:31:49
В плане cond, он имеет значение в таких случаях: cond do closes_tag?(rest_hd, needed_hd) -> do1(...) opens_tag?(rest_hd) -> do2(...) true -> do3(...) end # Альтернативы:... кхм if closes_tag?(rest_hd, needed_hd) do do1(...) else if opens_tag?(rest_hd) do do1(...) else do3(...) end end case closes_tag?(rest_hd, needed_hd) do true -> do1(...) false -> case opens_tag?(rest_hd) do true -> do2(...) false -> do3(...) end end

Когда есть 2 или более различных условиях, которые не описываются через match, тогда переписать без cond do - это либо портянка из if, либо портянка из case-ов будет вместо одного очень понятного cond.

В общем, как и в случае с if: не представляю кому приятно будет читать и писать (видимо из принципа) портянку из вложенных if-ов в elixir-е или case-ов вместо одного более понятного и не вложенного cond-а. Тоже самое и с Erlang-овским if - его стоит избегать, когда можно переписать и без него, но вот чисто из принципа, даже если с ним код будет намного проще для чтения, сомнительная практика. Имхо.

Evgeny
03.03.2018
08:48:26
Чисто из принципа - это всегда плохо. Фанатики - идут лесом.

Google
Никита
03.03.2018
08:50:05
Да ну вчера был дан исчерпывающий ответ почему иф это плохо) потому что это тупо макрос к case.

Dmitry
03.03.2018
08:50:45
@Nekifirus Elixir - как язык состоит из множества макросов.

Из-за стоит отказаться от всех макросов и писать на true SpecialForms?

Никита
03.03.2018
08:51:15
Ну да) просто с ифом действительно кейз лучше)

Dmitry
03.03.2018
08:51:25
Я не согласен с этим "ответ-ом"

Никита
03.03.2018
08:52:51
так то по барабану. на ифе 3 строчки, на кейз 4, где последняя строчка end)

Dmitry
03.03.2018
08:56:39
Я приводил случаи вчера, где if - одна строчка, а всё остальное (включая case-а - 4).

Никита
03.03.2018
08:58:45
Чо та второй день выясняем уже это))))

давайте лучше обсудим - хороший код это когда при взгляде сразу понимаешь что он делает, или это когда ты в одну функцию 2 часа смотришь, обнимая бутылку самогонки?

Alex
03.03.2018
09:01:45
Чисто из принципа - это всегда плохо. Фанатики - идут лесом.
так кто сказал что из принципа, я и сам пишу if и иногда без case ?, просто неявности заставляют других программистов развивать экстрасенсорные способности по чтению чужих мыслей, а оно нам надо?

пардон телепатических

Dmitry
03.03.2018
09:37:55
Неэффективно, потому что он все 10 расчитает вместо того, чтобы по порядку необходимости.

Dmitry
03.03.2018
09:38:45
Если есть вычисления - разбивается на функции

Не более одной хоть какой либо тяжелой операции за функцию - и все

А вот если надо к примеру взять пару значений из нескольких структур - да вообще насрать на то, что это делается не лениво

Зато наглядно

Если такое станет ботлнеком - надо уже на ассемблере программу предписывать, и никакой cond не спасёт

Dmitry
03.03.2018
09:43:34
Разбивать на функции (или создавать вложенность - в виде case-ов или функций) вместо одного наглядного cond?

Dmitry
03.03.2018
09:47:47
Cond не наглядный

Google
Buckler
03.03.2018
09:48:32
Hello, Лакки! Please, calculate: 20+64=... If you don't answer - you'll get banned from the channel... Good luck!

Dmitry
03.03.2018
09:54:58
Cond не наглядный
Как по мне...

Nikolay
03.03.2018
11:05:04
вчера с Никитой (Соболевым) разговаривал, он сказал у них credo настроен что бы ругалось, если в коде юзают if-ы)

Evgeny
03.03.2018
11:14:58
Alex
03.03.2018
12:04:52
Ну а какая тут неявность? if(bar is null) bar = new Bar(1234); Никакой телепатии тут не нужно.
if (bar is null) { bar = new Bar(123); } else { // переданный в функцию указатель должен быть null, иначе оставляем его как есть тк в случае перезаписи мы должны будем подестроить старый объект // а это делается в другом месте } if (bar is null) { bar = new Bar(123); } else { // это основной кейс, в противном случае создаем заглушку } if (bar is null) { bar = new Bar(123); } else { // это условие находится здесь, чтобы не проверять bar на null каждый раз перед вызовом этой функции }

ну и такой код легко рефакторить

Evgeny
03.03.2018
12:14:14
Долго пришлось думать, чтобы придумать эти "неявности"? Все гораздо проще: если объект не создан, создаем новый.

Интерфейс функции задокументирован, что там внутри - это дело самой функции и комментариев внутри нее

Alex
03.03.2018
12:15:59
Долго пришлось думать, чтобы придумать эти "неявности"? Все гораздо проще: если объект не создан, создаем новый.
почему не создан? почему можно создать его здесь? это нормально или хак? можно ли перенести это создание в другое место?

откуда взялись параметры и тд.

Никита
03.03.2018
12:16:43
ну для этого паттернг-матчинг же есть def func(bar) when bar is integer do def func(bar) when is_nil(bar) do def func(_) do

Alex
03.03.2018
12:16:55
дооолгооо)))

Evgeny
03.03.2018
12:17:22
почему не создан? почему можно создать его здесь? это нормально или хак? можно ли перенести это создание в другое место?
Ну дык на эти вопросы и код с else не ответит. Для этого комментарии придуманы. Так то.

паттерн-матчинг там редко встретишь

Alex
03.03.2018
12:18:01
если в коде if все явно написано то остается смысловая неявность и ее надо разрешать по месту

Evgeny
03.03.2018
12:18:51
комментарии надо писать по месту
ага, дык еще раз повторяю, код c else в данном случае ничего не прояснит, все равно придется писать комментарии если сильно нужно

Alex
03.03.2018
12:20:01
ага, дык еще раз повторяю, код c else в данном случае ничего не прояснит, все равно придется писать комментарии если сильно нужно
так прояснит или нет это зависит от умения писать комментарии и их писать надо в том месте где есть неявность

Google
Alex
03.03.2018
12:21:40
ага, дык еще раз повторяю, код c else в данном случае ничего не прояснит, все равно придется писать комментарии если сильно нужно
и потом что значит "сильно нужно" ? если кроме тебя код никто никогда читать не будет то и не пиши вообще ничего

код всегда пишется для других программистов

Evgeny
03.03.2018
12:22:39
и потом что значит "сильно нужно" ? если кроме тебя код никто никогда читать не будет то и не пиши вообще ничего
Это значит насколько код понятен. Требует ли он пояснения или и так все понятно любому. Вы же не комментируете каждую строчку в программе?

x = x + 2; // прибавляем к x 2

Alex
03.03.2018
12:23:14
код прозрачен
не прозрачен я и понятия не имею почему в данном месте объект мб null и почем мы можем создать его внутри когда он приходит снаружи. он еще по ходу где то создает и может не в одном месте ))

Alex
03.03.2018
12:24:39
документация к самой функции поможет
документация к функции не должна описывать что у нее там в дебрях хак на хаке хаком погоняет

x = x + 2; // прибавляем к x 2
ну перегибать то не надо

Evgeny
03.03.2018
12:25:45
И так, повторяю: допустим я вставлю else, и что сразу все станет ясно?

Alex
03.03.2018
12:26:13
допустим я вставлю else, и что сразу все станет ясно?
конечно, и комментарий напиши хотя бы // не беспокойся я обо всем позаботился

очевидно же что пустой else проблемы не решает

или не очевидно?

Evgeny
03.03.2018
12:28:41
Хех. Ну и какую доп инфу дает код void foo(Bar bar) { if(bar is null) do_work(new Bar()); else do_work(bar); } по сравнению с void foo(Bar bar) { if(bar is null) bar = new Bar(); do_work(bar); } ?

Страница 893 из 1045