powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Как защитить код
76 сообщений из 76, показаны все 4 страниц
Как защитить код
    #39869997
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Тут делал ревью кода и обрати внимание что Senjor Java Developer - взял и снял аннотация @Transaction с ряда методов,
сначала подумал что рефакторинг, потом понял что просто ошибка, аннотации вернул.

Но вопрос остался как защитить код от таких изменений?

Поведение должно быть такое если аннотации сняли - код должен не собираться, падать , делать все чтобы он не попал в продакшен.

как делать?

Любые идеи, подойдут.

Может есть какая идея, плагин ?


Спасибо .
...
Рейтинг: 0 / 0
Как защитить код
    #39869998
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как простой пример всем понятный

в связях One-to-many - Parent --- Set<Child> делать метод

Set<Child> getChilds(){
return Collections.unmodifiableSet(childs);
}

чтобы исключить добавление через add коллекции , а для добавления создавать отдельный метод

А на уровне декларативного кода что-то такое можно придумать ?

может тест хитрый написать ??
...
Рейтинг: 0 / 0
Как защитить код
    #39870001
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Написать тесты на spring-test
...
Рейтинг: 0 / 0
Как защитить код
    #39870007
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переходить на Scala и ФП)
...
Рейтинг: 0 / 0
Как защитить код
    #39870009
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.
...
Рейтинг: 0 / 0
Как защитить код
    #39870019
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в любом случае у нас внутри код, который должен выполниться в одной транзакции - это и надо тестировать. а уж как это достигается, с помощью Transactional или условных beginTransaction/commitTransaction - дело третье. При определенном везении Transactional и вовсе не будет работать, так что его наличие или даже отсутствие ни о чем не говорит

забыл никэто нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascriptэто про Transactional или про return "redirect:/showresult/${id}" из соседнего топика?
...
Рейтинг: 0 / 0
Как защитить код
    #39870032
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
забыл никэто нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascriptэто про Transactional или про return "redirect:/showresult/${id}" из соседнего топика?

И про то и про другое. Хотя первоначально имелись ввиду любые runtime-аннотации
...
Рейтинг: 0 / 0
Как защитить код
    #39870050
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

тесты надо написать, что падают, если сняли анотацию @Transaction
и выполнять эти тесты на ветке перед мёржем
и если они упали, то запрещать мёрж
...
Рейтинг: 0 / 0
Как защитить код
    #39870056
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никИменно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.да.
Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.
Аффтар!
— показать ему что упало когда он снял аннотацию.
- с разрешения руководства писать тесты на транзакции.
Он ведь мог и
connection.beginTran
не написать.
...
Рейтинг: 0 / 0
Как защитить код
    #39870057
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

ты входишь в опасный виток разработки тестов когда сложность тестирования
может превышать полученный полезный эффект.

Если у тебя есть тесты которые закрепляют бизнес логику - то они должны работать.

Если на @Transaction нельзя написать модульные ... интеграционные или performance
тесты - то возможно они .... не нужны.
...
Рейтинг: 0 / 0
Как защитить код
    #39870061
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

ща насоветуют дичи... все уже давно изобретено:

Код: java
1.
2.
3.
protected void myImportantMethod() {
	assert txService.isActive();
}
...
Рейтинг: 0 / 0
Как защитить код
    #39870062
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonможет превышать полученный полезный эффект.
особенно когда окажется, что Senior поудалял там аннотации не по ошибке
...
Рейтинг: 0 / 0
Как защитить код
    #39870066
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловAtum1,

ща насоветуют дичи... все уже давно изобретено:

Код: java
1.
2.
3.
protected void myImportantMethod() {
	assert txService.isActive();
}



Которое также легко удаляется пьяным сеньором
...
Рейтинг: 0 / 0
Как защитить код
    #39870070
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpзабыл никИменно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.
Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.


Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц

Это конечно не совет автору все переписывать с нуля - просто чтоб знал как бывает иначе
...
Рейтинг: 0 / 0
Как защитить код
    #39870077
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди
к Atum и спроси разрешения".

Все. Баста. Решение на 0.001 story point.
...
Рейтинг: 0 / 0
Как защитить код
    #39870082
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловAtum1,

ща насоветуют дичи... все уже давно изобретено:

Код: java
1.
2.
3.
protected void myImportantMethod() {
	assert txService.isActive();
}

Такая проверка в рантайме, если код сломан уже ничего не даст. Процесс ревью кода может помочь. А лучше иметь интеграционные или приемочные тесты. Но тут насколько есть ресурсы на написание таких тестов.
...
Рейтинг: 0 / 0
Как защитить код
    #39870108
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЕсть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц Чет там какой-то обман кмк.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Re-useable effect descriptions
val sendEmail: IO[Unit] = IO(println("Sending email"))
val insertUser: ConnectionIO[Int] = 
  sql"INSERT INTO users(name, email) VALUES('Emily', 'emily@email.com')"
    .update.run

// (1)  BEGIN; INSERT; sendEmail(); COMMIT;
val insertThenSend: ConnectionIO[Unit] =
  insertUser.flatMap(_ => sendEmail.to[ConnectionIO])
  
val result1: IO[Unit] = insertThenSend.transact(transactor)



При этом у автора претензия:

