и о культистах
Aug. 3rd, 2014 09:37 pmДядя из позапрошлого поста сослался на свой собственный разбор того, почему использовать goto не только плохо, но еще и иногда хорошо.
И действительно, как вспомню сколько было потрачено моего времени на борьбу с запретом goto, с запретом множественных точек выхода, с венгерской нотацией (в майкрософтовском смысле), с обязательной проверкой всех аргументов в каждой функции… аж вздрогну. Сколько этих безумных, дебильных карго-культов накопилось в индустрии… и никто не считает нужным не то что бороться с ними, а даже и просто понять контекст в котором эти запреты были актуальны, а так… что-то где-то слышали, и при этом уже рвутся в бой писать правила игры. У них что, в детстве в песочнице всё время совочек отбирали, или что?
И действительно, как вспомню сколько было потрачено моего времени на борьбу с запретом goto, с запретом множественных точек выхода, с венгерской нотацией (в майкрософтовском смысле), с обязательной проверкой всех аргументов в каждой функции… аж вздрогну. Сколько этих безумных, дебильных карго-культов накопилось в индустрии… и никто не считает нужным не то что бороться с ними, а даже и просто понять контекст в котором эти запреты были актуальны, а так… что-то где-то слышали, и при этом уже рвутся в бой писать правила игры. У них что, в детстве в песочнице всё время совочек отбирали, или что?
no subject
Date: 2014-08-04 10:24 pm (UTC)проверка аргументов может быть полезна для того, чтобы нормально журналировать ошибки а не производить segfault на каждый чих.
(или заёбывающий жабий null pointer reference во всяких говнопродуктах).
no subject
Date: 2014-08-05 08:16 am (UTC)no subject
Date: 2014-08-05 03:22 pm (UTC)Ну а размер кода - препроцессор никто не отменял :)
Как обрабатывать - должно быть единое соглашение, возвращать E_INVALID_ARG, поднимать исключение, делать abort() - надо придерживаться единого стандарта, принятого для данного проекта.
Я на эту тему у себя писал, код проверок в грамотном коде на C занимает БОЛЬШУЮ часть объёма. Если write с неправильным файловым дескриптором вызывает kernel panic - это моветон :)
А любая пропущенная условно ненужная проверка рано или поздно окажется в security bulletin. Ибо если те функции, которые есть сейчас, всегда передают правильные аргументы, рано или поздно появится новая, которая в какой-то ситуации передаст неправильные.
no subject
Date: 2014-08-05 04:04 pm (UTC)Поймите же наконец вы, поборники обсессивно-компульсивного стиля кодирования, что любая, абсолютно любая ошибка означает, что запорот некоторый кусок работы, и чтобы дальше осмысленно продолжать, надо восстановиться. И закладывается такая возможность на этапе системного проектирования, причём в каждом конкретном случае и на каждом уровне абстракции методы восстановления будут свои (где-то можно и процесс уронить, перезапустив джоб потом в супервайзере). Иногда можно и проверку аргументов сделать, чаще всего это осмыслено на межмодульных интерфейсах, но и она не решает всех проблем. А пихать проверку всех подряд аргументов в coding standard и на этом успокаиваться — долбоебизм, за который надо ссаными тряпками гнать из профессии. Пример:
char *join(char **array) { size_t total = getsize(array) char * buf = malloc(total); ... char * r = buf; for(...) { buf = _concat(buf, array[..]); } ... return r; }вот кому и чем поможет, если _concat в приведенном примере будет проверять свои аргументы (при условии что она является внутренней для данного модуля)?
> Я на эту тему у себя писал
ссылку?
no subject
Date: 2014-08-05 07:06 pm (UTC)no subject
Date: 2014-08-05 07:10 pm (UTC)я, предлагаю, пользуясь электрической аналогией, не вешать автоматические расцепители и узо на каждую розетку.
no subject
Date: 2014-08-05 07:23 pm (UTC)тут вопрос в затратах - стоит ли сдуру воткнутый электрочайник вырубившегося компа или хрен с ним. вопрос, хочешь ли ты об этом поговорить :)