ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
998475 Топик полностью
fk0, легенда (24.04.2020 12:23, просмотров: 254) ответил VLLV на У меня потребовал заказчик: 1. once 2.без комментариев 3. не больше 20 строк в функции 4. без вложений if 5. switch без default 6. без препроцессора. Я начал с первого пункта.
Типичный пример карго-эффекта, когда не понимая сути начинают копировать какие-то действия, думая, что это приведёт их к успеху. Из той же области, что "не использовать goto". 

Есть действительно какие-то практики ухода от возможных ошибок, какие-то негативные практики провоцирующие ошибки, но это всё не серебрянная пуля, не то, что безусловно должно выполняться для достижения какого-то результата.


Да, есть такое мнение, что switch с default может провоцировать ошибки, когда что-то, что должно быть обработано попадает в default. Но оно работает только для перечислимых типов, в некоторых же случаях без default может быть только хуже (ну хоть assert в default вставить следовало бы).


Без препроцессора -- можно написать всё руками и наделать ошибок: когда например, вначале руками размножается макрос, потом в трех местах исправляется ошибка, а в двух исправить забывают. Или из нормальных исходников, с препроцессором и комментариев, с помощью того же препроцессора получить исходники без комментариев и без препроцессора (самый адекватный вариант)...


Без вложений if -- это значит написать более сложные логические условия длиной по три строки и наделать там ошибок. Плюс дублирование кода и опять же ошибки, ибо вынести код в функцию в C невозможно (нет понятия "вложенной функции", имеющей доступ к контексту объемлющей функции). В C++ можно выкрутиться с лямбдами.


Функции по 2000 строк рождаются по причине описанной выше. Можно перейти к C++, где есть объектная модель, позволяющая захватить контекст. В C остаётся только раскладывать переменные по структурам и передавать указатель как псевдо-this. Я не пытаюсь спорить с этим пунктом, функции по 2000 строк плохи... Но они потому и существуют, что избавление от них может быть тяжелее самих функций.


Отсутствие комментариев (мол код должен быть "самопонятным") -- дурость. Потому, что в комментариях пишется что программист хотел сделать, а в коде -- что по факту получилось. И что из них верно ещё вопрос. Ну и когда с кодом будет работать больше одного человека -- как быть вообще? Или когда пройдёт год и всё забудешь. Вот какая-то мешанина из функций, называются "абвгд-еклмн", ничего не понятно. Нужно во-первых понимать назначение функций (оно совершенно не очевидно, и код почитать тоже нельзя, особенно когда он размазан по спагетти из 30 вложенных функций), во-вторых иметь какое-то описание архитектуры на верхнем уровне. Конечно это может быть отдельный документ, но кто так делает.


Ты микрософтовский код видел? Это сборище всего "чего нельзя", во всех видах. При этом это по-настоящему профессиональный код. Просто такие решения в силу каких-то причин более оптимальны здесь и сейчас. Из "правил хорошего тона" не следует делать догмы. goto плох, но если так лучше, то его можно использовать. Само по себе избавление от goto ни к чему хорошему не приведёт. Идея в том, что неопытные программисты часто используют goto неправильно и порочным образом, а не в том, что само избавление программ от goto принципиально их улучшает. И с остальными пунктами так же.

[ZX]