авторLack of precision. Without looking at the code in its entirety, we can’t be sure where transactions exactly begin and commit. An @Transactional method might define the transaction boundary, or might take part in a broader transaction. It’s not possible to differentiate between these two scenarios.

Вот как смотря в код sendEmail я могу понять в транзакции он будет выполняться или нет?
...
Рейтинг: 0 / 0
Как защитить код
    #39870113
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никАндрей ПанфиловAtum1,

ща насоветуют дичи... все уже давно изобретено:

Код: java
1.
2.
3.
protected void myImportantMethod() {
	assert txService.isActive();
}



Которое также легко удаляется пьяным сеньорома зачем удалять? У нас же нет контракта вида "где-то должны стоять аннотации", а есть контракт вида "этот метод требует выполнения в транзакции", соответственно assert прекрасно этот контракт обеспечивает и никакие дополнительные тесты писать не нужно, достаточно то что есть (если конечно есть) запускать с -ea
...
Рейтинг: 0 / 0
Как защитить код
    #39870116
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилова зачем удалять?
сеньор-то - пьяный. а в коде на Scala он и трезвый побоится удалять, разве что все скопом ;)
...
Рейтинг: 0 / 0
Как защитить код
    #39870118
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Добрый день.

Тут делал ревью кода и обрати внимание что Senjor Java Developer - взял и снял аннотация @Transaction с ряда методов,
сначала подумал что рефакторинг, потом понял что просто ошибка, аннотации вернул.

Но вопрос остался как защитить код от таких изменений?

Поведение должно быть такое если аннотации сняли - код должен не собираться, падать , делать все чтобы он не попал в продакшен.

как делать?

Любые идеи, подойдут.

Может есть какая идея, плагин ?


Спасибо .
поведение кода закрепляют тесты. ответ - надо покрыть код тестами.
...
Рейтинг: 0 / 0
Как защитить код
    #39870120
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpзабыл никИменно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.да.
Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.
Аффтар!
— показать ему что упало когда он снял аннотацию.
- с разрешения руководства писать тесты на транзакции.
Он ведь мог и
connection.beginTran
не написать.
в модном слике никаких аннотаций транзакций нет (а жаль!)
...
Рейтинг: 0 / 0
Как защитить код
    #39870121
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди
к Atum и спроси разрешения".

Все. Баста. Решение на 0.001 story point.
ща мода пошла у некоторых не писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал. ))) у узбеков есть поговорка - попроси принести тюбетейку - они тебе принесут тюбетейку вместе с головой.
...
Рейтинг: 0 / 0
Как защитить код
    #39870124
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
Код: java
1.
2.
// Re-useable effect descriptions
val sendEmail: IO[Unit] = IO(println("Sending email"))



Вот как смотря в код sendEmail я могу понять в транзакции он будет выполняться или нет?

Никак, но в этом и весь цимус, что вам это и не надо.
sendEmail - утилитная функция, которую можно вызвать как с транзакции так и вне, ее тип просто говорит что это IO - то есть некий сайд эффект.
Когда же ты делаешь композицию функций, а-ля insertToDb.flatMap(_ => sendEmail) - тип это выражения уже Coneection[A] - то есть нечто что будет выполнено только если ему предоставить коннекшен. А чтобы выполнить ConnectionIO - ты обязан предоставить Transactor, иначе не скомпилируется.
...
Рейтинг: 0 / 0
Как защитить код
    #39870126
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTне писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал
Мартин ничего не говорил про "не писать принципиально"
авторTherefore, though comments are sometimes necessary, we will expend significant energy to minimize them.


Узбекская поговорка это только подтверждает ;)
...
Рейтинг: 0 / 0
Как защитить код
    #39870127
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловзабыл никпропущено...


Которое также легко удаляется пьяным сеньорома зачем удалять? У нас же нет контракта вида "где-то должны стоять аннотации", а есть контракт вида "этот метод требует выполнения в транзакции", соответственно assert прекрасно этот контракт обеспечивает и никакие дополнительные тесты писать не нужно, достаточно то что есть (если конечно есть) запускать с -ea

Убедил, но проблема того что это детектится лишь в рантайме - остается, хотя лучше чем было
...
Рейтинг: 0 / 0
Как защитить код
    #39870128
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaАндрей Панфилова зачем удалять?
сеньор-то - пьяный. а в коде на Scala он и трезвый побоится удалять, разве что все скопом ;)

В ФП фишка в том что компилятор за тебя контролирует типы,и да, ты не сможешь удалить вызов транзактора и при этом не поломать сборку.
...
Рейтинг: 0 / 0
Как защитить код
    #39870129
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTmaytonЯ-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди
к Atum и спроси разрешения".

Все. Баста. Решение на 0.001 story point.
ща мода пошла у некоторых не писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал. ))) у узбеков есть поговорка - попроси принести тюбетейку - они тебе принесут тюбетейку вместе с головой.
Плохая мода.

Но Роб Мартин прав в части того что каменды надо также суппортить как и код.
...
Рейтинг: 0 / 0
Как защитить код
    #39870130
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTповедение кода закрепляют тесты. ответ - надо покрыть код тестами.

Лучший тест - это компиляция, которую не забудешь проранать
...
Рейтинг: 0 / 0
Как защитить код
    #39870143
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНикак, но в этом и весь цимус, что вам это и не надо.
Чет какая-то жесть...
- проблема: очень печально что мы не видим где транзакция начинается (в endpoint транзакции начинаются по канону)
- решение: берем скалу, теперь мы все равно не знаем где начинается транзакция, но проблемы уже нет - теперь у нас жопа в другом месте

