Просто любопытно. Максимум, что у меня когда-либо было, это цикл for внутри цикла for, потому что после прочтения этого слова Линусом Торвальдсом:
Вкладки состоят из 8 символов, и поэтому отступы также состоят из 8 символов. Есть еретические движения, которые пытаются сделать углубления в 4 (или даже 2!) Символа глубокими, и это похоже на попытку определить значение PI равным 3.
Обоснование: вся идея отступа состоит в том, чтобы четко определить, где начинается и заканчивается блок управления. Особенно, когда вы смотрите на свой экран в течение 20 часов подряд, вам будет намного легче увидеть, как работает отступ, если у вас большие отступы.
Теперь некоторые люди будут утверждать, что наличие 8-символьных отступов делает код слишком далеко вправо и затрудняет его чтение на 80-символьном экране терминала. Ответ на этот вопрос заключается в том, что если вам нужно более 3 уровней отступа, вы все равно облажались и должны исправить свою программу.
https://www.kernel.org/doc/Documentation/CodingStyle
Я подумал, что для меня было неприемлемым переходить на третий уровень зацикливания и реструктурировать мой код (прежде всего Qt).
Линус шутил?
Это зависит от языка или приложения?
Есть ли какие-то вещи, которые абсолютно нуждаются в трех или более уровнях зацикливания?
Ответы:
Ядро сильно предпочитает простые алгоритмы
В то время как для различных алгоритмов могут потребоваться глубоко вложенные циклы внутри циклов, в контексте ядра Linux (в котором была указана цитата) обычно требуются быстрые ответы в реальном времени. В этом контексте глубокое вложение - это запах, который может указывать на то, что поток кода слишком сложен для этого домена и может нуждаться в изменении из-за его характеристик выполнения, а не из-за проблем с читаемостью или отступами.
Кроме того, ядро Linux отличается от кода большинства приложений в отношении требований к аудируемости и тестированию - и поэтому предпочло бы не иметь вложенный алгоритм уровня 4+ в одной функции. Должно быть очевидно видеть, что каждый фрагмент кода делает точно и подробно, включая все возможные процессы управления и крайние случаи. Глубоко вложенный код препятствует этому.
источник
because
проекты, использующие языки более низкого уровня, выигрывают от стиля кодирования, который фокусируется на более простых алгоритмах?В какой-то степени я перестал серьезно относиться к этой цитате на вкладке «8 символов» . Весь смысл табуляторов состоит в том, что они не являются фиксированным числом символов (во всяком случае, вкладка - это один символ). Какая куча мусора. Точно так же я не совсем убежден, что установление жесткого и быстрого правила «трех уровней отступа» является нормальным (так же, как установление жесткого и быстрого правила для чего-либо - вменяемое).
Однако, ограничивая уровень отступа является в целом разумное предложение, и не один , который должен прийти , как сюрприз для вас.
В конечном счете, если вашей программе требуется три уровня итерации, это то, что нужно вашей программе . Суть цитаты заключается не в том, чтобы волшебным образом смягчить это требование вашего проекта, а в том, чтобы разделить логику на функции и типы, чтобы ваш код был более кратким и выразительным.
Это просто возвращает к тому же руководству, которое дано выше относительно уровней отступов. Речь идет о том, как вы структурируете свой код и сохраняете его читабельным, поддерживаемым и интересным для изменения на долгие годы
источник
Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.
- 6 абзацев ниже цитаты в ОП.Суть та же, что и для любых конструкций управления потоком: если код сложен для понимания, вам необходимо его реорганизовать. Если вы выполняете несколько простых манипуляций с многомерным массивом, тогда целесообразно иметь циклы, вложенные в пять или шесть глубин, если логика в самом внутреннем цикле проста. Однако, если вы обрабатываете некоторую сложную бизнес-логику, а тело вашего цикла состоит из дюжины строк или более, то вам, вероятно, не захочется вложить этот цикл более чем в один цикл. Вы можете попытаться вычислить цикломатическую сложность кода, но на самом деле это сводится к удобочитаемости и удобству сопровождения рассматриваемого кода.
источник
Произведение написано в игровой манере, что говорит о том, что автор знаком с тем, как стиль кодирования обсуждается среди серьезных практиков: у всех нас есть свои предпочтения, и мы их отстаиваем бешено, но языком, по крайней мере, частично в щеку. Мы прекрасно понимаем, что многое из этого - вопрос личного вкуса. Он говорит, во многих словах,
"Coding style is very personal, and I won't _force_ my views on anybody"
- по крайней мере вне кода, который он лично поддерживает. Но последовательность стиля в данном проекте - очень хорошая идея. Я бы предпочел кодировать стиль, который мне не нравится, чем иметь дело с несколькими стилями в данной функции.Вот пример явно игривого письма:
Игривый (1).
Возможно, это хороший совет, чтобы попытаться удержать отступы из-под контроля, хотя трехуровневый максимум может быть гиперболическим. Я не собираюсь анализировать исходный код ядра и считать последовательности из четырех символов табуляции, но держу пари, что вы могли бы найти хотя бы один, написанный Торвальдсом.
С другой стороны, если кто-то может написать ядро Linux без частого превышения трех уровней отступа, трехуровневое ограничение может быть полезным упражнением на некоторое время в вашем собственном коде, просто чтобы посмотреть, куда оно вас приведет. Знаете, это не похоже на смену пола. Это не пожизненное обязательство.
Если вы столкнетесь с кем-то в Интернете, который думает, что он понимает программирование гораздо лучше, чем Торвальдс (2), вы знаете, какие люди любят громко разговаривать в Интернете.
С другой стороны, он преступно ошибается насчет восьми пробелов. Это бред человека, которого следует сдерживать и кормить через щель. Четыре пробела, очевидно, правильно.
(1) Но обратите внимание, как он ошибочно ставит пробел перед эллипсами, два пробела после них и два пробела после полной остановки. НЕПРАВИЛЬНО, НЕПРАВИЛЬНО, НЕПРАВИЛЬНО. И тогда у него есть наглый нагоняй, чтобы ругать еретиков. Еретик это ты, Торвальдс! ЭТО ТЫ!
(2) Если вы хотите поговорить о « понимании того, как спроектировать систему контроля версий », возможно, есть место для дискуссий.
Заметка: Уважаемый пользователь, который неоднократно вносил одно и то же изменение: форматирование в цитируемом материале сохранено в точности так, как предполагал автор. Это потому, что это из эссе о форматировании текста с фиксированной шириной, написанного в тексте с фиксированной шириной, кем-то, кто придумал много времени для форматирования текста с фиксированной шириной. Форматирование является сознательной и преднамеренной частью замысла автора, и оно имеет отношение к предмету.
Кроме того, я вернулся к этому форматированию в своем собственном тексте. Если вы удалите предварительное форматирование, моя сноска (1) станет бессмысленной. Если предварительное форматирование удалено, то текст моей сноски (1) должен относиться к парам пробелов после полных остановок в концах предложений. В любом случае я вижу обоснование для удаления этой сноски, потому что она менее смешная, чем казалось, когда я ее писал. Но удалить форматирование, не удаляя сноску, бесполезно.
источник
.
в этом комментарии нет неправильных пробелов ;-))preferred coding style
а такжеbut this is what goes for anything that I have to be able to maintain
У Линуса очень тупой стиль речи и сухое чувство юмора, но он не шутил в этом случае. Есть ситуации, когда алгоритм требует вложения глубже двух уровней, но вы можете сделать это, используя другие средства, чем отступ кода. Руководство по стилю ядра Linux настоятельно предпочитает эти другие методы из-за сложности поддержки глубоко вложенных циклов, и именно это Линус говорит здесь.
В некоторых примерах альтернативных методов вы можете использовать рекурсию, разделять внутренние циклы на их собственные функции или создавать промежуточные структуры данных.
Чрезмерное вложение - один из тех случаев, который легче написать, но труднее читать. Установка большой глубины табуляции - способ Линуса сделать его более раздражающим, чтобы писать тоже.
источник
Есть много вопросов, где совет отличается для тех, кто задает вопрос, чем для тех, кто не задает. Если вы спросите «Должен ли я когда-либо иметь циклы, вложенные глубиной более двух уровней», то для вас, человека, задающего этот вопрос, ответ НЕТ. Если вы спросите, то не делайте этого. Если у вас достаточно опыта, который вам не нужно спрашивать, тогда вы знаете, каков правильный ответ в каждом конкретном случае. И не спорьте, если вы не согласны с ответом, потому что ответ не для вас.
источник
Казалось бы, это учебный случай, когда хвост виляет собакой.
Если у вас 80-символьный дисплей, то, конечно, вы попытаетесь сделать код максимально подходящим, даже если он не дает наилучшую структуру для кода .
Занимаясь остальной частью ваших пунктов головы:
Я подумал, что это недопустимая практика.
Я думаю, вы слишком много читаете об этом. Не поддавайтесь желанию воспринимать все, что вы читаете, как Евангелие, без должного понимания контекста.
Он шутил?
Трудно определить контекст, но смотри мою первоначальную точку выше.
Это зависит от языка или приложения?
Даже очень. Возьмите любой мэйнфрейм или язык среднего уровня, где вы, вероятно, будете кодировать на терминале (или эмуляторе терминала).
Есть ли какие-то вещи, которые абсолютно нуждаются в трех или более уровнях зацикливания?
Да, это очень распространено в некоторых алгоритмах перебора. См. Проблему 31 в проекте Эйлера. Это классический пример проблемы, которую можно решить с помощью грубой силы, используя несколько циклов (8, если быть точным).
источник
Нет, это официальные рекомендации.
Правила кодирования, как правило, зависят от языка и приложения, однако глубоко вложенный код всегда обременяет читателя.
Проблема с вложенным кодом заключается в том, что в целом он увеличивает цикломатическую сложность: то есть, чем больше вложенного кода, тем больше потенциальных путей выполнения внутри функции. Комбинаторный взрыв потенциальных путей выполнения затрудняет рассуждение о коде, и поэтому его следует избегать в целом.
Так почему 3? Субъективное руководство по кодированию сложно реализовать и невозможно применить автоматически. Установка объективного руководства по кодированию на максимальном уровне отступа требует согласования числа: в ядре Linux они выбрали 3.
Это произвольно, и, видимо, им достаточно.
С точки зрения алгоритма, возможно, однако, в достаточно выразительных языках вы всегда можете реорганизовать код в более мелкие фрагменты (будь то с функциями или замыканиями).
Очевидно, что вы можете написать обфусцированный код с небольшим вложением и множеством небольших функций, вызывающих друг друга без написания контракта ...
... однако, мелкие функции с четкими контрактами гораздо проще проверять, чем крупные функции с четкими контрактами в целом.
источник