Size: a a a

Software Design/Architecture/Zen

2020 November 27

АР

Андрей Радионов... in Software Design/Architecture/Zen
источник

АЯ

Андрей Ява in Software Design/Architecture/Zen
Andrey Furman
привет, скажите плиз, как на jwt реализовать механизм logout all devices?
Сменить шифрование
источник

АЯ

Андрей Ява in Software Design/Architecture/Zen
Андрей Радионов
что делать, если с API приходит объект и нужно его преобразовать в другой сложный объект, с поведением и т.д. Использовать Builder или фабрику?
Как душе угодно будет.
Билдер имеет смысл, если у тебя разные сценарии билда, если один то лучше одним методом.
источник

AF

Andrey Furman in Software Design/Architecture/Zen
Андрей Ява
Сменить шифрование
поиграюсь с этим, спасибо
источник

NF

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

VS

Vlad Sobenko in Software Design/Architecture/Zen
Nikita Fedorov
никогда не каррируйте функции вне локальной области видимости, все становится очень красивым, легко читаемым и модульным, но изменить код почти так же сложно как пропатчить фреймворк
Можно пример?
источник

λ

λoλdog in Software Design/Architecture/Zen
Nikita Fedorov
никогда не каррируйте функции вне локальной области видимости, все становится очень красивым, легко читаемым и модульным, но изменить код почти так же сложно как пропатчить фреймворк
Странное заявление
источник

АЯ

Андрей Ява in Software Design/Architecture/Zen
Очен правильное заявление
источник

АЯ

Андрей Ява in Software Design/Architecture/Zen
На самом деле согласен полностью.
По "локальной областью видимости" подразумевается физически кусок экрана, который охватывается взглядом без скролла
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Vlad Sobenko
Можно пример?
// там же где FormulaPayload и context
updateAds = (ads) => from(ads)
   .to(FormulaPayload)
   .filter(x => x.type === FormulaType.New)
   .map(x => ({
     payload: x.rowValue(),
     id: x.id
   }))
   .map(context.update)

vs
// где-то в корне
createSomeShit({
updateAds: updateAds({  update: ... })
})

// где-то чуть ниже
updateAds = updateAds({ fromFormulaPayload: ..., onlyNew: ...,  rowValues: ... })

// где-то очень глубоко
({ updateAds, doSomethingElse}) => {
updateAds(ads);
doSomethingElse();
}

// где-то рядом с вызовом
updateAds = ({ update }) => ({ fromFormulaPayload, onlyNew,  rowValues }) => (ads) => update(rowValues(onlyNew(fromFormulaPayload())));
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
типизацию я естественно опустил
источник

NF

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

NF

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

NF

Nikita Fedorov in Software Design/Architecture/Zen
а сделав каррирование на месте вроде: .filter(byType(FormulaType.New)), это ок, вообще без потерь
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
с монадами и прочим тоже самое, добавление любого уровня вложенности делает их супер не прозрачными, т.е. если вынести отдельно условно:
toPayload = ads => ads.map(x => ({
     payload: x.rowValue(),
     id: x.id
   }))
то это x10 к сложности кода, а если
toPayload = x => ({
     payload: x.rowValue(),
     id: x.id
   })

то это иногда будет ок, но это никогда не будет лучше чем ({toPayload, x }) => toPayload(x) потому что в случае выноса функции она будет передана через контекст родителя, а не вместе с контекстом x
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Зачем использовать ФП, если больно?
Мыши плакали, кололись, но продолжали грызть кактус?
Сначала надо мозг от-тьюнинговать, а потом уже ФП-код писать
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪
Зачем использовать ФП, если больно?
Мыши плакали, кололись, но продолжали грызть кактус?
Сначала надо мозг от-тьюнинговать, а потом уже ФП-код писать
ну я потюнил, в итоге код различается только тем в какой момент я добавляю поведение к данным, на классах этот момент - во время определения класса, а с магическим ФП в момент вызова кода
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
и все
источник

p

pragus in Software Design/Architecture/Zen
Nikita Fedorov
// там же где FormulaPayload и context
updateAds = (ads) => from(ads)
   .to(FormulaPayload)
   .filter(x => x.type === FormulaType.New)
   .map(x => ({
     payload: x.rowValue(),
     id: x.id
   }))
   .map(context.update)

vs
// где-то в корне
createSomeShit({
updateAds: updateAds({  update: ... })
})

// где-то чуть ниже
updateAds = updateAds({ fromFormulaPayload: ..., onlyNew: ...,  rowValues: ... })

// где-то очень глубоко
({ updateAds, doSomethingElse}) => {
updateAds(ads);
doSomethingElse();
}

// где-то рядом с вызовом
updateAds = ({ update }) => ({ fromFormulaPayload, onlyNew,  rowValues }) => (ads) => update(rowValues(onlyNew(fromFormulaPayload())));
а что это за язык?
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
ну и данные не изменяемые, что и на классах не новость
источник