забыл никА чтобы выполнить ConnectionIO - ты обязан предоставить Transactor, иначе не скомпилируется.Как по мне так никакой практической пользы тут нет, транзакции же определяют как мы должны работать с данными, а тут нам язык какую-то конвенцию придумывает. А что делать если определенное метод мне нужно вне транзакции запустить, а если нужно параллельную транзакцию открыть?
...
Рейтинг: 0 / 0
Как защитить код
    #39870164
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловЧет какая-то жесть...
- проблема: очень печально что мы не видим где транзакция начинается (в 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.
UserService{
def insertUser = ... return Connection[User] 
def updateAudit = ... return Connection[Boolean]
}

MailService{
sendEmail = ... return IO
}

UserController(transactor:Transactor)

def insertUser = {
   val useCase:Connection[String] = for {
      user <- UserService.insert
      result <- UserService.audit
      _ <- if(result) MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}

def insertUserNoAudit = { 
   val useCase:Connection[String] = for {
      user <- UserService.insert
      _ <- MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}



В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns.
В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера.
...
Рейтинг: 0 / 0
Как защитить код
    #39870169
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловКак по мне так никакой практической пользы тут нет, транзакции же определяют как мы должны работать с данными, а тут нам язык какую-то конвенцию придумывает. А что делать если определенное метод мне нужно вне транзакции запустить, а если нужно параллельную транзакцию открыть?

Выполнить кусок кода вне транзакции не получится в любом случае. Если нужна параллельная - ну вызывай в другом потоке, транзактор тредсейф. А вообще звучит как "а ваша пила умеет сталь пилить?", хотелки какие-то непонятные, хотя прикол в том, что даже их без проблем можно реализовать
...
Рейтинг: 0 / 0
Как защитить код
    #39870188
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никАндрей ПанфиловЧет какая-то жесть...
- проблема: очень печально что мы не видим где транзакция начинается (в 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.
UserService{
def insertUser = ... return Connection[User] 
def updateAudit = ... return Connection[Boolean]
}

MailService{
sendEmail = ... return IO
}

UserController(transactor:Transactor)

def insertUser = {
   val useCase:Connection[String] = for {
      user <- UserService.insert
      result <- UserService.audit
      _ <- if(result) MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}

def insertUserNoAudit = { 
   val useCase:Connection[String] = for {
      user <- UserService.insert
      _ <- MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}



В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns.
В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера.
В данном случае (исходим из обсуждаемого примера) получается так:
чтобы дернуть MailService мне его нужно его заврапить в ConnectionIO (там в статье пишут IO.to[ConnectionIO]), поэтому везде по приведенному коду мне нужно расставить этот .to[ConnectionIO] "чтобы скомпилировалось", дальше проходит время, я выхожу из запоя и принимаю решение что почту мне нафиг посылать не нужно прямо вот сейчас, а можно и через некоторое время, поэтому я иду и меняю реализацию MailService чтобы оно писало в БД вместо отправки почты, а потом бегаю по всему коду и убираю .to[ConnectionIO] потому что теперь не компилируется - какое-то сомнительное удовольствие кмк.

забыл никВыполнить кусок кода вне транзакции не получится в любом случае. Если нужна параллельная - ну вызывай в другом потоке, транзактор тредсейф. А вообще звучит как "а ваша пила умеет сталь пилить?", хотелки какие-то непонятные, хотя прикол в том, что даже их без проблем можно реализоватьЗдрасьте, требования как требования (ну вот спринг же умеет, а он ориентирован на JSR 907, который не последние люди в мире жавы разрабатывали), да и вызов в другом потоке и открытие новой транзакции из текущего - это два совершенно разных паттерна.
...
Рейтинг: 0 / 0
Как защитить код
    #39870212
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaandreykaTне писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал
Мартин ничего не говорил про "не писать принципиально"
авторTherefore, though comments are sometimes necessary, we will expend significant energy to minimize them.


Узбекская поговорка это только подтверждает ;)
конечно не говорил. вернее, он говорил типа не пишите избыточные комменты и не пишите бесплезные комменты. но норот читает как "не пишите комменты". ))) и начинаются в ревью тёрки типа у тебя код говно потому что ты вон там коммент оставил. а не только в шапке через жавадог
...
Рейтинг: 0 / 0
Как защитить код
    #39870218
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никandreykaTповедение кода закрепляют тесты. ответ - надо покрыть код тестами.

Лучший тест - это компиляция, которую не забудешь проранать
а причем в данном случае компиль? код то работает. просто он не так работает как ожидает тс. поведение кода контролируется тестами. имхо. про ваши фп как обходиться без тестов и вообще всё само я пока не вник. не у кого поучиться )
...
Рейтинг: 0 / 0
Как защитить код
    #39870220
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никАндрей ПанфиловЧет какая-то жесть...
- проблема: очень печально что мы не видим где транзакция начинается (в 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.
UserService{
def insertUser = ... return Connection[User] 
def updateAudit = ... return Connection[Boolean]
}

MailService{
sendEmail = ... return IO
}

UserController(transactor:Transactor)

def insertUser = {
   val useCase:Connection[String] = for {
      user <- UserService.insert
      result <- UserService.audit
      _ <- if(result) MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}

def insertUserNoAudit = { 
   val useCase:Connection[String] = for {
      user <- UserService.insert
      _ <- MailService.sendEmail
   } yield "OK"
   useCase.run(transactor)
}



В целом - sendEmail, insertUser - маленькие кусочки реюзаемой логики, никаких cross-cutting concerns.
В Контроллере ты компонуешь эти кусочки как вздумается, и когда тебе нужен результат(а не дескрипшен твоего действия) - передаешь туда транзактор, обычно это как раз в эндпоинтах контроллера.

так вот он я красавец. у меня есть юзкейс.ран(транзактор), а есть скажем юзкейс.ватеварелз(неТранзактар)
и я такой модный программист - просто удаляю эту строку и подменяю другой. оно дальше допустим, работает но уже без транзакции.
...
Рейтинг: 0 / 0
Как защитить код
    #39870292
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЕсть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц

Спасибо, отличная статья. Идея о том, что из репозиториев можно возвращать DBIOAction[T] вмето Future[T] (у меня слик) и потом транзакционно интерпретировать в Application Service, лично для меня закрывает один из пробелов между классическим DDD и функциональным стилем.
...
Рейтинг: 0 / 0
Как защитить код
    #39870325
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetroNotC Sharpпропущено...

Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.


Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц

Это конечно не совет автору все переписывать с нуля
- просто чтоб знал как бывает иначеох боюсь это никому не надо. Так как усложняет.
Надо 2 транзакции, пиши 2 потока или 2 раза beginTran.
Всё.
...
Рейтинг: 0 / 0
Как защитить код
    #39870326
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerфункциональным стилем.а рвзве ФП стало распространено?
...
Рейтинг: 0 / 0
Как защитить код
    #39870377
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpfixxerфункциональным стилем.а рвзве ФП стало распространено?

В скале так точно. Но даже в джаве последние три года встречаю, в основном, реактивные стримы и Completable Future.
...
Рейтинг: 0 / 0
Как защитить код
    #39870387
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerPetroNotC Sharpпропущено...
а рвзве ФП стало распространено?

В скале так точно. Но даже в джаве последние три года встречаю, в основном, реактивные стримы и Completable Future.
Если посмотреть более шИроко. То ФП давно уже вокруг вас. ФП - это не только программирование.
Это декларативное описание грамматик и смыслов. Формы Бекуса Науэра BNF/EBNF. Xml-schema/DTD.
Просто спеки для всяких DSL. И попытки втащить в языки программирования иммутабельность структур
данных - это всё части ФП.
...
Рейтинг: 0 / 0
Как защитить код
    #39870400
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1Любые идеи, подойдут.

Как возможный вариант - на методы дао/репозитории вешать Transactional.MANDATORY
...
Рейтинг: 0 / 0
Как защитить код
    #39870401
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringManКак возможный вариант - на методы дао/репозитории вешать Transactional.MANDATORY
С каким-нибудь тестом, разумеется.
...
Рейтинг: 0 / 0
Как защитить код
    #39870427
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно понимать где у тебя в проекте вообще наставлены эти @Transactional
если это, как обычно - в контроллере для доступа к слою сервисов - то я бы сделал отдельный слой, который отвечает только транзакции совместно с мавен-модулями. напирмер

project
|
|- web (содержит контроллеры, имеет доступ только к интерфейсу core-api и DTOшки)
|
|- core api (содержит только интерфейс (какой нибудь BusinessService) и, вероятно, DTO)
|
|- core impl (содежит реализацию BusinessServiceImpl, весь класс помечен @Transactional, внутри редиректит логику уже в "настоящие" сервисы, вероятно конвертирует DTO в сущности JPA)

тут конечно "лишнего" кода будет много


Если конечно расстановка @Transactional имеет хаотичный характер - то, имхо, только интеграционные тесты) которые обращаются в систему через контроллеры
...
Рейтинг: 0 / 0
Как защитить код
    #39870462
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чувствую в этом топике рождается гоммункул.
...
Рейтинг: 0 / 0
Как защитить код
    #39870490
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловВ данном случае (исходим из обсуждаемого примера) получается так:
чтобы дернуть 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.
def program = {
   IO db = DBLogic.run(transactor)
   IO log = saveLog
   IO mail = MailService.sendMail
   IO result = db *> log *> mail /// Тут код все еще не выполняется мы возвращаем всего лишь IO  - аля description of computation
}


Main {
   program.runUnsafe() // Реальный код выполняется здесь, все что находилось в IO тут разворачивается в значения Int, User т.д
}



Во-вторых, ты в чем-то прав, а именно в том что надо прикладывать усилия, чтобы код скопилировался. Но это происходит именно потому что мы прописываем в типе дополнительную информацию(а именно что коду нужно DB connection) - и если он не компилируется(ты поменял реализацию MailService) - то оно и не должно компилироваться, потому что коннекшен тебе не нужен.
И это не недостаток а достоинство. Тебя же не возмущает, если ты заменишь String date на LocalDate date - и тебе надо поменять все места, где используется это поле "чтобы скомпилировалось"?

С наскока это не понять, и даже за месяц.
Никого не уговариваю, хотите верьте, хотите нет - но composable type-safe transactions существуют
...
Рейтинг: 0 / 0
Как защитить код
    #39870494
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTзабыл никпропущено...


Лучший тест - это компиляция, которую не забудешь проранать
а причем в данном случае компиль? код то работает. просто он не так работает как ожидает тс. поведение кода контролируется тестами. имхо. про ваши фп как обходиться без тестов и вообще всё само я пока не вник. не у кого поучиться )

А в том что ты в типах можешь прописать дополнительную логику. Некоторые умельцы чисто на типах пилят игры в пятнашки. И эти типы будут проверяться компилятором. И не по твоему хотению, а всегда. Их невозможно обойти и невозможно "забыть" запустить перед коммитом
...
Рейтинг: 0 / 0
Как защитить код
    #39870499
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTтак вот он я красавец. у меня есть юзкейс.ран(транзактор), а есть скажем юзкейс.ватеварелз(неТранзактар)
и я такой модный программист - просто удаляю эту строку и подменяю другой. оно дальше допустим, работает но уже без транзакции.

Не поянл, какую строку удаляешь и почему оно перестанет работать? Любая операция с базой имеет тип ConnectionIO - единственный способ вытянуть оттуда реальное значение - это предоставить транзактор. Если ты не предоставишь - у тебя будет просто объект типа ConnectionIO и ты его не сможешь никак заюзать.
...
Рейтинг: 0 / 0
Как защитить код
    #39870500
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerзабыл никЕсть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц

Спасибо, отличная статья. Идея о том, что из репозиториев можно возвращать DBIOAction[T] вмето Future[T] (у меня слик) и потом транзакционно интерпретировать в Application Service, лично для меня закрывает один из пробелов между классическим DDD и функциональным стилем.

А DDD никак не противоречит ФП, а очень даже хорошо вписывается, я уже приводил линку - вот неплохая книга.

Functional-Reactive-Domain-Modeling
...
Рейтинг: 0 / 0
Как защитить код
    #39870509
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpзабыл никпропущено...


Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц

Это конечно не совет автору все переписывать с нуля
- просто чтоб знал как бывает иначеох боюсь это никому не надо. Так как усложняет.
Надо 2 транзакции, пиши 2 потока или 2 раза beginTran.
Всё.

Что усложняет? В хорошо написанной программе - Что в ООП, что в ФП по факту будет один и тот же результат(прочитать что-то, записать, залогировать, изменить стейт системы, обработать ошибки). И тебе и там и там надо обработать ошибки, обернуть все в транзакцию, обработать отсутсвие данных и т.д. В случае ООП обычно начинается с красивого кода по happy-path, а проверки на нулл, обработка эксепшенов, всякие корнер - кейсы - это уже по мере тестирования. В случае ФП - у тебя код просто не скопилируется пока ты все это не пропишешь.
Простота ООП иллюзорна и только расслабляет программиста, провоцируя его вовремя дэдлайнов на куяк куяк и в продакшен.
...
Рейтинг: 0 / 0
Как защитить код
    #39870513
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpfixxerфункциональным стилем.а рвзве ФП стало распространено?
Да, идеи ФП проникают в Java, C# и т.д, а не наоборот, как минимум. Тебе 10 лет назад показать код на стримах - ты бы ворочал носом и говорил какое говно, у меня есть циклы
...
Рейтинг: 0 / 0
Как защитить код
    #39870514
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonfixxerпропущено...


В скале так точно. Но даже в джаве последние три года встречаю, в основном, реактивные стримы и Completable Future.
Если посмотреть более шИроко. То ФП давно уже вокруг вас. ФП - это не только программирование.
Это декларативное описание грамматик и смыслов. Формы Бекуса Науэра BNF/EBNF. Xml-schema/DTD.
Просто спеки для всяких DSL. И попытки втащить в языки программирования иммутабельность структур
данных - это всё части ФП.

Именно, так никто ж и не спорит. А что нового было изобретено за последние n лет в ООП?
...
Рейтинг: 0 / 0
Как защитить код
    #39870526
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никТебе 10 лет назад показать код на стримах - ты бы ворочал носом и говорил какое говно, у меня есть циклытак и сейчас говорят ;)
...
Рейтинг: 0 / 0
Как защитить код
    #39870539
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaзабыл никТебе 10 лет назад показать код на стримах - ты бы ворочал носом и говорил какое говно, у меня есть циклытак и сейчас говорят ;)
сейчас на циклах имхо и есть говно. :)
...
Рейтинг: 0 / 0
Как защитить код
    #39870545
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTсейчас на циклах имхо и есть говно. :)
этой фразой ты только что удвоил кол-во страниц в этом топике на 2 ;)
...
Рейтинг: 0 / 0
Как защитить код
    #39870546
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никandreykaTтак вот он я красавец. у меня есть юзкейс.ран(транзактор), а есть скажем юзкейс.ватеварелз(неТранзактар)
и я такой модный программист - просто удаляю эту строку и подменяю другой. оно дальше допустим, работает но уже без транзакции.

