Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Как защитить код  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1844
Добрый день.

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

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

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

как делать?

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

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


Спасибо .
1 окт 19, 14:53    [21983933]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1844
как простой пример всем понятный

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

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

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

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

может тест хитрый написать ??
1 окт 19, 14:53    [21983935]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
Atum1,

Написать тесты на spring-test
1 окт 19, 14:56    [21983940]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
переходить на Scala и ФП)
1 окт 19, 15:06    [21983950]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Именно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.
1 окт 19, 15:08    [21983954]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
chpasha
Member

Откуда:
Сообщений: 8441
в любом случае у нас внутри код, который должен выполниться в одной транзакции - это и надо тестировать. а уж как это достигается, с помощью Transactional или условных beginTransaction/commitTransaction - дело третье. При определенном везении Transactional и вовсе не будет работать, так что его наличие или даже отсутствие ни о чем не говорит

забыл ник
это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript
это про Transactional или про return "redirect:/showresult/${id}" из соседнего топика?
1 окт 19, 15:21    [21983975]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
chpasha

забыл ник
это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript
это про Transactional или про return "redirect:/showresult/${id}" из соседнего топика?


И про то и про другое. Хотя первоначально имелись ввиду любые runtime-аннотации
1 окт 19, 15:32    [21983999]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26739
Atum1,

тесты надо написать, что падают, если сняли анотацию @Transaction
и выполнять эти тесты на ветке перед мёржем
и если они упали, то запрещать мёрж
1 окт 19, 15:50    [21984037]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
забыл ник
Именно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.
да.
Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.
Аффтар!
— показать ему что упало когда он снял аннотацию.
- с разрешения руководства писать тесты на транзакции.
Он ведь мог и
connection.beginTran
не написать.
1 окт 19, 15:57    [21984049]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42385
Atum1,

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

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

Если на @Transaction нельзя написать модульные ... интеграционные или performance
тесты - то возможно они .... не нужны.
1 окт 19, 16:01    [21984056]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3334
Atum1,

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

protected void myImportantMethod() {
	assert txService.isActive();
}
1 окт 19, 16:06    [21984061]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
chpasha
Member

Откуда:
Сообщений: 8441
mayton
может превышать полученный полезный эффект.

особенно когда окажется, что Senior поудалял там аннотации не по ошибке Картинка с другого сайта.
1 окт 19, 16:08    [21984062]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Андрей Панфилов
Atum1,

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

protected void myImportantMethod() {
	assert txService.isActive();
}


Которое также легко удаляется пьяным сеньором
1 окт 19, 16:13    [21984067]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
PetroNotC Sharp
забыл ник
Именно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.

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


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

Это конечно не совет автору все переписывать с нуля - просто чтоб знал как бывает иначе
1 окт 19, 16:18    [21984073]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42385
Я-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди
к Atum и спроси разрешения".

Все. Баста. Решение на 0.001 story point.
1 окт 19, 16:21    [21984080]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
Андрей Панфилов
Atum1,

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

protected void myImportantMethod() {
	assert txService.isActive();
}
Такая проверка в рантайме, если код сломан уже ничего не даст. Процесс ревью кода может помочь. А лучше иметь интеграционные или приемочные тесты. Но тут насколько есть ресурсы на написание таких тестов.
1 окт 19, 16:33    [21984090]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3334
забыл ник
Есть куда деваться. Как раз вот статья вышла хорошая, но это нужно иметь кое-какие знания о ФП чтобы понять.
Тыц
Чет там какой-то обман кмк.

// 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 я могу понять в транзакции он будет выполняться или нет?
1 окт 19, 16:58    [21984134]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3334
забыл ник
Андрей Панфилов
Atum1,

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

protected void myImportantMethod() {
	assert txService.isActive();
}


Которое также легко удаляется пьяным сеньором
а зачем удалять? У нас же нет контракта вида "где-то должны стоять аннотации", а есть контракт вида "этот метод требует выполнения в транзакции", соответственно assert прекрасно этот контракт обеспечивает и никакие дополнительные тесты писать не нужно, достаточно то что есть (если конечно есть) запускать с -ea
1 окт 19, 17:03    [21984139]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
chpasha
Member

Откуда:
Сообщений: 8441
Андрей Панфилов
а зачем удалять?

сеньор-то - пьяный. а в коде на Scala он и трезвый побоится удалять, разве что все скопом ;)
1 окт 19, 17:09    [21984144]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
andreykaT
Member

Откуда:
Сообщений: 2421
Atum1
Добрый день.

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

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

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

как делать?

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

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


Спасибо .

поведение кода закрепляют тесты. ответ - надо покрыть код тестами.
1 окт 19, 17:15    [21984146]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
andreykaT
Member

Откуда:
Сообщений: 2421
PetroNotC Sharp
забыл ник
Именно поэтому я не люблю спринг, и всякую эту контейнерную шалаболду. По сути аннотации - это нетипизированный DSL внутри Java-приложения, факстически ни чем не отличаясь от какого-нибудь javascript.
да.
Но жто декларативное управление транзакциями. Мейнстрим счас. Куда деваться.
Аффтар!
— показать ему что упало когда он снял аннотацию.
- с разрешения руководства писать тесты на транзакции.
Он ведь мог и
connection.beginTran
не написать.

в модном слике никаких аннотаций транзакций нет (а жаль!)
1 окт 19, 17:16    [21984148]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
andreykaT
Member

Откуда:
Сообщений: 2421
mayton
Я-бы ограничился обычным каментом. Типа - "Перед тем как удалять - хорошо подумай. Если все таки решил удалять подойди
к Atum и спроси разрешения".

Все. Баста. Решение на 0.001 story point.

ща мода пошла у некоторых не писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал. ))) у узбеков есть поговорка - попроси принести тюбетейку - они тебе принесут тюбетейку вместе с головой.
1 окт 19, 17:19    [21984150]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Андрей Панфилов

// Re-useable effect descriptions
val sendEmail: IO[Unit] = IO(println("Sending email"))


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


Никак, но в этом и весь цимус, что вам это и не надо.
sendEmail - утилитная функция, которую можно вызвать как с транзакции так и вне, ее тип просто говорит что это IO - то есть некий сайд эффект.
Когда же ты делаешь композицию функций, а-ля insertToDb.flatMap(_ => sendEmail) - тип это выражения уже Coneection[A] - то есть нечто что будет выполнено только если ему предоставить коннекшен. А чтобы выполнить ConnectionIO - ты обязан предоставить Transactor, иначе не скомпилируется.
1 окт 19, 17:23    [21984154]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
chpasha
Member

Откуда:
Сообщений: 8441
andreykaT
не писать вообще принципиально никаких комментов по коду. потому что мартин так в своей книжке чистый код сказал

Мартин ничего не говорил про "не писать принципиально"
автор
Therefore, though comments are sometimes necessary, we will expend significant energy to minimize them.


Узбекская поговорка это только подтверждает ;)
1 окт 19, 17:25    [21984157]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Андрей Панфилов
забыл ник
пропущено...


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


Убедил, но проблема того что это детектится лишь в рантайме - остается, хотя лучше чем было
1 окт 19, 17:25    [21984158]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Java Ответить