Илья
да
Daniel
вот ему этот вопрос и задайте :)
Vladislav
нет, go-style comment это не спека.
А что тогда спека в go для пакета?
Daniel
он или пошлет вас, или рассказет, что рабочих рук нехватка, и делать лишнее - граничит с саботажем
Pawel
нет, go-style comment это не спека.
в каком же виде надо писать спеку тогда?
Mannaro
Товарищи, привет! Кто sqlx юзает? Когда в функции стартуешь транзакцию, надо ли по defer ее роллбечить, если вдруг случится что? Паника, например?
Mannaro
А как он понимает, что надо отменить транзакцию?
Daniel
а?!
Daniel
обычно, ели транзакция не прошла успешно - ее надо ролбечить
Daniel
но штука в том, что транзакция держит коннект к базе
Daniel
и, если ее не завершать - коннекты быстро заканчиваются
Илья
Товарищи, привет! Кто sqlx юзает? Когда в функции стартуешь транзакцию, надо ли по defer ее роллбечить, если вдруг случится что? Паника, например?
Since transactions are connection state, the Tx object must bind and control a single connection from the pool. A Tx will maintain that single connection for its entire life cycle, releasing it only when Commit() or Rollback() is called. You should take care to call at least one of these, or else the connection will be held until garbage collection.
Daniel
что происходит с коннектом, когда до транзакции добирается gc - я не в курсе, надо код смотреть.
Daniel
но, скорее всего, ничего хорошего - деструкторов-то нет
Mannaro
Да, я читал это. Жаль, что в го нет деструкторов( Я просто даже не знаю, как поступить. Если вешать defer, то есть шанс, что паника случится уже после нормального коммита.
Daniel
а надо разбить код по функциям правильно
Daniel
чтобы не было такой опасности
Daniel
или выставлять по комиту флаг, и проверять его в deffer
Daniel
но первый вариант лучше
Илья
обычно именованный возвращаемый параметр + блок // Making sure the tx is closed regardless of the result defer func() { if err != nil { tx.Rollback() return } err = tx.Commit() }()
Mannaro
но первый вариант лучше
ага, лучше, когда у тебя не используются левые функции для отправки запроса в базу, которые могут паниковать
Daniel
лучше, когда у вас код правильно структурирован
Mannaro
Я понял, надо делать функцию, которая начинается с begin, а заканчивается коммитом) Тогда любая паника может случится только внутри транзакции (ну или при коммите, если соедниение пропало, но тут уже все равно)?
Daniel
вообще, конечно, лучше бы панику не ловить.
Mannaro
ну это понятно
Mannaro
но мало-ли что
Daniel
ваша программа завершится, транзакция откатится по закрытию соединения
Daniel
вот как раз на случай мало ли что лучше и не ловить
Mannaro
а если это сервер, который также обрабатывает еще 1000 клиентов, у которых все ок?)
Daniel
если хлопнулся ваш код - лучше заменить панику на возврат ошибки
Pawel
ваша программа завершится, транзакция откатится по закрытию соединения
вот я это имел ввиду говоря, что в общем случае явеый роллбэк не нужен
Daniel
если не ваш - скорее всего, либа, которая панику кинула, продолжать работу не может
Dmitry
Вброшу про тестирование публичных/приватных методов: https://youtu.be/yszygk1cpEc?t=1925
Илья
видимо, это тоже опилка 🙂
Daniel
думаете?
Илья
ну, аргументы у него такие же, если что-то внутри сложное, нужно это тестировать, - чтобы быть уверенным во всех слоях, и чтобы при ошибке - сразу понимать где именно и что сломали
Daniel
аргументы в пользу какого тезиса у него такие же?
Daniel
тут проблема та же, что и с большинством тестов, какие я видел
Daniel
ваша позиция не основана ни на чем, кроме ваших же ощущений
Daniel
и тесты вы такие же пишете - ни на чем не основанные, кроме ваших предположений
Daniel
и необходимость их написания обосновываете вашими же соображениями о здравом смысле
Daniel
я спросил - зачем нужны тесты
Daniel
ответ был единственный: "чтобы ошибка не попала в прод"
Илья
3 пункт на слайде, на который дана ссылка "some people take it too far and choose only integration/acceptance tests" - это то, о чем вы говорите
Daniel
нет
Daniel
не об этом
Daniel
integration/acceptance - это не про юнит-тесты вообще
Илья
как это - у вас есть спека - это acceptance - то, что волнует заказчика
Daniel
а вот это - опилки
Daniel
про заказчика мы поговорили уже
Илья
что тут скажешь, поэтмоу и говорю, докладчик тоже опилка, как и часть этого чата
Daniel
скажите - а вы всегда стоите на своем до конца?
Илья
когда есть вермя, и спорим явно о цвете фламастеров, почему бы и нет, ваше подход правилен для 70% кода, который я писал, но говорить о том, что это абсолют - странно
Daniel
абсолют...
Daniel
если делать правильно
Daniel
1. пишете спеку на внутреннюю функцию
Daniel
2. утверждаете ее у тимлида, вносите как-то в доку (как?)
Daniel
3. пишете в соответствии со спекой тесты
Daniel
4. отправляете их тимлиду на ревью
Daniel
5. он тратит примерно 10 минут, чтобы объяснить вам, почему отдельный тест не нужен, все, что надо, покрыто тестами публичной части
Daniel
6. вы продолжаете стоять на своем
Daniel
вот это настоящий абсолют, нерушимый
Илья
если задача сделана в срок, то тимлида не волнует, на каком уровне разработчик тестирует пакет, также наличие спеки внутренних функций, а стайл гайды вырабатываются командой на основании личного опыта участников
Kirill
вопрос
Kirill
а есть ли у вас вообще тимлид?
Kirill
или это тоже опилки?
Илья
это кому вопрос?
Илья
оу, тимлид есть, с ним как раз согласовываются спеки для внешних интерфейсов
Kirill
а кто будет проверять, что спеке всё соответствует? что спека покрыла все случаи? что реализация также покрыла все случаи?
Daniel
примерно 90% того кода, что я написал, спеки не имели, не имели и тестов, соответственно
Kirill
почему разработка спеки не включает в себя разработку тестов?
Daniel
хорошо, когда имплементишь что-то по RFC - там спека есть
Илья
может включать, может не вклюать, зависит от процесса, у нас такого нет
Kirill
всем неудобно
ну вот. и я просто стараюсь не писать ничего без тестов