7seg писал(а):И да я видел вы умете писать красивый код
спасибо.
но чтобы вы еще лучше поняли мои мотивы, я дам некоторые пояснения "почему так" - надеюсь, никто не будет на меня в обиде за этот неболшой оффтоп.
что такое "читаемый код" с моей точки зрения? это код, фактический алгоритм котрого виден сразу с первого, максимум, со второго взгляда. причем наличие комментариев не является необходимым для понимания общего алгоритма. поэтому читаемым я называю код, который удовлетворяет хотя бы следующим нехитрым условиям:
1. функции имеют размер, позволяющий рассмотреть их от начала до закрывающей скобки за один раз без прокручивания текста. в качестве альтернативы, когда скроллинг не препятствует пониманию алгоритма функции, я допускаю "шаблонный" код, например, длинные switch или длинную цепочку if - else if. в этом случае важно, чтобы "шаблонный" участок умещался сразу на экране для обзора (т.е. ветка case - break как минимум). чтобы поняв, как работает один кусочек, уже можно было считать, что "дальше все так же однотипно".
2. функции, переменные, константы и макросы имеют "говорящие" идентификаторы.
3. алгоритмы реализованы наиболее понятным способом. опять же, поясню, что я имею ввиду сразу
на примере:
Код: Выделить всё
uint8_t myfunc(uint8_t v){
v^=v>>4;
return(0x6>>((v^(v>>2))&3)&1);
}
легко ли понять, что делает эта функция? лично мне пришлось запустить её в цикле с передачей ей чисел от 0 до 255, чтобы по результату понять смысл. маловероятно, что найдутся гении (не читавшие Д.Кнута), которые только по этому выражению смогут восстановить алгоритм и смысл функции. альтернатива выглядит совсем не так оригинально, потребляет больше процессорного времени и совсем не так оптимальна, но зато на 100% понятна с первого взгляда (максимум, со второго). особенно, если записана с "говорящими" переменными. код приводить не буду.
применяю ли я сам подобные "перлы"? иногда. эта "ручная" оптимизация на высоком уровне действительно необходима крайне редко, и я в подобных ситуациях оказывался нечасто. а в обычных ситуациях я всегда пишу "просто" - на то и быстродействие МК и оптимизатор компилятора, чтобы я меньше мучил свою голову.
поэтому я вижу свой вышеприведенный код абсолютно читабельным. с учетом того, что он ориентирован на "полного нуля" в программировании, отступление от "правил хорошего тона" (магические числа, нетипичные константы и т.п.) ради упрощения восприятия считаю оправданными
goldenandy писал(а):Мой компилятор ругается, если функция не возвращает ничего....
В конце я бы дописал return 0;
мой тоже, но это его личные половые проблемы. если он настолько туп, что не замечает "безвыходность" функции, кроме как из switch-а с перебором всех комбинаций, то это меня не сильно волнует.
Добавлено after 5 minutes 5 seconds:
Ivanoff-iv писал(а):#define AddLed PortLed=(PortLed<<1)|1
а вот так я никогда не делаю. потому как вот это
Ivanoff-iv писал(а):if (PortLed<ButtBuff) AddLed;
с первого взгляда не может быть прочитао сразу без усилий. и со второго тоже. если не видеть первой цитаты, что можно сказать увиденной впервые второй? AddLed - это volatile переменная. почему вдруг надо СЧИТЫВАТЬ её по условию, не используя результат - абсолютно не понятно.