Size: a a a

2020 September 20

L

LexsZero in Embedded Group
Сиие Сууие
Встретил альтернативный вариант, сперва не понял, но потом прозрел как лаконично
Do{
If(some){
Return
}
If(some 2){
Return
}
....
}While(0)
но это же просто скоуп. ресурсменеджмента я тут не вижу.
источник

СС

Сиие Сууие in Embedded Group
LexsZero
но это же просто скоуп. ресурсменеджмента я тут не вижу.
Я значит не вник в контекст дискуссии. Сорян
источник

L

LexsZero in Embedded Group
лесенки из ифов для ресурсменеджмента - это так примерно:
foo = get_foo();
if (foo) {
 bar = get_bar();
 if (bar) {
   /* do shit with foo & bar */
   put_bar(bar);
 }
 put_foo(foo);
}
источник

L

LexsZero in Embedded Group
когда ресурсов надо больше пары - тело уезжает далеко вправо
источник

СС

Сиие Сууие in Embedded Group
LexsZero
лесенки из ифов для ресурсменеджмента - это так примерно:
foo = get_foo();
if (foo) {
 bar = get_bar();
 if (bar) {
   /* do shit with foo & bar */
   put_bar(bar);
 }
 put_foo(foo);
}
Ну тогда похоже на то что я говорил, мол ифы но без лесенок
источник

К1

Ком 123 in Embedded Group
LexsZero
нет, не ништяк.
void do_cool_shit() {
 Foo *foo = get_foo();  /* foo must be released when not needed */
 /* here we do shit with foo that may fail */
 Bar *bar = get_bar();  /* also must be released */
 /* here we do some other shit with foo & bar that may fail */
 /* ok now we're done */
 put_bar(bar);
 put_foo(foo);
}
Тут не про ассерты, ассерты хороши когда нужно кучу ифлв проверить(именно if - else лесенку заменить на assert((char *foo = bar()) != NULL) и далее по списку). А фэйл стэйт всё равно нужно отслеживать в функции, где данные не выделяются. В других же выделил - использовал - освободил - вернул код возврата. Это про алгоритмизацию, не про спагетти код.
источник

L

LexsZero in Embedded Group
в случае крестов это все заменяется штуками привязанными к лайфтайму объекта, который привязан к лексическому скоупу - смарт-поинтерами, всякими std::unique_lock и объектами с деструкторами
источник

К1

Ком 123 in Embedded Group
в случае плюсов и стэйтмашину объектом состояния заменить можно, а не кучу ифов или свич-кейс километровый писать=)
источник

L

LexsZero in Embedded Group
я не люблю писать крестовый бойлерплейт, зато люблю мэпы из лямбд
источник

L

LexsZero in Embedded Group
а, ну и еще один аппроач - плодить кучу вложенных трехстрочных функций, самая внутрення из которых будет делать работу принимая все необходимые для нее ресурсы в аргументах, а внешние будут брать один ресурс, звать с ним следующий уровень матрешки (и передавать полученные от предыдущего уровня), освобождать взятый ресурс и прокидывать результат наверх
источник

L

LexsZero in Embedded Group
но это тоже мрак и куча унылого бойлерплейта, который без метапрограммирования становится совсем болью
источник

BV

Bulat Valeev in Embedded Group
LexsZero
но это тоже мрак и куча унылого бойлерплейта, который без метапрограммирования становится совсем болью
Выглядит как обертки, не унифицируется?
источник

L

LexsZero in Embedded Group
нет
источник

L

LexsZero in Embedded Group
потому что проблема с сигнатурами
источник

L

LexsZero in Embedded Group
typedef int (*worker_fn)(Foo *, Bar *);
int do_work(Foo *foo, Bar *bar);

int with_foo_and_bar(Foo *foo, worker_fn worker) {
 Bar *bar = get_bar();
 if (!bar)
   return -ESHITHAPPENED;
 int result = worker(foo, bar);
 put_bar(bar);
 return result;
}

int with_foo(worker_fn worker) {
 Foo *foo = get_foo();
 if (!foo)
   return -ESHITHAPPENED;
 int result  = with_foo_and_bar(foo, worker);
 put_foo(foo);
 return result;
}
/* ... */
with_foo(do_work);
источник

L

LexsZero in Embedded Group
если конечно не обмазать все войдпойнтерами
источник

VK

Valentin Kornienko in Embedded Group
LexsZero
typedef int (*worker_fn)(Foo *, Bar *);
int do_work(Foo *foo, Bar *bar);

int with_foo_and_bar(Foo *foo, worker_fn worker) {
 Bar *bar = get_bar();
 if (!bar)
   return -ESHITHAPPENED;
 int result = worker(foo, bar);
 put_bar(bar);
 return result;
}

int with_foo(worker_fn worker) {
 Foo *foo = get_foo();
 if (!foo)
   return -ESHITHAPPENED;
 int result  = with_foo_and_bar(foo, worker);
 put_foo(foo);
 return result;
}
/* ... */
with_foo(do_work);
Ох, а что это?
источник

L

LexsZero in Embedded Group
боль и страдание
источник

VK

Valentin Kornienko in Embedded Group
Сишный тредпул?
источник

L

LexsZero in Embedded Group
да просто менеджмент ресурсов без использования гоуту
источник