-
- Всегда делал ровно наборот: это позволяет через return быстро выйти из функции, а не иметь дикую вложенность if/else с кучей важного кода после этих else и через два-три экрана после относящегося к ним if -- такой код не читаем. - fk0(23.02.2018 13:05)De_user
- Цитата: "отлаживать функцию гораздо легче, если точки останова придется ставить всего на одном возврате из функции." - De_User(23.02.2018 15:09)
- Если вы её довели до дебаггера, то уже плохо. Её не надо б до дебаггера доводить, максимум до разматывания логов. - Николай Коровин(23.02.2018 16:27)
- Не понимаю. Нет проблем поставить столько точек останова, сколько нужно. В gdb можно дойти до выхода из функции (finish) и отмотать программ назад (reverse-step). При использовании всяких IAR ограниченным функционалом, наверное, лучше иметь один fk0(220 знак., 23.02.2018 15:02)De_user
- Про "наличие одной точки выхода уменьшает Cyclomatic Complexity всей программы." - De_User(24.02.2018 03:26)
- Cyclomatic Complexity and Why We Don't Use It. Весь текст можно не читать, достаточно прочесть функцию getMonthName, чтобы стало очевидно, что Cyclomatic Complexity - хреновая метрика сложности. Вы действительно думаете, что такой код придётся йцукен(100 знак., 23.02.2018 16:19, ссылка)De_user
- Спорное утверждение: чем return отличается от goto exit или неявного перехода (по закрывающей скобочке) к последней строчке? А syntax sugar точно уменьшает, даёт на выходе исходник с которым трудно работать, трудно понимать, легко допустить fk0(183 знак., 23.02.2018 15:31)De_user
- Про "наличие одной точки выхода уменьшает Cyclomatic Complexity всей программы." - De_User(24.02.2018 03:26)
- +1. Тоже предпочитаю сначала разобраться с тривиальным случаем, потом переходить к самому вкусному. Если йцукен(92 знак., 23.02.2018 14:49)
- Я часто придерживаюсь if (что-то не так) return ErrorCode, так что вот да вот:) А то и не ErrorCode, а вообще констчар* на строку ошибки (если функция из «приближённых к телу пользователя»). - Николай Коровин(23.02.2018 13:19)
- Цитата: "кучу проблем удалось бы избежать, если б сначала обрабатывался желательный исход" - De_User(23.02.2018 15:24)
- Там вообще проблем нет, такой код выдаёт сразу варнинг. Это не проблема ни разу. Для тех кто варнинги не читает есть -Werror. - fk0(23.02.2018 13:58)De_user
- "Негативных" выходов из функции обычно много, а позитивный путь ровно один, до конца тела функции. - fk0(23.02.2018 13:55)De_user
- Есть ещё сложность с высвобождением ресурсов иногда. Тут уж кто как пишет. Мне больше всего нравится при любой деаллокации занулять указатель (хотя чревато «ошибкой лишней сущности», да), а при АВОСТ просто высвобождать всё ненулевое. Николай Коровин(220 знак., 23.02.2018 14:07)
- …и граничные условия документировать предельно чётко. Не «выполняет ориентацию», а «от такой-то точки в такую-то сторону до достижения, а если успели повернуть — то туда-то». Тогда вовремя обнаружится, что она ±оборот закладывает. Николай Коровин(110 знак., 23.02.2018 14:53)De_user
- В C++ это менее заметно из-за смарт-поинтеров и деструкторов. А C вполне можно делать goto error и там ненулевое деаллоцировать, действительно. Можно тупо в лоб, в каждом выходе, писать деаллокацою выше по тексту аллоцированного. Всяко оно влазит fk0(327 знак., 23.02.2018 14:16)
- считаю, что одна функция не должна аллокатить много всего разного. - Mahagam(23.02.2018 14:10)
- Все такие теоретики. А я считаю, что в языке должен быть lexical scoping. Как в lisp, pascal, perl. А пока его нет будут функции и на 10 экранов, которые трудно разбить. - fk0(23.02.2018 14:17)
- Главное, чтобы функция не совмещала лишние предназначения. А пока она делает что-то одно и качественно простое, на количественном уровне она может быть хоть с Талмуд. Хотя это редкость, конечно. Николай Коровин(160 знак., 23.02.2018 14:41)
- Функция вообще ничего ДЕЛАТЬ не должна. Функция должна вычислять и возвращать РЕЗУЛЬТАТ на основе АРГУМЕНТОВ. Побочные эффекты в общем случае -- зло. - fk0(23.02.2018 14:43)
- Зависит от определения понятия «делать» :) Да и вместо половины вычислений обычно измерения, с учётом нашей специфики. - Николай Коровин(23.02.2018 14:54)
- Функция вообще ничего ДЕЛАТЬ не должна. Функция должна вычислять и возвращать РЕЗУЛЬТАТ на основе АРГУМЕНТОВ. Побочные эффекты в общем случае -- зло. - fk0(23.02.2018 14:43)
- Главное, чтобы функция не совмещала лишние предназначения. А пока она делает что-то одно и качественно простое, на количественном уровне она может быть хоть с Талмуд. Хотя это редкость, конечно. Николай Коровин(160 знак., 23.02.2018 14:41)
- Обычно много надо в инициализаторе, а он один и легко полируется :) Вообще это структурно уже напоминает плюсы, конструктор, методы, деструктор :) Только вместо исключений старый добрый результат-отлуп типа «не шмогла». - Николай Коровин(23.02.2018 14:16)
- Все такие теоретики. А я считаю, что в языке должен быть lexical scoping. Как в lisp, pascal, perl. А пока его нет будут функции и на 10 экранов, которые трудно разбить. - fk0(23.02.2018 14:17)
- Есть ещё сложность с высвобождением ресурсов иногда. Тут уж кто как пишет. Мне больше всего нравится при любой деаллокации занулять указатель (хотя чревато «ошибкой лишней сущности», да), а при АВОСТ просто высвобождать всё ненулевое. Николай Коровин(220 знак., 23.02.2018 14:07)
- Цитата: "два-три экрана в одной функции - нехорошо!" - De_User(23.02.2018 15:14)
- Два три экрана -- в твоём варианте. И текст в 200-й колонке из-за десятка вложенных if/else. - fk0(23.02.2018 14:03)De_user
- Если рассматривать не смешные баги, а реальные, то я могу привести парочку, которую я нашёл за великим Кармаком, когда баловался с сырцами Wolf3D. Николай Коровин(1564 знак., 23.02.2018 13:59)De_user
- Цитата: "кучу проблем удалось бы избежать, если б сначала обрабатывался желательный исход" - De_User(23.02.2018 15:24)
- Цитата: "отлаживать функцию гораздо легче, если точки останова придется ставить всего на одном возврате из функции." - De_User(23.02.2018 15:09)
- Всегда делал ровно наборот: это позволяет через return быстро выйти из функции, а не иметь дикую вложенность if/else с кучей важного кода после этих else и через два-три экрана после относящегося к ним if -- такой код не читаем. - fk0(23.02.2018 13:05)De_user