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

Артем
03.03.2018
05:31:08

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 =)

Артем
03.03.2018
06:53:25

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

Alex
03.03.2018
07:18:10

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

Evgeny
03.03.2018
07:31:36

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
Ага. А в целом это попахивает Специальной Олимпиадой.

Alex
03.03.2018
08:29:33


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
пардон телепатических

Dmitry
03.03.2018
09:37:11

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

Evgeny
03.03.2018
10:37:50

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
паттерн-матчинг там редко встретишь

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

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

Alex
03.03.2018
12:20:01

Google

Evgeny
03.03.2018
12:20:01
код прозрачен

Alex
03.03.2018
12:21:40
код всегда пишется для других программистов

Evgeny
03.03.2018
12:22:39
x = x + 2; // прибавляем к x 2

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

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

Alex
03.03.2018
12:24:39

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

Alex
03.03.2018
12:26:13
очевидно же что пустой 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);
}
?

Alex
03.03.2018
12:30:03