Не поянл, какую строку удаляешь и почему оно перестанет работать? Любая операция с базой имеет тип ConnectionIO - единственный способ вытянуть оттуда реальное значение - это предоставить транзактор. Если ты не предоставишь - у тебя будет просто объект типа ConnectionIO и ты его не сможешь никак заюзать.
я к тому что ты можешь что то переписать или переопределить чтоб это стало опциональным требованием.
а так имхо это вообще шаг назад. ты и в джаве мог написать метод типа файндолл или что угодно еще где обязательно надо передать объект типа какой нить транзакшн менеджер. и типа опа видишь теперь точно не забудешь. ога.
и вот чтоб от этого бойлерплейта уйти придумали декларативный (декоративный? :)) способ с аннотацией. а то что сверху имхо это какой-то прошлый век. добро пожаловать в средневековье.
...
Рейтинг: 0 / 0
Как защитить код
    #39870574
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaзабыл никТебе 10 лет назад показать код на стримах - ты бы ворочал носом и говорил какое говно, у меня есть циклытак и сейчас говорят ;)
Так и html предлагают из резалтсета формировать ^)

Я кстати java-стримы тоже не люблю, как и опшионал там особо не юзаю. Потому что они перетянули лишь видимую часть, а не глубинную идею. Красота стримов и опшионалов раскрываются, когда у тебя есть монады и for-comprehension, спроси у андрейки
...
Рейтинг: 0 / 0
Как защитить код
    #39870588
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTя к тому что ты можешь что то переписать или переопределить чтоб это стало опциональным требованием.

