Fork me on GitHub
#clojure-russia
<
2015-12-23
>
rm06:12:05

утра! А поясните за кодстайл. Я видел не раз, как умные люди пишут на кложе функции по 30-50 строк (привет @nicola https://github.com/niquola/route-map/blob/master/src/route_map/core.cljc#L23-L49), в результате чего их сложно читать. В уютном руби я точно знал, что от такого нужно воротить нос, а тут я в замешательстве.

niquola07:12:01

А в чем вопрос? ;)

rm07:12:44

вопрос: это нормально писать такие длинные функции?

niquola07:12:09

Можно наверно разбить ;)

niquola07:12:31

Попробую на досуге

rm07:12:53

окей

rm07:12:00

ну хорошо, шаблон не треснул

artemyarulin07:12:15

хм, тоже грешен - пишу большие функции и только когда вижу что могу что-то переиспользовать то выношу в отдельные функции и начиню шарить. Типа не канонично? Надо все мелкими делать сразу?

artemyarulin07:12:17

просто чем отличается в итоге

[let (f1 (fn…)
         f2 (fn….)
   …]
;; от
(defn f1 …)
(defn f2 … )

…

artemyarulin07:12:09

тестировать в репле одна фигня, тока разве что тест написать будет проще для ф1 ф2

shinych10:12:42

еще вопрос по стилю: есть ли какой-то выработанный канон по форматированию кода в лиспах? прежде всего интересует идентация и рекомендации по переносу строки

larhat11:12:02

@shinych: а какой редактор? emacs со smartparens сам как-то переносит и отступы делает, так что я о таком не думаю

larhat11:12:23

@rm а как бы ты разбил эту функцию и зачем?

rm11:12:46

затем, что ее трудно читать

larhat11:12:01

кмк, если функция логически целостна и делает одно дело, её не надо разбивать, а молиться на "короткие функции" — это религия какая-то

larhat11:12:11

@rm было бы трудно читать три функции по 15 строк, не?

larhat11:12:22

тебе же всё равно все надо прочитать, чтобы понять, что происходит

rm11:12:44

нет не надо

larhat11:12:49

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

rm11:12:18

какому количеству строк

rm11:12:25

я не понимаю, что она делает

larhat11:12:33

> функции по 30-50 строк

rm11:12:29

ну блядь, если ты напишешь 30 строк, ты автоматически сунешь туда столько действий, что их не охватить сразу

rm11:12:49

тут можно материться, кстати?

konukhov11:12:20

а мне кажется (в том числе и по поводу руби), что если у тебя эта функция делает одну вещь, и это не нужно в других местах, то можно и в 20 строк написать. 50 конечно перебор, но когда у тебя куча мелких методов – тоже читать тяжело. зависит от конкретной ситуации, короче.

konukhov11:12:47

в руби вон модно классы с одним методом call плодить. это модно, но не нормально, я считаю.

konukhov11:12:00

из одной-двух строчек

shinych11:12:31

@larhat: в том-то и проблема, что редакторы в команде разные; кое у кого вообще редактор без идентатора автоматического. меня вполне устраивает, как курсив переносит, подумалось, что в emacs должно быть очень так же ) может есть где формальное описание

konukhov11:12:52

@shinych: а ты смотрел стайлгайды всякие? https://google.github.io/styleguide/lispguide.xml#Formatting

konukhov11:12:05

хотя я не сравнивал, там может разные вещи в них говорятся simple_smile

shinych11:12:54

ага, спасибо. а что за статус у этого стайлгайда, насколько он авторитетен? )

prepor11:12:11

> кмк, если функция логически целостна и делает одно дело, её не надо разбивать, а молиться на "короткие функции" — это религия какая-то Ромочка дело говорит вообще, в упомянутом руби просто религиозные фанатики повсюду с говнокодом

prepor11:12:41

shinych: это автор cider. правила индентации cursive полностью соответствуют правилам clojure-mode. так что это просто стандарт де-факто

shinych11:12:46

о! то, что хотел знать

artemyarulin11:12:46

никто не смотрел - в теории advanced compilation должно ускорять ClojureScript так ведь?

prepor12:12:28

artemyarulin: нет, не должно.

artemyarulin12:12:07

хм, он Google Closure ведь многое инлайнит не?

prepor12:12:06

artemyarulin: сорянчик, про инлайнинг не знал. тогда вообще может и ускорить, но я что-то сомневаюсь что как-то заметно. в8 и так инлайнит.

prepor12:12:40

ну и необдуманный инлайнинг может приводить не к ускорению, а замедлению в целом )

artemyarulin12:12:12

угу, я погуглил - где он быстрее делает, где наоборот замедляет. В общем не должен эффектить походу

shinych12:12:50

А кинь ссылок что нагуглил

