НСПК / 24.12.24 / перетяжка / 2W5zFK76vmn
НСПК / 24.12.24 / перетяжка / 2W5zFK76vmn
НСПК / 24.12.24 / перетяжка / 2W5zFK76vmn

Начинающим C# программистам: 5 полезных советов, которые сделают ваш код чище

Аватар Иван Бирюков
Отредактировано

35К открытий35К показов

Рассказывает Мош Хамедани, автор курсов по C# и AngularJS на udemy

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

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

Проверяйте входные данные в первую очередь

Обратите внимание на данный отрезок кода:

			public void Draw(Shape shape)
{
  if (shape != null) {
     Console.WriteLine("Drawing " + shape.ToString());
     Console.WriteLine("---");
  } else {
     throw new ArgumentNullException("shape");
  }
}
		

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

			public void Draw(Shape shape)
{
  if (shape == null) {
     throw new ArgumentNullException("shape");
  } else {
     Console.WriteLine("Drawing " + shape.ToString());
     Console.WriteLine("---");
  }
}
		

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

Оператор else нужен далеко не всегда

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

			public void Draw(Shape shape)
{
  if (shape == null) {
     throw new ArgumentNullException("shape");
  }
  Console.WriteLine("Drawing " + shape.ToString());
  Console.WriteLine("---");
}
		

Обратите внимание на то, что код после оператора if не имеет дополнительных отступов.

Фигурные скобки?

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

			public void Draw(Shape shape)
{
  if (shape == null)
     throw new ArgumentNullException("shape");
  Console.WriteLine("Drawing " + shape.ToString());
  Console.WriteLine("---");
}
		

Мне кажется, теперь код стал чище. А что вы думаете по этому поводу?

Обращайте внимание на названия идентификаторов

Названия идентификаторов в вашем коде важны так же, как и то, как вы назовете своих детей. Я не шучу. Никто не захочет читать чужой код с подобными названиями:

  • od: Что значит od? Очередной день? Оператор доставки? Опция доступа?
  • Button1_Click(): Что за Button1? И чем она отличается от Button2?
  • thisAs: А это что вообще такое?!

Используйте названия, которые будут без искажений передавать ваши идеи в коде.

Избегайте ненужных переменных

В 80-х годах прошлого века книги по программированию учили нас объявлять переменную по любому поводу. Посмотрите на этот кусок кода, который читает два числа с консоли и выводит максимальное из них:

			var firstInput = Console.ReadLine();
var firstNumber = Convert.ToInt32(firstInput);
var secondInput = Console.Readline();
var secondNumber = Convert.ToInt32(secondInput);
var max = (firstNumber > secondNumber) ? firstNumber : secondNumber;
Console.WriteLine(max);
		

У меня буквально глаза на лоб вылезли, когда я объявлял все эти переменные! В чем основная цель этого кода? Правильно — найти максимум двух чисел. Поэтому firstInput и secondInput, которые являются строками со считанным вводом пользователя, не являются полезными или нужными в этом коде. Всё, что нам надо — два числа. Временная строка, которую мы получаем из консоли в процессе, не является важной. Поэтому эти две переменные никак не улучшают данный код в плане читабельности, а только лишь добавляют лишнего шума. Мы можем считать ввод с консоли и преобразовать его в число одной строкой кода:

			var firstNumber = Convert.ToInt32(Console.ReadLine());
var secondNumber = Convert.ToInt32(Console.Readline());
var max = (firstNumber > secondNumber) ? firstNumber : secondNumber;
Console.WriteLine(max);
		

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

Если советы в данной статье показались вам слишком тривиальными, обратите внимание на статью с 10 полезными особенностями языка C#.

Также советуем вам ознакомиться со списком из 20 других программистов, которые дают полезные советы о программировании на C#.

Следите за новыми постами
Следите за новыми постами по любимым темам
35К открытий35К показов