|
Как защитить код
|
|||
---|---|---|---|
#18+
chpashaАндрей Панфилова зачем удалять? сеньор-то - пьяный. а в коде на Scala он и трезвый побоится удалять, разве что все скопом ;) В ФП фишка в том что компилятор за тебя контролирует типы,и да, ты не сможешь удалить вызов транзактора и при этом не поломать сборку. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:26 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
andreykaTmaytonЯ-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди к Atum и спроси разрешения". Все. Баста. Решение на 0.001 story point. ща мода пошла у некоторых не писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал. ))) у узбеков есть поговорка - попроси принести тюбетейку - они тебе принесут тюбетейку вместе с головой. Плохая мода. Но Роб Мартин прав в части того что каменды надо также суппортить как и код. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:26 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
andreykaTповедение кода закрепляют тесты. ответ - надо покрыть код тестами. Лучший тест - это компиляция, которую не забудешь проранать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:28 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никНикак, но в этом и весь цимус, что вам это и не надо. Чет какая-то жесть... - проблема: очень печально что мы не видим где транзакция начинается (в endpoint транзакции начинаются по канону) - решение: берем скалу, теперь мы все равно не знаем где начинается транзакция, но проблемы уже нет - теперь у нас жопа в другом месте забыл никА чтобы выполнить ConnectionIO - ты обязан предоставить Transactor, иначе не скомпилируется.Как по мне так никакой практической пользы тут нет, транзакции же определяют как мы должны работать с данными, а тут нам язык какую-то конвенцию придумывает. А что делать если определенное метод мне нужно вне транзакции запустить, а если нужно параллельную транзакцию открыть? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:39 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
Андрей ПанфиловЧет какая-то жесть... - проблема: очень печально что мы не видим где транзакция начинается (в endpoint транзакции начинаются по канону) - решение: берем скалу, теперь мы все равно не знаем где начинается транзакция, но проблемы уже нет - теперь у нас жопа в другом месте Да с чего вдруг? На самом деле идея простая, но не сразу дается, когда переходишь со спринга(сам так тупил) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns. В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:56 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
Андрей ПанфиловКак по мне так никакой практической пользы тут нет, транзакции же определяют как мы должны работать с данными, а тут нам язык какую-то конвенцию придумывает. А что делать если определенное метод мне нужно вне транзакции запустить, а если нужно параллельную транзакцию открыть? Выполнить кусок кода вне транзакции не получится в любом случае. Если нужна параллельная - ну вызывай в другом потоке, транзактор тредсейф. А вообще звучит как "а ваша пила умеет сталь пилить?", хотелки какие-то непонятные, хотя прикол в том, что даже их без проблем можно реализовать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 17:58 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никАндрей ПанфиловЧет какая-то жесть... - проблема: очень печально что мы не видим где транзакция начинается (в endpoint транзакции начинаются по канону) - решение: берем скалу, теперь мы все равно не знаем где начинается транзакция, но проблемы уже нет - теперь у нас жопа в другом месте Да с чего вдруг? На самом деле идея простая, но не сразу дается, когда переходишь со спринга(сам так тупил) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns. В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера. В данном случае (исходим из обсуждаемого примера) получается так: чтобы дернуть MailService мне его нужно его заврапить в ConnectionIO (там в статье пишут IO.to[ConnectionIO]), поэтому везде по приведенному коду мне нужно расставить этот .to[ConnectionIO] "чтобы скомпилировалось", дальше проходит время, я выхожу из запоя и принимаю решение что почту мне нафиг посылать не нужно прямо вот сейчас, а можно и через некоторое время, поэтому я иду и меняю реализацию MailService чтобы оно писало в БД вместо отправки почты, а потом бегаю по всему коду и убираю .to[ConnectionIO] потому что теперь не компилируется - какое-то сомнительное удовольствие кмк. забыл никВыполнить кусок кода вне транзакции не получится в любом случае. Если нужна параллельная - ну вызывай в другом потоке, транзактор тредсейф. А вообще звучит как "а ваша пила умеет сталь пилить?", хотелки какие-то непонятные, хотя прикол в том, что даже их без проблем можно реализоватьЗдрасьте, требования как требования (ну вот спринг же умеет, а он ориентирован на JSR 907, который не последние люди в мире жавы разрабатывали), да и вызов в другом потоке и открытие новой транзакции из текущего - это два совершенно разных паттерна. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 18:26 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
chpashaandreykaTне писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал Мартин ничего не говорил про "не писать принципиально" авторTherefore, though comments are sometimes necessary, we will expend significant energy to minimize them. Узбекская поговорка это только подтверждает ;) конечно не говорил. вернее, он говорил типа не пишите избыточные комменты и не пишите бесплезные комменты. но норот читает как "не пишите комменты". ))) и начинаются в ревью тёрки типа у тебя код говно потому что ты вон там коммент оставил. а не только в шапке через жавадог ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 18:57 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никandreykaTповедение кода закрепляют тесты. ответ - надо покрыть код тестами. Лучший тест - это компиляция, которую не забудешь проранать а причем в данном случае компиль? код то работает. просто он не так работает как ожидает тс. поведение кода контролируется тестами. имхо. про ваши фп как обходиться без тестов и вообще всё само я пока не вник. не у кого поучиться ) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 18:59 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никАндрей ПанфиловЧет какая-то жесть... - проблема: очень печально что мы не видим где транзакция начинается (в endpoint транзакции начинаются по канону) - решение: берем скалу, теперь мы все равно не знаем где начинается транзакция, но проблемы уже нет - теперь у нас жопа в другом месте Да с чего вдруг? На самом деле идея простая, но не сразу дается, когда переходишь со спринга(сам так тупил) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns. В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера. так вот он я красавец. у меня есть юзкейс.ран(транзактор), а есть скажем юзкейс.ватеварелз(неТранзактар) и я такой модный программист - просто удаляю эту строку и подменяю другой. оно дальше допустим, работает но уже без транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 19:02 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никЕсть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять. Тыц Спасибо, отличная статья. Идея о том, что из репозиториев можно возвращать DBIOAction[T] вмето Future[T] (у меня слик) и потом транзакционно интерпретировать в Application Service, лично для меня закрывает один из пробелов между классическим DDD и функциональным стилем. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 23:07 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
забыл никPetroNotC Sharpпропущено... Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться. Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять. Тыц Это конечно не совет автору все переписывать с нуля - просто чтоб знал как бывает иначеох боюсь это никому не надо. Так как усложняет. Надо 2 транзакции, пиши 2 потока или 2 раза beginTran. Всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 02:54 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
fixxerфункциональным стилем.а рвзве ФП стало распространено? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 02:56 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
PetroNotC Sharpfixxerфункциональным стилем.а рвзве ФП стало распространено? В скале так точно. Но даже в джаве последние три года встречаю, в основном, реактивные стримы и Completable Future. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 10:13 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
fixxerPetroNotC Sharpпропущено... а рвзве ФП стало распространено? В скале так точно. Но даже в джаве последние три года встречаю, в основном, реактивные стримы и Completable Future. Если посмотреть более шИроко. То ФП давно уже вокруг вас. ФП - это не только программирование. Это декларативное описание грамматик и смыслов. Формы Бекуса Науэра BNF/EBNF. Xml-schema/DTD. Просто спеки для всяких DSL. И попытки втащить в языки программирования иммутабельность структур данных - это всё части ФП. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 10:30 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
Atum1Любые идеи, подойдут. Как возможный вариант - на методы дао/репозитории вешать Transactional.MANDATORY ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 11:03 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
SpringManКак возможный вариант - на методы дао/репозитории вешать Transactional.MANDATORY С каким-нибудь тестом, разумеется. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 11:05 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
нужно понимать где у тебя в проекте вообще наставлены эти @Transactional если это, как обычно - в контроллере для доступа к слою сервисов - то я бы сделал отдельный слой, который отвечает только транзакции совместно с мавен-модулями. напирмер project | |- web (содержит контроллеры, имеет доступ только к интерфейсу core-api и DTOшки) | |- core api (содержит только интерфейс (какой нибудь BusinessService) и, вероятно, DTO) | |- core impl (содежит реализацию BusinessServiceImpl, весь класс помечен @Transactional, внутри редиректит логику уже в "настоящие" сервисы, вероятно конвертирует DTO в сущности JPA) тут конечно "лишнего" кода будет много Если конечно расстановка @Transactional имеет хаотичный характер - то, имхо, только интеграционные тесты) которые обращаются в систему через контроллеры ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 11:52 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
Чувствую в этом топике рождается гоммункул. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 12:26 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
Андрей ПанфиловВ данном случае (исходим из обсуждаемого примера) получается так: чтобы дернуть MailService мне его нужно его заврапить в ConnectionIO (там в статье пишут IO.to[ConnectionIO]), поэтому везде по приведенному коду мне нужно расставить этот .to[ConnectionIO] "чтобы скомпилировалось", дальше проходит время, я выхожу из запоя и принимаю решение что почту мне нафиг посылать не нужно прямо вот сейчас, а можно и через некоторое время, поэтому я иду и меняю реализацию MailService чтобы оно писало в БД вместо отправки почты, а потом бегаю по всему коду и убираю .to[ConnectionIO] потому что теперь не компилируется - какое-то сомнительное удовольствие кмк. Во-первых, тебе надо заворачивать MailService в ConnectionIO только в случае если ты хочешь вызвать его в рамках транзакции, в общем случае посылка email - это side-effect и должен быть обернут просто в IO. Верхний уровень программы выглядит примерно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Во-вторых, ты в чем-то прав, а именно в том что надо прикладывать усилия, чтобы код скопилировался. Но это происходит именно потому что мы прописываем в типе дополнительную информацию(а именно что коду нужно DB connection) - и если он не компилируется(ты поменял реализацию MailService) - то оно и не должно компилироваться, потому что коннекшен тебе не нужен. И это не недостаток а достоинство. Тебя же не возмущает, если ты заменишь String date на LocalDate date - и тебе надо поменять все места, где используется это поле "чтобы скомпилировалось"? С наскока это не понять, и даже за месяц. Никого не уговариваю, хотите верьте, хотите нет - но composable type-safe transactions существуют ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 12:56 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
andreykaTзабыл никпропущено... Лучший тест - это компиляция, которую не забудешь проранать а причем в данном случае компиль? код то работает. просто он не так работает как ожидает тс. поведение кода контролируется тестами. имхо. про ваши фп как обходиться без тестов и вообще всё само я пока не вник. не у кого поучиться ) А в том что ты в типах можешь прописать дополнительную логику. Некоторые умельцы чисто на типах пилят игры в пятнашки. И эти типы будут проверяться компилятором. И не по твоему хотению, а всегда. Их невозможно обойти и невозможно "забыть" запустить перед коммитом ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 12:58 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
andreykaTтак вот он я красавец. у меня есть юзкейс.ран(транзактор), а есть скажем юзкейс.ватеварелз(неТранзактар) и я такой модный программист - просто удаляю эту строку и подменяю другой. оно дальше допустим, работает но уже без транзакции. Не поянл, какую строку удаляешь и почему оно перестанет работать? Любая операция с базой имеет тип ConnectionIO - единственный способ вытянуть оттуда реальное значение - это предоставить транзактор. Если ты не предоставишь - у тебя будет просто объект типа ConnectionIO и ты его не сможешь никак заюзать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 13:00 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
fixxerзабыл никЕсть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять. Тыц Спасибо, отличная статья. Идея о том, что из репозиториев можно возвращать DBIOAction[T] вмето Future[T] (у меня слик) и потом транзакционно интерпретировать в Application Service, лично для меня закрывает один из пробелов между классическим DDD и функциональным стилем. А DDD никак не противоречит ФП, а очень даже хорошо вписывается, я уже приводил линку - вот неплохая книга. Functional-Reactive-Domain-Modeling ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 13:02 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
PetroNotC Sharpзабыл никпропущено... Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять. Тыц Это конечно не совет автору все переписывать с нуля - просто чтоб знал как бывает иначеох боюсь это никому не надо. Так как усложняет. Надо 2 транзакции, пиши 2 потока или 2 раза beginTran. Всё. Что усложняет? В хорошо написанной программе - Что в ООП, что в ФП по факту будет один и тот же результат(прочитать что-то, записать, залогировать, изменить стейт системы, обработать ошибки). И тебе и там и там надо обработать ошибки, обернуть все в транзакцию, обработать отсутсвие данных и т.д. В случае ООП обычно начинается с красивого кода по happy-path, а проверки на нулл, обработка эксепшенов, всякие корнер - кейсы - это уже по мере тестирования. В случае ФП - у тебя код просто не скопилируется пока ты все это не пропишешь. Простота ООП иллюзорна и только расслабляет программиста, провоцируя его вовремя дэдлайнов на куяк куяк и в продакшен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 13:09 |
|
Как защитить код
|
|||
---|---|---|---|
#18+
PetroNotC Sharpfixxerфункциональным стилем.а рвзве ФП стало распространено? Да, идеи ФП проникают в Java, C# и т.д, а не наоборот, как минимум. Тебе 10 лет назад показать код на стримах - ты бы ворочал носом и говорил какое говно, у меня есть циклы ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 13:11 |
|
|
start [/forum/topic.php?fid=59&msg=39870326&tid=2121090]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
66ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 178ms |
0 / 0 |