Лучшие практики написания чистого и поддерживаемого кода

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

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

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

1. Следуйте согласованному стилю кодирования

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

Крайне важно соблюдать следующие правила:

  • Соглашения об именах (переменные, функции, классы и т. д.)
  • Отступ (пробелы против табуляции, размер отступа)
  • Пробелы между токенами
  • Перенос строки
  • Ширина печати

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

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

Согласованность можно обеспечить с помощью таких инструментов, как линтеры и средства форматирования. Линтеры проверяют код на наличие ошибок, предупреждений, спецификаций стиля или лучших способов написать тот же код; некоторые IDE называют это «проверкой кода». Средство форматирования исправляет пробелы, отступы и незначительные синтаксические проблемы/настройки.

2. Пишите четкий и лаконичный код

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

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

Вот два фрагмента, которые передают четкий и лаконичный код.

// ✅ Do this
function mean(numbers: double[]) {
    var sum = 0
    numbers.forEach(n => sum += n)
    return sum / numbers.length
}

// ❌ Don't do this
function mean(numbers: double[]) {
    var sum = 0
    for (var i = 0; i < numbers.length; i++) {
        sum += numbers[i]
    }
    return sum / numbers.length
}
        

Хотя первый вариант может работать немного медленнее (из-за forEach), чтение, запись и понимание намного проще. Расширение, использование или тиражирование в будущем будет намного проще.

3. Избегайте магических чисел и строк

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

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

if (response.status == 200)
    console.log(response.data)

Этот код создает несколько проблем:

  • Не все могут знать (или вы можете забыть), что код состояния HTTP 200 является успешным HTTP
  • Из контекста не всегда может быть ясно, что мы проверяем коды состояния HTTP.
  • Что, если коды состояния HTTP изменятся? (они, вероятно, не будут, но другие вещи, которые вы используете, могут)
  • Что, если другой разработчик неправильно его прочтет или неправильно введет код состояния где-то еще в программе?

Эти проблемы можно легко исправить, используя константы или перечисления:

// Constant method
const HttpSuccess = 200;

if (response.status == HttpSuccess)
    console.log(response.data)
// Enum method
enum HttpStatus {
    Success,
    NotFound,
    Unauthorized
    // More values here
}

if (response.status == HttpStatus.Success)
    console.log(response.data)

4. Используйте содержательные комментарии

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

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

❌ Вот пример слишком большого количества информации в комментарии:

function sum(numbers: number[]) {
    // Initially, assign the sum to 0
    let sum = 0  // This will be incremented later
    // Iterates over each element in numbers
    numbers.forEach(n => sum += n) // adds each element to sum
    return sum // Return the sum of the elements in number
}

❌ Вот пример слишком мало информации в комментарии:

function getCurrentWeather(location: string) {
    const request = new WeatherRequest()
    request.geo = WeatherAPI.getLatLong(location)
    request.forecast = WeatherForecast.Current
    request.fields = ['hi', 'lo', 'description']
    const response = await request.submit()
    return { ...response.current }
}

✅ Вот пример правильного количества информации в комментарии:

/**
  * Gets the current weather for a provided location
  *
  * @param location - A city, state, or zip code
  * @returns An object containing the high and low temperature
  *          and the description of the weather.
**/
function getCurrentWeather(location: string) {
    const request = new WeatherRequest()

    // Set the location to the corresponding geo-coordinates
    request.geo = WeatherAPI.getLatLong(location)

    // Only retrieve the current weather forecast
    request.forecast = WeatherForecast.Current

    // Only obtain the hi/lo temps, and the weather description
    request.fields = ['hi', 'lo', 'description']

    // Submit the response
    const response = await request.submit()

    // Expand the `response.current` object
    return { ...response.current }
}

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

5. Тщательно протестируйте свой код

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

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

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

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

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

Используйте систему контроля версий, такую ​​как Git, для управления своим кодом и убедитесь, что вы часто фиксируете изменения и пишете четкие и краткие сообщения о фиксации.

7. Регулярно проводите рефакторинг своего кода

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

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

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

Если вам понравилось читать эту статью, пожалуйста, ознакомьтесь с некоторыми из моих других статей:











Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .