- 1
page < records.total_pages ? next_page_exist = true : next_page_exist = false
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
page < records.total_pages ? next_page_exist = true : next_page_exist = false
очевидное должно быть очевидны
KoWe4Ka_l7porpaMMep 29.03.2021 11:42 # +1
MAPTbIwKA 29.03.2021 14:40 # 0
чувак
next_page_exist = (page < records.total_pages)
JloJle4Ka 29.03.2021 15:07 # +2
Вообще я бы написал вот так (недавно узнал про лямбды):
bormand 29.03.2021 15:08 # +2
MAPTbIwKA 29.03.2021 17:32 # +4
В некотором смысле тут есть и паттерн "стратегия", потому что логика инкапуслирована в класс.
Мой вариант тренарника:
PolinaAksenova 30.03.2021 13:01 # +2
Такие конструкторы лучше делать constexpr T() noexcept (если все инициализаторы членов соответствуют), чтобы можно было безболезненно наследовать constexpr-классы.
> bool next_page_exists() const noexcept
> operator bool() const noexcept
page() и total_pages() не объявлены как noexcept, поэтому лучше noexcept убрать (иначе залётное исключение из page() мгновенно убьёт весь процесс).
> ~my_useful_class_impl() override = default;
Это можно не писать, неявные деструкторы классов-наследников виртуальные по умолчанию (если у класса-предка есть виртуальный деструктор).
> foo.insert(foo.begin(), 1);
foo.push_back() сначала 2, потом 1?
std::vector<int> foo = { 1, 2, /* 3 */ /* Uncomment to make true */ }; ?
bormand 30.03.2021 13:56 # +1
std::vector<int> foo { 1, 2, /* 3 */ /* Uncomment to make true */ }; ?
JloJle4Ka 30.03.2021 13:59 # 0
MAPTbIwKA 30.03.2021 14:55 # +2
Спасибо.
>constexpr
всё время забываю(
>е объявлены как noexcept
надо бы объявить. Хотя я не уверен на счет гарантий у размера у вектора
>неявные деструкторы классов-наследников виртуальные по умолчанию
Я не настоящий крестовик, так что мне спокойнее всё писать явно: удалять все ненужные конструкторы и объявлять все нужные деструкторы.. Хотя наверное хря
>сначала 2, потом 1?
ну это разве важно?:)
> std::vector<int> foo = { 1, 2, /* 3 */ /* Uncomment to make true */ }; ?
да, с инициализатором расивее, спасибо
bormand 30.03.2021 14:58 # +1
По стандарту noexcept там, не сцы. Да и интуитивно size() -- это просто число или разность джвух указателей. Нечему бросать исключения.
MAPTbIwKA 30.03.2021 14:59 # +1
В следующей версии своего объектно-ориентированного фреймворка для создания тренарников обязательно так сделаю. В платной версии
PolinaAksenova 30.03.2021 15:18 # +2
Это полезно, но для базовых классов/интерфейсов noexcept — очень "сильный" модификатор, его нужно ставить с осторожностью. С ним наследники должны в обязательном порядке ловить и обрабатывать, например, std::bad_alloc на каждой аллокации (стандартных контейнеров, std::make_***(), ...), а это далеко не всегда удобно.
MAPTbIwKA 30.03.2021 15:43 # 0
В общем можно просто сдохнуть при bad_alloc?
А что будет, если я обману: скажу noexcept, а кину bad_alloc?
Какой=то десктруктор может не вызваться?
bormand 30.03.2021 15:47 # +1
В гугловском кодестайле так и предлагается, насколько я помню. Упало -- да и хуй с ним.
Но в общем случае каким-то проектам нужно переживать временное out of memory.
MAPTbIwKA 30.03.2021 15:48 # 0
Я это и назвал "строишь логику в зависимости от доступности свободной памяти".
Это сильное колдунство кмк:)
bormand 30.03.2021 15:50 # +1
Fike 30.03.2021 15:50 # +3
заебали переизобретать пхп
MAPTbIwKA 30.03.2021 16:14 # 0
Поля хороший пример привела с вебсервером. Жабаёбы тоже примерно так делают: ловить NPE например вообще-то не нужно обычно, но если ты контейнер сервлетов то можно и поймать, и вернуть 500.
bormand 30.03.2021 15:48 # 0
Никакой не вызовется, емнип. Будет сразу std::terminate.
PolinaAksenova 30.03.2021 15:49 # +1
MAPTbIwKA 30.03.2021 16:16 # +1
Но если я не делаю что-то для "внешнего кода", "для сторонних разработчиков" то наверное я не должен ловить bad_alloc .
Если конечно я не пытаюсь как-то "переживать временное out of memory", как говорил Борманд
Fike 30.03.2021 16:21 # +3
Нужно чтобы каждый плагин жил в своем процессе и работал по IPC.
Словил сегфолт? Мне похуй.
Пытаешься передать структуру с левыми ссылками? Мне похуй, у меня свой address space.
Конфликт зависимостей? Мне похуй, вот тебе отдельный процесс, впендюривай туда какие хочешь версии библиотек и никакой хуйни с конфликтами плагинов.
Выжрал памяти? Мне похуй, а еще мне issues не будут засирать что это моя платформа видите ли много жрет.
MAPTbIwKA 30.03.2021 16:25 # +1
В целом конечно ты прав (и тред такой есть), но IPC не бесплатен. В чужое адресное пространство ходить (не через шаред мемори а через сокеты/пайпы) это МОЖЕТ БЫТЬ медленно.
Fike 30.03.2021 16:27 # 0
Там еще когда-то language server для иде хотели реализовывать, эх.
MAPTbIwKA 30.03.2021 16:29 # +1
Ну вот выселил ты клиента СУБД в отдельный процесс и общаешься с ним асинхронными месседжами. Заебись же!
Но тут он взял, да и помер. И какой толк от всего остального приложения, если оно даже в СУБД писнуть не может?
В целом же снова посылаю тебя к блеску и нищете микроядер, харда и пр:)
Fike 30.03.2021 16:32 # 0
А в целом если основное приложение знает какие у него плагины, то просто перезапускает процесс и не течет
MAPTbIwKA 30.03.2021 16:32 # 0
В тред приглашается Снаут с рассказом про акторы в эрланге
Fike 30.03.2021 16:36 # 0
но вообще есть еще кое-какая беда, конечно. плагин может взрываться хоть каждые пять минут, а конечный юзер будет охуевать почему у него то есть кнопка, то нет.
CHayT 30.03.2021 17:09 # 0
Передаю слово: https://www.youtube.com/watch?v=HyiSYHfESX4 (мотайте на 17:55) Там в общих чертах говорится про акторы и let it crash.
Клиент субд в отдельномых процессеах используется сплошь и рядом. Если клиент покрашится, в простейшем случае он тупо утянет за собой процесс, который его использует, через link, web-server, создавший процесс, это задетектит и вернёт 500.
Desktop 30.03.2021 17:13 # 0
ма-те-ма-ти-ком?
CHayT 30.03.2021 17:13 # +2
Desktop 30.03.2021 17:15 # 0
bormand 30.03.2021 17:24 # 0
Desktop 30.03.2021 17:25 # +4
CHayT 30.03.2021 17:27 # +3
Desktop 30.03.2021 17:29 # 0
bormand 30.03.2021 17:30 # +3
bormand 30.03.2021 16:33 # +1
Ну ребутнётся, делов то. Супервизор же у него какой-то есть. Да и репликацию никто не отменял.
MAPTbIwKA 30.03.2021 16:37 # 0
Если это поможет. А если он не поднимица обратно?
>репликацию
Это можно, но это нужно делать. Упал питеху, другой поднял его знамя
Fike 30.03.2021 16:38 # 0
Проблемы пхпшника, нарисовавшего плагин + exponential backoff на попытки поднять
MAPTbIwKA 30.03.2021 16:39 # 0
Fike 30.03.2021 16:40 # +2
Fike 30.03.2021 16:45 # 0
О, даешь кодогенерацию на языке программирования «systemd service». Серьезно, пуусть качает плагин по имени, засовывает его системд-сервисом в .config/systemd/user/ и вообще ничего не знает про проблемы супервизора. Нужно отключить плагин? Выключил сервис системд да и делов.
MAPTbIwKA 30.03.2021 16:45 # 0
Кстати, systemd еще и сокет умеет за тебя сделать. Скоро в ядро systemd еще и интеграцию с твиттером прикрутят. Сейчас systemd не работает без dbus, а скоро без аккаунта в твиттере рабоатть не будет
Fike 30.03.2021 16:47 # 0
MAPTbIwKA 30.03.2021 16:51 # +1
Милениалы в конце концов изобретут DCOM. Так им и надо
PolinaAksenova 30.03.2021 15:15 # +2
Это правильно. Опытные крестовички (ударение по ситуации) знают, что у базового класса обязательно надо удалять дефолтные конструкторы копирования/перемещения, иначе потом кто-нибудь скопирует объект через ссылку на родителя и получит огрызок объекта.
> ну это разве важно?:)
Не знаю, я не вникала, на кой ляд тебе эта эмуляция push_front(...) через insert(begin(), ...) сдалась, но я в чужие дела не лезу, хочешь вставлять в начало, значит есть зачем.
Soul_re@ver 30.03.2021 23:12 # 0
MAKAKA 30.03.2021 23:39 # 0
Soul_re@ver 30.03.2021 23:52 # +1
MAKAKA 30.03.2021 23:56 # 0
Алсо, я не понимаю как наследник A может дать или не дать свое согласие на копирование
Soul_re@ver 31.03.2021 00:02 # 0
Куда говорит его хранить аллокатор. Аллокатор по умолчанию в С++ выделяет память оператором new.
> на что указывает z_ptr
На вновь созданный объект. Фактически это было бы эквивалентно
А* z_ptr = new typeid(*x_ptr)(*x_ptr);
если бы так можно было делать.
Объявить clone можно было бы как
MAKAKA 31.03.2021 00:04 # 0
* узнать через RTTI какой это объект
* создать в куче этот объект и вызвать у него копирующий коснтруктор, передав туда A, скащенный в нужный объект?
Звучит логично, но не очень понятно что делать, если объект (или один из его предков) копирования не позволяет
Алсо, а поинтер на кучу будет какой? Умный, або обычный? In the latter case его нужно явно delete потом?
Soul_re@ver 31.03.2021 00:09 # +1
В духе остальной стандартной библиотеки — кидать исключение.
> Алсо, а поинтер на кучу будет какой? Умный, або обычный?
В идеале, сделать перегрузки для всех стандартных указателей. Какой засунул — такой и получил. В крайнем случае, полученный сами обернут, чтобы вручную не удалять.
MAKAKA 31.03.2021 00:16 # 0
bormand 01.04.2021 11:02 # 0
Soul_re@ver 01.04.2021 11:42 # 0
Хотя всем остальным видам new нужно явно указывать тип. Не подходит.
bormand 01.04.2021 12:12 # +1
JloJle4Ka 01.04.2021 12:13 # 0
Desktop 07.06.2021 18:46 # 0
MAPTbIwKA 29.03.2021 15:11 # 0
JloJle4Ka 29.03.2021 15:17 # +1
MAPTbIwKA 29.03.2021 15:19 # +2
MAPTbIwKA 29.03.2021 17:01 # +2
Рубисты любят лямбды и даже по массиву итерируются блоком.
Правда явно выбирать что и как захватывать вроде бы можно только в крестах (и еще в одном помоечном языке, который я не знаю)
Desktop 07.06.2021 18:46 # 0
PolinaAksenova 30.03.2021 14:29 # +1
Полный код: https://wandbox.org/permlink/vmVy2nsvDAkcUjeI
guest6 30.03.2021 14:34 # +4
bormand 30.03.2021 14:57 # +3
JloJle4Ka 30.03.2021 15:26 # +2
Пил с Полиной молочко,
А теперь болит <_ _ _ _>.
Отгадка:
guest6 30.03.2021 15:28 # +2
JloJle4Ka 30.03.2021 15:29 # +1
bormand 30.03.2021 15:51 # +1
Fike 30.03.2021 15:55 # +3
JloJle4Ka 30.03.2021 15:58 # 0
https://otvet.mail.ru/question/198958680
MAPTbIwKA 30.03.2021 15:31 # +2
CHayT 29.03.2021 11:44 # +5
bormand 29.03.2021 12:03 # +2
Soul_re@ver 29.03.2021 12:17 # +3
bormand 29.03.2021 13:53 # 0
Soul_re@ver 29.03.2021 14:05 # 0
JloJle4Ka 29.03.2021 14:21 # 0
bormand 29.03.2021 14:22 # 0
JloJle4Ka 29.03.2021 14:30 # 0
bormand 29.03.2021 15:09 # +1
Fike 29.03.2021 20:27 # 0
JloJle4Ka 30.03.2021 09:09 # −1
@
if a not == 42: ...
@
traceback (most recent call last):...
@
недовольно урчиш
OCETuHCKuu_nemyx 30.03.2021 15:28 # 0
JloJle4Ka 07.06.2021 10:31 # 0
DypHuu_niBEHb 07.06.2021 18:05 # +1
В MRI давеча джита завезли. Теперь поди и змеюка у него отсасывает