Ну можешь да, software меняется, это естественно, так в чем собственно вопрос?
andreykaTа так имхо это вообще шаг назад. ты и в джаве мог написать метод типа файндолл или что угодно еще где обязательно надо передать объект типа какой нить транзакшн менеджер. и типа опа видишь теперь точно не забудешь. ога.

Так и надо делать. А потом появляется куча джунов, которые ни черта не понимают как это работает и ответы на стекфоверфлоу становятся похожи на - ну попробуй добавить аннотацию @Whatever. супер. Правда тут четко надо различать bl-compexity и infrastrcture-complexity. Управление транзакциями - это часть бизнес-логики, хочешь ты этого или нет. Делая ее неявной ты ступаешь на очень скользкую дорожку.

andreykaTи вот чтоб от этого бойлерплейта уйти придумали декларативный (декоративный? :)) способ с аннотацией. а то что сверху имхо это какой-то прошлый век. добро пожаловать в средневековье.
Все ошибаются, раньше я тоже думал что это круто. Любая runtime-аннотация это нетипизированная хрень, которую ни продеюажишь ни пофиксишь, зачем тебе java тогда вообще? Не для сильной типизации ли? А от бойлерплейта уйти можно многими способами, ты сам прекрасно знаешь насколько мощные implicits в scala. Вот тебе кусок логики, полностью обернутый в IO, но ты об этом врядли догадаешься просто посмотрев на код. (Тем не менее код абсолютно без сайд-эффектов)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
override def run(cache:TRef[Cache], network:NetworkService): ZIO[AppEnv, Throwable, List[Profile]] =  for {
        _ <- logger.infoIO(s"Start loop execution")
        userList <- network.loadUserList
        countOfPages <- Parser.countPages(userList)
        pages <- fetchPages(countOfPages)
        userNames <- mapToUserNames(pages)
        inactiveUsers <- getInactiveUsers
        profiles <- fetchAllProfiles(userNames, inactiveUsers, cache)
        _ <- logger.infoIO(s"Elapsed time: $sec s")
      } yield profiles
