Какие шаги и меры я могу предпринять, чтобы предотвратить глубокие отступы в моем коде?
code-quality
indentation
Тамара Вийсман
источник
источник
Ответы:
Глубокий отступ обычно не является проблемой, если каждая функция / метод в вашей программе выполняет одно и только одно. Иногда может потребоваться вложить условные выражения на несколько уровней, но я могу честно сказать, что я написал код с глубоким отступом всего несколько раз за 12+ лет написания кода.
источник
Лучшее, что вы можете сделать, это извлечь методы:
источник
if
условий. В крайнем случае вы получите исполняемый псевдокод.else
блоки.Может быть, вы могли бы рассмотреть пункты охраны ?
вместо того
Делать
Если у вас когда-нибудь будет шанс, я рекомендую вам прочитать «Code Complete» Стива Макконнелла. У него много хороших советов по этим темам.
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6
Для получения дополнительной информации о «пунктах охраны» см .: https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses
источник
Инвертировать ваши
if
с.Вместо того:
Я бы написал:
То же относится и к
if
-else
блокам. Еслиelse
короче / меньше вложенных, то верните их.Проверьте значения параметров в одном месте
Проверьте все параметры на недопустимые значения, как только вы введете свой метод, затем продолжайте, зная, что вы в безопасности. Это делает код более читабельным, но также избавляет вас от необходимости накапливать условные блоки в дальнейшем и распространять эти проверки по всей подпрограмме.
источник
If
s в начале кода, которые останавливают поток выполнения из-за невыполнения некоторых условий, также называются защитными предложениями , как указывал @JasonTuran. И это кажется настолько близким, насколько это возможно, к определенному имени.Как правило, я видел, что код с глубоким отступом обычно является проблематичным кодом. Если вы столкнулись с этой проблемой, сделайте шаг назад и оцените, выполняет ли ваша функция слишком много вещей.
В то же время, чтобы ответить на ваш вопрос, если есть необходимость в столь глубоких отступах, я бы предложил, чтобы вы позволили этому быть там. По той простой причине, что в таком коде отступ поможет, так как он, вероятно, будет очень длинным фрагментом кода.
источник
Разбейте вложенные компоненты (особенно повторяющиеся) на отдельные функции (это проще, если ваш язык поддерживает замыкания) или замените серию вложенных циклов рекурсией.
Кроме того, сделайте отступ двух пробелов вместо четырех.
источник
Я не рассматриваю глубокие отступы как категорическую проблему, которую нужно удалить (и при этом я не рассматриваю рефакторинг как истинный ответ на все вопросы).
Обычно вместо вложенных ifs я люблю писать логические выражения:
скорее, чем
источник
Я сам в это не верил, но согласно Code Complete это подходящее место для использования
break
(если ваша команда на борту). Я полагаю, что это более приемлемо для программистов на C ++, хотя там, где ониbreak
используются вswitch
выражениях, чем для программистов на Delphi, где ониbreak
используются только тогда, когда вам не хочется писатьwhile
цикл.источник
Отступ - это действительно боевая мысль. То, что я научился делать, это сначала разделить метод на части, а затем использовать странный трюк, чтобы пропустить все последующие части, если одна часть не удалась. Вот пример:
Вместо того :
Я сейчас пишу:
Поначалу мне это показалось странным, но с тех пор, как я это использую, затраты на обслуживание были поделены пополам, и мой мозг в конце дня остыл.
Фактически, выгода, представленная этой «техникой», состоит в том, что сложность кода действительно разделена, потому что код менее плотен.
При чтении кода вам не нужно ничего вспоминать о прошлых условиях: если вы находитесь в точке X в коде, предыдущие шаги пройдены и успешно выполнены.
Другим преимуществом является то, что «путь и условие выхода» из всех вложенных «если-еще» упрощается.
источник