Size: a a a

Clojure — русскоговорящее сообщество

2020 October 31

CD

Camina Drummer in Clojure — русскоговорящее сообщество
Композиция наше всё
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Sergey Bronnikov
Вот пример (я удалил одну строку):
        (when (= node (first (db/primaries test)))
-         (cl/with-conn-failure-retry conn
-           (info (str "Creating table " table-name))
-           (j/execute! conn [(str "CREATE TABLE IF NOT EXISTS " table-name
-                             "(id INT NOT NULL PRIMARY KEY,
-                             balance INT NOT NULL)")])
-           (doseq [a (:accounts test)]
-               (info "Populating account")
-               (sql/insert! conn table-name {:id      a
-                                             :balance (if (= a (first (:accounts test)))
-                                                       (:total-amount test)
-                                                       0)}))))
+         (info (str "Creating table " table-name))
+         (j/execute! conn [(str "CREATE TABLE IF NOT EXISTS " table-name
+                           "(id INT NOT NULL PRIMARY KEY,
+                           balance INT NOT NULL)")])
+         (doseq [a (:accounts test)]
+             (info "Populating account")
+             (sql/insert! conn table-name {:id      a
+                                           :balance (if (= a (first (:accounts test)))
+                                                     (:total-amount test)
+                                                     0)}))))
        (assoc this :conn conn :node node))))
не вижу здесь специфики кложуры. в doseq, кстати, есть :let и прочее
https://clojuredocs.org/clojure.core/doseq#example-542692d2c026201cdc326f93
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Sergey Bronnikov
в целом верно, но в других языках меньше этой этажности.
я вот не замечаю как-то, но у меня много cond->
и я не стесняюсь ещё таких конструкций
(let [a (f b)
       _ (log a)
       _ (do-thing! a)])
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Bronnikov
Вот какой вопрос меня мучает. В кложе принято писать код в стиле Маяковского - многоэтажными конструкциями с отступами. Если, к примеру, в середину одной из таких конструкций добавить изменение, то нужно переформатировать строки ниже этой строки и получается патч, в котором вместо одной строки изменения для нескольких строк. Это например не очень удобно для ревьюера, ну и просто как то непривычно после других языков. Как вы с этим справляетесь?
Вообще не принято. Пишется всё маленькими функциями, чтобы если в одном месте что-то посыпалось или надо изменить, то ты видишь, где это произошло и правишь маленький компонент, а не ищешь иголку в стоге сена. KISS/SRP, всё такое.
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Sergey Bronnikov
Вот пример (я удалил одну строку):
        (when (= node (first (db/primaries test)))
-         (cl/with-conn-failure-retry conn
-           (info (str "Creating table " table-name))
-           (j/execute! conn [(str "CREATE TABLE IF NOT EXISTS " table-name
-                             "(id INT NOT NULL PRIMARY KEY,
-                             balance INT NOT NULL)")])
-           (doseq [a (:accounts test)]
-               (info "Populating account")
-               (sql/insert! conn table-name {:id      a
-                                             :balance (if (= a (first (:accounts test)))
-                                                       (:total-amount test)
-                                                       0)}))))
+         (info (str "Creating table " table-name))
+         (j/execute! conn [(str "CREATE TABLE IF NOT EXISTS " table-name
+                           "(id INT NOT NULL PRIMARY KEY,
+                           balance INT NOT NULL)")])
+         (doseq [a (:accounts test)]
+             (info "Populating account")
+             (sql/insert! conn table-name {:id      a
+                                           :balance (if (= a (first (:accounts test)))
+                                                     (:total-amount test)
+                                                     0)}))))
        (assoc this :conn conn :node node))))
такое можно, может быть какой-то цикломатической метрикой поймать, на pre-commit хуке. Может clj-kondo может понимать вложенность.
Но я бы договорился, конечно, с командой – больше 3-4 уровней вложенности – нежелательно, больше 7 нельзя, а за 10 и больше – анафема.
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
я вот кстати противник маленьких функций
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
сложность алгоритма никуда не уходит когда вы бьете его на десяток функций
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
я за то чтоб функция во вьюпорт умешалась редактора
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Ryzhikov Nikolay
я за то чтоб функция во вьюпорт умешалась редактора
поэтому в гугле вертикальные мониторы
* простите *
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
и за естественное разбиение на функции
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
те если оно тянет на самостоятельную функцию  - пусть ей и будет
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
упрощайте алгоритм!
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Эх ребята, раньше-то функции были! не то что эти ваши сейчас.
Я вам не рассказывал как Петровича не стало? Он же тоже, начитался этих ваших рефакингов, и решил упростить функцию компиляции хвостовой рекурсии…
Петровича разорвало так что потом неделю по всему НИИ собирали останки. Неделю, ребята!
источник

a

alex in Clojure — русскоговорящее сообщество
только надо помнить что по дефолту в джаве JIT инлайнит методы не более 35 инструкций (байткода, но эта опция настраивается), хотя с кложурой возможно этого понимания достичь еще сложнее
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
alex
только надо помнить что по дефолту в джаве JIT инлайнит методы не более 35 инструкций (байткода, но эта опция настраивается), хотя с кложурой возможно этого понимания достичь еще сложнее
ну это-то выяснять вообще только с профайлером и если есть необходимость
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
я бы не стал делать себе неудобно из-за предположения о том что может сделать компилятор
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Ryzhikov Nikolay
и за естественное разбиение на функции
у меня к числу строк нет вопросов, главное чтобы содержимое уместилось в сознаньице моё крохотное
источник

a

alex in Clojure — русскоговорящее сообщество
ты можешь делать себе неудобно сколько хочешь, но я вижу что в кложуру зачем то идут на скоростью и вот JVM поощряет написание именно мелких методов
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
alex
ты можешь делать себе неудобно сколько хочешь, но я вижу что в кложуру зачем то идут на скоростью и вот JVM поощряет написание именно мелких методов
Я делаю себе удобно же. Я к тому, что мой подход к ускорению это после того как я для себя всё удобно написал – сесть с профайлером и померять где узко. И там вложить час-два времени на оптимизации. Чем заранее оптимизировать то что может узким-то и не будет.
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
Как говорит господин Илон: инженеры часто тратят недели на проблемы которые не нужно было трогать вообще.
источник