...
Рейтинг: 0 / 0
Как защитить код
    #39870591
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никchpashaпропущено...
так и сейчас говорят ;)
Так и html предлагают из резалтсета формировать ^)

Я кстати java-стримы тоже не люблю, как и опшионал там особо не юзаю. Потому что они перетянули лишь видимую часть, а не глубинную идею. Красота стримов и опшионалов раскрываются, когда у тебя есть монады и for-comprehension, спроси у андрейки
Стримы это вообще - последнее дело. Вот когда в айти входит очередной джун-вайтишник - то на собесе
оказывается что он стримы знает а на циклах блджад ничего написать не может. Более того не понял
идею зачем они вообще нужны.

И кто педалит вообще идею о том что библитечная фича лучше языковой? Убил-бы.
...
Рейтинг: 0 / 0
Как защитить код
    #39870599
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСтримы это вообще - последнее дело. Вот когда в айти входит очередной джун-вайтишник - то на собесе
оказывается что он стримы знает а на циклах блджад ничего написать не может. Более того не понял
идею зачем они вообще нужны.


Ну и зачем они нужны?
Хотя слабо представляю как можно "знать" стримы и не знать циклы.
Циклы - такой же анахронизм как и удаление памяти в C++ приложениях. И да, большинство джава джунов сильно удивятся вопросу про освобождение памяти.

Что такое цикл? Это последовательность
1) берем размер коллекции // это будет повторяться во всех циклах в любом приложении
2) создаем счетчик от 0 до размера // это будет повторяться во всех циклах в любом приложении
3) берем элемент по текущему инджексу // это будет повторяться во всех циклах в любом приложении
4) исполняем кастомную логику
5) инкрементируем текущий индекс и проверяем закончили ли // это будет повторяться во всех циклах в любом приложении
6) если не закончили идем на пункт 1// это будет повторяться во всех циклах в любом приложении

