Улучшите свой код C# еще больше с помощью этих советов

По словам гуру кодирования Robert C. Martin, чистый код не слишком хорошо определен, однако результаты чистого кода довольно ясны. Вы хотите, чтобы код читался как хорошая книга, чтобы его было легко поддерживать и легко расширять. Ошибки должны быть легко обнаружены или даже должны избегаться по замыслу. Чистый код будет поддерживать высокую производительность и низкие затраты на обслуживание.

Одна из цитат из книги Чистый код звучит так:

«Чистый код может быть прочитан и улучшен разработчиком, отличным от его первоначального автора». (Дэйв Томас о чистом коде)

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

Читаемый код

Чтобы другие разработчики могли поддерживать ваш код, он должен быть чрезвычайно простым для чтения и понимания. Ваша цель при написании любой строки кода всегда должна быть удобочитаемой. Даже одна строчка может сбить с толку другого разработчика, который может потратить драгоценные минуты на понимание вашего кода, и это ваша вина!

Так что же делает код более читабельным для других разработчиков?

В этой статье я не буду заострять внимание на методах, упомянутых в книге Чистый код, так как могу порекомендовать проверить их самостоятельно. Однако я сосредотачиваюсь на конкретных рекомендациях, которые я узнал из своего опыта разработчика .NET за последние 8 лет.

Эти рекомендации должны сделать код максимально коротким и/или читабельным. Они не заменяют никакие методы чистого кодирования, но дополняют методы Чистого кода.

Рекомендации для .NET и C#

Давайте не будем терять время и сразу перейдем к рекомендациям. Это принципы, которые мы с моим коллегой Jan Donnermayer придумали сами за последние 8 лет программирования.

1. Избегайте «иначе»

Первый принцип — просто избегать else. Почти каждый раз, когда вы используете else в коде, этого очень легко избежать, и это делает код более читаемым. Взгляните на следующие примеры:

Первый пример также известен как раннее возвращение. Вы всегда должны четко указывать, что вы ожидаете от аргументов в первых нескольких строках кода.

Во втором примере показан достаточно новый способ переключения операторов в C#, так называемый сопоставление с образцом. Вы можете четко видеть, что происходит, когда передается некоторый явный случай, и какая функция обрабатывает этот случай. Здесь также было применено другое руководство: создайте дополнительную функцию для каждой подлогики, которая хорошо названа.

2. Избегайте высокой цикломатической сложности

Другой принцип в этом отношении заключается в том, что вы также должны стараться избегать более высокого числа цикломатической сложности. Это означает, что ваш метод должен иметь как можно меньше побочной логики, которая может выполняться при наличии определенного состояния. Например, вы можете реализовать это, реализуя интерфейсы для классов и реализуя отдельную логику в каждом классе:

3. Избегайте слишком большого количества уровней отступов

В примере в avoid_else.cs вы также можете увидеть другое отличие, заключающееся в том, что избегание else делает. Вы избегаете одного уровня отступа в своем методе. Чтобы сделать ваш код более читабельным, рекомендуется просто избегать слишком большого количества уровней отступов. Я обнаружил, что хорошим правилом является максимум три-четыре уровня отступов. Однако это должны быть действительно необходимые отступы.

Например, вы никогда не должны помещать предложение if внутри другого предложения if! На самом деле, вам следует везде избегать пунктов if, если это возможно.

Почти единственный случай, когда я использую более одного уровня отступа, — это когда я использую Linq-Queries. Более подробная информация по этой теме содержится в следующем руководстве.

4. Избегайте циклов, освоив Linq

Вы наверняка видели такой код:

Задайте себе вопрос: можно ли заменить ваш цикл Linq-Query? И я гарантирую вам, что в более чем 90% случаев это так! Это может быть мое личное мнение, но я думаю, что хороший Linq-Query намного легче понять, чем более крупный цикл for.

В основном, когда вы используете цикл for, вы хотите преобразовать одно или несколько перечислимых значений в результат. В Linq есть все необходимое для применения проверок, преобразований и действий к IEnumerable<T>. Если вы еще не работали с Linq, настоятельно рекомендую сделать это прямо сейчас!

