Ошибки, которые когда-либо допускают все программисты.

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

Ошибка 1: Занятые функции

Что не так со следующим фрагментом Python?

def validate(name, email):
    if re.fullmatch(name_regex, name):
        print("valid name")
    else:
        print ("invalid name")
    if re.fullmatch(email_regex, email):
        print("valid email")
    else 
        print ("invalid email")

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

В идеале каждая функция должна выполнять только одну задачу.

Функция, которую мы написали выше, проверяет два разных ввода пользователя, то есть выполняет две разные задачи.

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

def validate_email():
if re.fullmatch(name_regex, name):
        print("valid name")
    else:
        print ("invalid name")

Второй может называться validate_name.

def validate_email():
if re.fullmatch(name_regex, name):
        print("valid name")
    else:
        print ("invalid name")

Зачем нам утруждать себя этим? Простота: более короткие функции легче писать, легче читать и легче тестировать.

Ошибка 2: путаница в именах

Иногда мы можем довольно творчески подходить к именам, которые используем в наших программах. Рассмотрим следующий фрагмент псевдокода:

flavors = [vanilla, chocolate, raspberry]
victim = flavors.pop(1)

В других случаях мы можем стать довольно ленивыми:

array = [vanilla, chocolate, raspberry]
element = array.pop(1)

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

Имена должны быть информативными и лаконичными.

Ошибка 3: Полное молчание

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

Комментарии необходимы

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

Ошибка 4: Повторение Повторение

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

Не повторяйся (СУХОЙ)

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

Ошибка 5: непоследовательное форматирование

Рассмотрим следующий фрагмент псевдокода:

if (time < 7 AM) {
    snooze
}
else if (time >= 7 AM)
{
    wake up
}

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

Как и во всем остальном в жизни, в программировании важна согласованность.

Ошибка 6: слишком много глобальных переменных

Глобальные переменные — это любые переменные, объявленные вне функции, что делает их значение доступным для всей программы. Если глобальные переменные не являются постоянными, различные функции могут изменить их значение, что потенциально может привести к сбою всей программы. Более того, в отличие от локальных переменных, они занимают память в течение всего времени выполнения программы, а не только ее часть.

Итак, вместо написания следующего кода Python:

flavors = [vanilla, chocolate, raspberry]
def replace_flavor():
    flavors.pop()
    flavors.append("pistachio")

По возможности вместо этого напишите следующий код:

def replace_last_flavor():
    flavors = [vanilla, chocolate, raspberry]
    flavors.pop()
    flavors.append("pistachio")

Ошибка 7: Плохое планирование

Еще одна ошибка, которая снижает качество кода, но, возможно, ее не так просто исправить, — это плохое планирование.

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

def sum_of_odd():
    n = int(input("n: ")
    i = 0
    increment = 1
    sum = 0
    
    while i < n:
        sum += increment
        increment += 2
        i++
    
    return sum

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

def sum_of_odd():
    n = int(input("n: ")
    sum = n**2
    return sum

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

Резюме для людей в спешке

  • Избегайте занятых функций
  • Напишите уточняющие имена
  • Включите комментарии, где это уместно
  • Избегайте повторений
  • Будьте последовательны в том, как вы форматируете свой код
  • Избегайте глобальных переменных
  • Хорошо спланируйте свой код (и/или хорошо просмотрите и отредактируйте его)

Спасибо за чтение!