А что мы делаем если // это будет повторяться во всех циклах в любом приложении ??
Правильно - наворачиваем абстракцию, и передаем в нее параметром кастомную логику - someAbstraction(doWithElement)
...
Рейтинг: 0 / 0
Как защитить код
    #39870603
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
И кто педалит вообще идею о том что библитечная фича лучше языковой? Убил-бы.

Зависит от.
...
Рейтинг: 0 / 0
Как защитить код
    #39870608
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНу и зачем они нужны?
Хотя слабо представляю как можно "знать" стримы и не знать циклы.
Циклы - такой же анахронизм как и удаление памяти в C++ приложениях. И да, большинство джава джунов сильно удивятся вопросу про освобождение памяти.


Основная идея описана здесь https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
Обратите также внимание на свойства non-interfering и stateless.

От себя скажу что стримы в Java может быть и являются чем-то новым для Java-кодеров. Но для ФП
это старый боян которому уже более полу-века. Отголоски ленивой обработки списков а особо важно
что иммутабельных - это основа программирования вообще любой ФП парадигмы На ней строятся и
циклы и логика и структуры данных.

В Java streams введены в угоду какой-то части пользователей которые видели Scala и задались вопросом
- а почему собсно у нас нет такой языковой возможности? Языковую им не дали. Но дали библиотеку.
И дали синтаксис анонимных функций для удобства.
...
Рейтинг: 0 / 0
Как защитить код
    #39870612
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonзабыл никНу и зачем они нужны?
Хотя слабо представляю как можно "знать" стримы и не знать циклы.
Циклы - такой же анахронизм как и удаление памяти в C++ приложениях. И да, большинство джава джунов сильно удивятся вопросу про освобождение памяти.


Основная идея описана здесь https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
Обратите также внимание на свойства non-interfering и stateless.

От себя скажу что стримы в Java может быть и являются чем-то новым для Java-кодеров. Но для ФП
это старый боян которому уже более полу-века. Отголоски ленивой обработки списков а особо важно
что иммутабельных - это основа программирования вообще любой ФП парадигмы На ней строятся и
циклы и логика и структуры данных.

В Java streams введены в угоду какой-то части пользователей которые видели Scala и задались вопросом
- а почему собсно у нас нет такой языковой возможности? Языковую им не дали. Но дали библиотеку.
И дали синтаксис анонимных функций для удобства.

АА, ты про это?
Ну да, я ж и говорю что в java стримы - это ни то ни се.. так, верхи идеи.
В scala они и stateless и inferrable, это подразумевается само собой..
...
Рейтинг: 0 / 0
Как защитить код
    #39870614
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепутал inferrable и non-interfering
...
Рейтинг: 0 / 0
Как защитить код
    #39870651
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никchpashaпропущено...
так и сейчас говорят ;)
Так и html предлагают из резалтсета формировать ^)

Я кстати java-стримы тоже не люблю, как и опшионал там особо не юзаю. Потому что они перетянули лишь видимую часть, а не глубинную идею. Красота стримов и опшионалов раскрываются, когда у тебя есть монады и for-comprehension, спроси у андрейки
еще надо отметить что в скале фор это не тот фор что в жаве. вернее, можно использовать как ТОТ но используют для другого. т.е. в скале фор используется прям повсеместно )) с оговоркой не для итераций и каких то сайдеффектных действий а с целью уплощения вложенностей при работе с монадами.
да. прям ненарадуюсь. но я вот не уверен что это прям ФП, мне почему то кажется что фп это всего лишь некоторый ряд ограничений. а повсеместное втыкание монад и прочего - это стиль и подход. ФП - парадайм. мы не можем переопределять мы не можем писать сайдэффекты мы всегда возвращаем значение операции. вроде всё. а как ты это сделаешь - ну дело твое. просто классическая джава не очень к этому склоняет.
а так скала мне прям очень нравится но я чем больше ею пользуюсь тем больше понимаю что в ней СТОЛЬКО всего что изучать не переизучать.

типа вот была джава. сидели программисты и думали вон она скучная хотим такую же но 100500 свистелок-перделок, чтоб не разобраться - и в комплекте. а.. окей - на те скалу ))) развлекайся бро.
...
Рейтинг: 0 / 0
Как защитить код
    #39870654
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTсидели программисты и думали вон она скучная хотим такую же но 100500 свистелок-перделок, чтоб не разобраться - и в комплекте. а.. окей - на те скалу ))) развлекайся бро
напоминает анекдот про студента перед сдачей диплома и фею
...
Рейтинг: 0 / 0
Как защитить код
    #39870656
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никandreykaTя к тому что ты можешь что то переписать или переопределить чтоб это стало опциональным требованием.

Ну можешь да, software меняется, это естественно, так в чем собственно вопрос?
andreykaTа так имхо это вообще шаг назад. ты и в джаве мог написать метод типа файндолл или что угодно еще где обязательно надо передать объект типа какой нить транзакшн менеджер. и типа опа видишь теперь точно не забудешь. ога.

Так и надо делать. А потом появляется куча джунов, которые ни черта не понимают как это работает и ответы на стекфоверфлоу становятся похожи на - ну попробуй добавить аннотацию @Whatever. супер. Правда тут четко надо различать bl-compexity и infrastrcture-complexity. Управление транзакциями - это часть бизнес-логики, хочешь ты этого или нет. Делая ее неявной ты ступаешь на очень скользкую дорожку.