В Linq у вас есть выбор Синтаксис запроса или синтаксис метода. Лично я предпочитаю синтаксис метода, но вы можете выбирать сами. Все методы расширения для IEnumerables можно найти здесь.

5. Извлеките и назовите свои методы

Извлечение методов и присвоение им удобочитаемых имен также значительно повышает удобочитаемость.

Представьте, что у вас более сложная логика в ваших методах Where() или Select(), чем в этом примере.

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

6. Разбейте код и сделайте отступ

Еще один способ создать более читаемый код — это правильно разбивать строки и делать отступы. Visual Studio поможет вам с большей частью отступов, однако он все еще далек от совершенства.

Несколько хороших практических правил, что ломать и делать отступы:

  • Строка кода не должна превышать половину экрана. Это облегчает чтение, и вы можете открыть два файла на разделенном экране, не пропуская какой-либо код.
  • Уровень отступа открывающих и закрывающих скобок должен совпадать. Я знаю, что это займет еще несколько секунд, но разрыв закрывающей скобки после вызова метода упрощает чтение и редактирование. (см. 2-й пример)
  • Разрыв перед точкой или после запятой. Таким образом, вы можете удалить всю строку, чтобы удалить часть кода.
  • Каждая лямбда-функция получает новый уровень отступа.

Кстати, ваша IDE сделает всю работу за вас. Ознакомьтесь с моей статьей Ярлыки и рефакторинг для Visual Studio и VSCode. Там вы узнаете, как быстро изменить свой код с помощью вашей IDE.

7. Используйте короткий синтаксис

Признаюсь, можно спорить, хорошо это или плохо использовать короткий синтаксис. Однако, если вы привыкнете к этому, я думаю, что это улучшит читаемость, убрав ненужный кодовый шум.

C# постоянно обновляется, и каждый год добавляется множество новых функций. Часто в новой версии будет более короткий способ кодирования некоторых вещей, которые вы уже используете ежедневно. Для С# 10 некоторые из них перечислены здесь:

  • Короткий if :
  • Короткие нулевые проверки:
  • На мой взгляд, самая читаемая интерполяция строк:
  • Тела экспрессии. Лучше всего подходит для однострочных функций или свойств:

Этот список содержит некоторые из коротких синтаксисов, которые я использую ежедневно. Как я уже говорил, это мое личное мнение. Некоторым из вас поначалу может быть трудно читать, но по моему опыту, читать становится легче, когда символов меньше.

8. Глобальное использование и пространства имен в файловой области

В C# 10 теперь у вас есть возможность использовать пространства имен файлов и глобальные использования.

Пространства имен с файловой областью удалят один уровень отступа из всего вашего файла кода, что, на мой взгляд (см. 3.), делает код немного более читаемым. При добавлении новых классов или методов в ваш код у вас будет на одну закрывающую скобку } меньше, что может вас запутать.

Глобальное использование ограничено проектом и сэкономит вам много места в верхней части ваших файлов. Тем не менее, вам следует осторожно использовать глобальные использования, так как некоторые использования очень полезны для другого разработчика, чтобы понять, на какие пакеты и пространства имен вы ссылаетесь в своем коде. Добавляйте только глобальные использования для пространств имен, которые очень часто используются в вашем проекте.

usings в этом примере также можно импортировать, включив implicit usings в вашем проекте.

Спасибо, что нашли время прочитать эту статью. Надеюсь, вы нашли его информативным, познавательным и интересным.
Мы очень ценим вашу поддержку и участие.

Если вы заинтересованы в том, чтобы быть в курсе последних тенденций, советов и приемов для чистой архитектуры, чистого кодирования и новейших технологических стеков, особенно в контексте C #, .NET и Angular, я был бы признателен. если вы решили следовать за мной.

Удачного дня!

Если вы еще не используете Medium для ежедневного расширения своих знаний, сейчас самое время начать! С Medium вы можете легко получить больше знаний по высокопрофессиональным темам, публиковать качественный контент и охватить более широкую аудиторию. Чтобы начать, просто создайте учетную запись Medium, используя эту ссылку:

Присоединиться к Medium сейчас

Таким образом, вы получите доступ к мощной платформе, которая поможет вам общаться с новыми писателями и читателями и каждый день узнавать что-то новое.