Size: a a a

Software Design/Architecture/Zen

2020 November 22

NF

Nikita Fedorov in Software Design/Architecture/Zen
и я вот думаю, что лучше делать:
import { x, y, z } from "./bottom"
export function getXYZ({
 xProps,
 yProps,
 zProps,
}: XYZProps): XYZ {
 return {
   x: x(xProps),
   y: y(yProps),
   z: z(zProps),
 };
}

или
import { x, y, z } from "./bottom"
export function getXYZ(): XYZ {
 return {
   x: x,
   y: y,
   z: z,
 };
}
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
в первом случае получится в корне как xyz(fgh()), во втором xyz.x(fgh.f(...)) x3
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
и на этом моменте я немного теряюсь, ведь с одной стороны делать интерфейс из данных это "тру фп", с другой стороны если так делать, то функциональный подход с "зависимости всегда первым аргументом" не работает, меня прям тянет сделать интерфейс class-like, тогда "зависимости всегда первым аргументом" работает, но интерфейс получается из кода, а не из данных.
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
короче либо я что-то делаю не так, либо есть какое то правило чтобы делать этот выбор, так вот что это за правило?
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Fedorov
короче либо я что-то делаю не так, либо есть какое то правило чтобы делать этот выбор, так вот что это за правило?
Мб кто другой поможет, ибо я не оч понял. Но похоже что проблема с пробросом зависимостей в нижние модули. Чаще всего решается монадами. Из простых примеров ReaderMonad
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Yury Golikov
Мб кто другой поможет, ибо я не оч понял. Но похоже что проблема с пробросом зависимостей в нижние модули. Чаще всего решается монадами. Из простых примеров ReaderMonad
монады это кастыль для ущербных))
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Fedorov
монады это кастыль для ущербных))
Хм, ну мб тогда тебе и не нужно это фп)
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Fedorov
Получается, просто код в "нижних" модулях формата (deps, args) => output,
дальше с подъемом выше они группируются через 1 импорт из index в отдельном модуле, т.е. import { x, y, z } from "./bottom" +  (deps, args) => output
и так до рута, а в руте 100500 импортов внешних модулей и явная установка их в deps
Такая проблема ещё возникает, когда ты хочешь юзать IO в нижних модулях
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Типа там забрать репозиторий там. Но как раз нижние модули в фп принято оставлять чистыми
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Yury Golikov
Типа там забрать репозиторий там. Но как раз нижние модули в фп принято оставлять чистыми
я просто каррирую и вниз передается только нечто вроде:
deps: { getChanges: (id, field) => timetravel.getChanges(timetravel.initialState, id, field) }
ну или какой-то более разумный интерфейс
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Fedorov
я просто каррирую и вниз передается только нечто вроде:
deps: { getChanges: (id, field) => timetravel.getChanges(timetravel.initialState, id, field) }
ну или какой-то более разумный интерфейс
Ну шо то какая то залупка) а зачем ты так делаешь? Что это даёт из бенефитов?
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
имхо все эти обертки удобно использовать когда в коде реально они нужны, ну т.е. если предметная область предполагает что тебе нужна полурешетка то ты такой "вау, в fp-ts есть полурешетка"
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Yury Golikov
Ну шо то какая то залупка) а зачем ты так делаешь? Что это даёт из бенефитов?
то что у каждого модуля минимальный интерфейс
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
я могу заменить что угодно где угодно внеся исправление в одном месте, я могу протестировать любой код не определяя ни строчки лишнего кода, все что мне нужно знать для внесения изменений в модуль(файл) находится в этом файле
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
у каждого модуля интерфейсы с 2 сторон i/o, по этому можно не бояться что-то где-то сломать, изменяя i/o я всегда могу сделать это от в 1-3 местах максимум, чаще в 1
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Fedorov
у каждого модуля интерфейсы с 2 сторон i/o, по этому можно не бояться что-то где-то сломать, изменяя i/o я всегда могу сделать это от в 1-3 местах максимум, чаще в 1
Круто. Ну это вроде не совсем про чистые функции. Где результат зависит только от аргументов.

Есть вот ещё такое известное чтиво https://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Yury Golikov
Круто. Ну это вроде не совсем про чистые функции. Где результат зависит только от аргументов.

Есть вот ещё такое известное чтиво https://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html
ну они все у меня чистые, грязный только корень точнее дерево корней
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
Nikita Fedorov
ну они все у меня чистые, грязный только корень точнее дерево корней
🙃
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
дожили, разговор за грязные корни деревьев
источник

a

atcq (Алексей)... in Software Design/Architecture/Zen
Nikita Fedorov
то что у каждого модуля минимальный интерфейс
вопрос: а есть ли какой-то измеряемый/доказуемый профит у всего этого упарывания по функциональщине?
источник