andreykaTи вот чтоб от этого бойлерплейта уйти придумали декларативный (декоративный? :)) способ с аннотацией. а то что сверху имхо это какой-то прошлый век. добро пожаловать в средневековье.
Все ошибаются, раньше я тоже думал что это круто. Любая runtime-аннотация это нетипизированная хрень, которую ни продеюажишь ни пофиксишь, зачем тебе java тогда вообще? Не для сильной типизации ли? А от бойлерплейта уйти можно многими способами, ты сам прекрасно знаешь насколько мощные implicits в scala. Вот тебе кусок логики, полностью обернутый в IO, но ты об этом врядли догадаешься просто посмотрев на код. (Тем не менее код абсолютно без сайд-эффектов)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
override def run(cache:TRef[Cache], network:NetworkService): ZIO[AppEnv, Throwable, List[Profile]] =  for {
        _ <- logger.infoIO(s"Start loop execution")
        userList <- network.loadUserList
        countOfPages <- Parser.countPages(userList)
        pages <- fetchPages(countOfPages)
        userNames <- mapToUserNames(pages)
        inactiveUsers <- getInactiveUsers
        profiles <- fetchAllProfiles(userNames, inactiveUsers, cache)
        _ <- logger.infoIO(s"Elapsed time: $sec s")
      } yield profiles



у имплиситов другая беда (опять же на мой взгляд я не профи-скала и думаю что юзаю ее на 10% от возможностей), у них беда в том что оно где то как то может навеситься-переопределиться а ты и знать не будешь что за чухня происходит и почему. хорошо если ИДЕ подсветит. а если нет ну будешь клики нарезать. особенно если код незнакомый.

насчет декораторов (мне кажется, это более верное название, практикуемое в ноде и несте) помню был движ несколько лет назад в сторону аспектно-ориентированного программирования. типа вот СОЛИД вот буква О вот АОП - это ж прям вот то что надо давайте расширять функционал без изменения базового кода. давайте вешать на него аспекты и аспекты на аспекты а потом еще аспекты. и опа. чо за фигня чо за макароны я вашу душу почему это тут происходит. )) вроде потом отъехали. и смотрю в новых фреймворках успешно идею похерили. а в старых рекомендуют юзать только для мониторинга и логирования. угу.

так и с имплиситами. пока это забавно. а дальше - time will say
...
Рейтинг: 0 / 0
Как защитить код
    #39870657
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaandreykaTсидели программисты и думали вон она скучная хотим такую же но 100500 свистелок-перделок, чтоб не разобраться - и в комплекте. а.. окей - на те скалу ))) развлекайся бро
напоминает анекдот про студента перед сдачей диплома и фею

программист жава: господи, эх поеб-ться бы!
господь: на те скалу, еб-сь, сын мой.

ты про это?
...
Рейтинг: 0 / 0
Как защитить код
    #39870678
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
у имплиситов другая беда (опять же на мой взгляд я не профи-скала и думаю что юзаю ее на 10% от возможностей), у них беда в том что оно где то как то может навеситься-переопределиться а ты и знать не будешь что за чухня происходит и почему. хорошо если ИДЕ подсветит. а если нет ну будешь клики нарезать. особенно если код незнакомый.

так и с имплиситами. пока это забавно. а дальше - time will say

В Scala3 попытаются решить эту проблему. На самом деле все дело в том что у имплиситов 4 варианта использования - и только один из них ведет к проблемам что ты описываешь. Они введут другое слово для этого, так будет понятнее.
...
Рейтинг: 0 / 0
Как защитить код
    #39870688
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да? а как тебе переименование в импортах? :)
...
Рейтинг: 0 / 0
Как защитить код
    #39870689
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTда? а как тебе переименование в импортах? :)
Помню был проект где был class Document аж в трех разных пакетах.
Типа xml.Document, и еще два штуки подобных. Ох и треш и содомия была
когда все три надо было использовать в одном сорце.
...
Рейтинг: 0 / 0
Как защитить код
    #39870691
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имплисит классы тоже тот еще кладезь. конечно не такой как переопределение или проброс значений, но там хоть ИДЕ справляется. фальшивые методы палочкой подрисовывает.
...
Рейтинг: 0 / 0
Как защитить код
    #39870695
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTпрограммист жава: господи, эх поеб-ться бы!
господь: на те скалу, еб-сь, сын мой.


ты про это?

ага, в ночь перед релизом ;)
...
Рейтинг: 0 / 0
Как защитить код
    #39870700
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTда? а как тебе переименование в импортах? :)
Юзал один раз, но реально надо было - ситуация 1-1 как mayton описывает. Никто ж не заставляет тебя перемиеновывать, а раз в году сгодится
...
Рейтинг: 0 / 0
Как защитить код
    #39870710
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не мог переименовать. Сторонние библиотеки. Со сложной лицензией.
...
Рейтинг: 0 / 0
Как защитить код
    #39870731
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не мог переименовать. Сторонние библиотеки. Со сложной лицензией.

в скале можно сделать так
Код: java
1.
2.
3.
4.
5.
6.
import xml.Document => XMLDocument

Main {
   val doc = Document()
   val xml = XMLDocument()
}



Мы про это
...
Рейтинг: 0 / 0
Как защитить код
    #39870733
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да яж про Java.
...
Рейтинг: 0 / 0
76 сообщений из 76, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как защитить код
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]