artemyarulin12:12:51

хоть ответу и 5 лет

artemyarulin13:12:24

а зачем это может понадобится?

larhat13:12:57

коленка если болит

larhat13:12:51

@shinych: def объявит же в неймспейсе, и получится, что функция у тебя с диким сайд-эффектом

shinych14:12:35

ага, а если этот дикий сайд-эффект как раз нужен?

shinych14:12:22

у нас такое делается в самом старте приложения (cljs), там, где файловая система инициализируется

abtv14:12:08

А если нужен сайд эффект, то используйте - из всех правил есть исключения.

abtv14:12:34

В основном правила нужны, чтобы не отстрелить себе ногу

artemyarulin14:12:30

ха, получается у вас тут mutable по сути но без атома, не думал раньше о таком применении simple_smile

abtv14:12:19

Не, заместо атома не надо simple_smile

artemyarulin14:12:24

никто не подскажет - сделал я brew install boot-clj, все ок. Запускаю boot -h пишет Please download latest Boot binary: wtf?

artemyarulin14:12:44

вродь все как в туториале

abtv14:12:52

Но, вообще, попахивает

artemyarulin14:12:48

о, пойду в канале бута спрошу, забыл что он есть

konukhov14:12:53

тебе может env’ов не хватает? BOOT_HOME, например

artemyarulin14:12:07

@konukhov: о спасибо, странно что в официальном гайде ничо нету про это

konukhov14:12:28

раньше вроде было, я по инструкции все делал

konukhov14:12:30

помогло что ли?

artemyarulin14:12:09

неа, не пробовал пока. Перечитываю ридми - мож я чо пропустил

konukhov14:12:32

я пальцем в небо, сейчас думаю, что в другом проблема. про энвы тут https://github.com/boot-clj/boot/wiki/Configuring-Boot

artemyarulin14:12:17

omg, с лейном проще блин simple_smile

konukhov14:12:26

вообще, boot приятней, но я изрядно с ним проковырялся, когда, мне, например, надо было в зависимости от дева/прода, разные ресурсы подрубать.

rm14:12:17

я ни разу не понял, чем он приятнее

konukhov14:12:38

там суть была в том, что нужно было сначала подрубить ресурсы и тд, а потом руками риквайрить сам апп уже типа такого `

konukhov14:12:44

(deftask require-app!
  []
  (require '[billing-api.core])
  identity)

(deftask setup-dev-mode
  []
  (with-pre-wrap fileset
    (set-env! :resource-paths #{"dev/resources" "resources"})
    (environ :dev-mode true)
    (require-app!)
    fileset))

konukhov14:12:38

тем, что вместо огромного хэш-мепа, ты пишешь функции, что в целом гибче намного

konukhov14:12:45

больше контроля, все дела

konukhov14:12:50

но не без минусов

konukhov14:12:56

и он медленней еще, по идее

konukhov14:12:31

ну и эти его immutable файлсеты – очень крутая тема тоже.

artemyarulin14:12:53

идея бута мне конечно больше нравиться - функции, а не декларации как в лейне, гибче да. Кста у меня все починилось апдейтом brew с последующим адейтом буута, видать старая версия просто была

artemyarulin16:12:34

блин тока счас узнал про deps.cljs (https://github.com/clojure/clojurescript/wiki/Packaging-Foreign-Dependencies) через него например все cljsjs пакеты работают

artemyarulin17:12:13

да, но я подумал это магия этого cljsjs, а оказыветься этой фиче сто лет в обед. http://static.fjcdn.com/comments/But+heil+hitler+_bf16609affcf0302b5988091c036593c.jpg

ul20:12:13

re: форматирование: мы в команде используем https://github.com/weavejester/cljfmt/

ul20:12:28

не потому, что там самое правильное форматирование, а потому что просто и унифицированно

ul20:12:42

с учётом того, что у всех могут быть разные редакторы

ul20:12:08

перед коммитом выполнил lein cljfmt и всё

ul20:12:19

не думать о форматировании вообще полезно

ul20:12:28

много сил освобождается на полезные дела

ul20:12:01

ещё есть альтернативный взгляд на форматирование от Нолена — тупо делать отступ в два пробела

ul20:12:08

тоже унифицированно и не надо думать

ul20:12:13

(хотя тут разговор про другие аспекты стиля шёл, прошу прощения, просканировал слишком быстро)

rm22:12:40

чота я туплю. Есть последовательность [0 0 0 1 2 32 21] . Как найти первый ненулевой элемент, не делая reduce и не перебирая все значения?

larhat22:12:31

drop-while

rm22:12:07

хм.. а его индекс?

larhat22:12:55

(first (drop-while #(= 0 (last %)) (map-indexed #(list %1 %2) x))) или как-нибудь так