Перевод статьи Али Спиттел «Extreme Makeover: Code Edition».
Я немного одержима идеей написания чистого кода. Код должен быть читабельным для тех разработчиков, которые будут заниматься им в будущем (включая вас). Также он должен иметь возможность расширения. Добавлять новые свойства в ваше приложение и поддерживать код должно быть легко. Если бы мы писали код только для компьютеров, то можно было бы обойтись бинарным кодом! Вот несколько моих советов для написания чистого кода:
1. Используйте понятные имена переменных и функций
Если вы будете писать полные, описательные имена переменных и функций, то ваш код будет гораздо легче читать. Вот этот код не вполне понятен:
[python]function avg (a) {
let s = a.reduce((x, y) => x + y)
return s / a.length
}[/python]
Но он становится гораздо более читабельным, если написать полные имена переменных!
[python]function averageArray (array) {
let sum = array.reduce((number, currentSum) => number + currentSum)
return sum / array.length
}[/python]
Не минифицируйте свой код; используйте полные имена переменных, чтобы следующему разработчику они были понятны.
2. Пишите короткие функции, выполняющие только одно действие
Функции становятся гораздо понятнее, читабельнее и проще в обслуживании, если они выполняют лишь одно действие. Если мы пишем короткие функции и у нас проявляется баг, обычно бывает довольно легко найти источник проблемы. Также в таком случае наш код больше подходит для повторного использования.
Например, приведенную выше функцию можно было бы переименовать в «sumAndAverageArray», потому что мы вычисляем сумму, используя сокращения, а затем вычисляем среднее значение этой суммы.
[python]function sumAndAverageArray(array) {
let sum = array.reduce((number, currentSum) => number + currentSum)
return sum / array.length
}[/python]
Мы можем разбить эту функцию на две отдельные, и тогда станет гораздо яснее, что делает каждая часть кода. Также, если мы создаем большую программу, такая функция как sumArray вполне может пригодиться.
[python]function sumArray(array) {
return array.reduce((number, currentSum) => number + currentSum)
}
function averageArray(array) {
return sumArray(array) / array.length
}[/python]
Если вы пишете функцию, в имени которой можно вставить союз «и», – ее точно стоит разделить на две разные функции.
3. Документация
Пишите для своего кода хорошую документацию, чтобы разработчики, которые будут иметь дело с вашим кодом в будущем, понимали, что именно делает этот код и почему.
В следующем коде содержатся незадокументированные «магические числа».
[python]function areaOfCircle (radius) {
return 3.14 * radius ** 2
}[/python]
Мы можем добавить комментарий к этому коду. Таким образом он станет более понятен для кого-то, кто не знает математической формулы вычисления площади круга.
[python]const PI = 3.14 // PI rounded to two decimal places
function areaOfCircle (radius) {
// Implements the mathematical equation for the area of a circle:
// Pi times the radius of the circle squared.
return PI * radius ** 2
}[/python]
Примечание: указанный код это лишь пример! В своем коде вы наверняка бы использовали Math.PI вместо собственноручного присвоения значения PI.
Ваши комментарии должны отвечать на вопрос «Почему?» относительно вашего кода.
Бонус: используйте определенный стиль для документации вашего кода. Для Python мне нравится пользоваться Google Style Docstrings, а для JavaScript отлично подходит JSDoc.
4. Правила Сэнди Мец
Сэнди Мец (Sandi Metz) – отличный разработчик на языке Ruby, докладчик и писательница. У нее есть четыре правила для написания чистого кода в объектно-ориентированных языках.
- Классы должны содержать меньше 100 строк кода.
- Методы и функции не могут быть длиннее 5 строк кода.
- Передавать в метод не больше 4 параметров.
- Контроллеры могут обрабатывать только один объект.
Я настоятельно рекомендую посмотреть полную запись ее речи относительно этих правил!
Сама я последовательно придерживаюсь этих правил последние два года, и это стало настолько привычным, что я делаю это не задумываясь! Мне эти правила очень нравятся; я считаю, что они делают код более простым в поддержке.
Указанные выше правила – лишь рекомендации, но благодаря им ваш код может стать заметно чище.
5. Будьте последовательны
При написании кода последовательность очень важна. Не должно быть такого, что человеку стоит только глянуть на код, и он без всякого git blame уже знает, кто это писал! Если вы используете точку с запятой в JavaScript – ставьте их в конце каждого предложения. Также будьте последовательны в использовании определенного типа кавычек!
Я бы рекомендовала пользоваться руководством по стилю и линтером, чтобы обеспечить выполнение этого стандарта. Например, мне нравится Standard JS для JavaScript и PEP8 для Python. И мой текстовый редактор настроен таким образом, чтобы при сохранении код подгонялся под эти стандарты.
Выберите стиль кода и придерживайтесь его.
6. Избавляйтесь от «воды»
Одна из первых вещей, которым учат новых программистов, это «не повторяться». Если вы замечаете в своем коде повторы, используйте код для уменьшения числа таких дубликатов. Я часто поощряю своих студентов играть в SET для развития навыков распознавания шаблонов.
Однако, если вы «пересушите»* свой код, избрав неправильные шаблоны для абстрагирования, он может стать нечитаемым и вам придется дублировать его в дальнейшем. У Сэнди Мец есть отличная статья о том, что «дублирование обходится гораздо дешевле, чем неправильное абстрагирование».
Не повторяйтесь, но также и не абстрагируйте свой код до состояния нечитабельности.
*В оригинале используется игра слов: DRY как аббревиатура «don’t repeat yourself» и dry — «сухой».
7. Инкапсуляция + модуляризация
Группируйте подобные переменные и функции, чтобы сделать ваш код более понятным и подходящим для повторного использования.
[python]let name = ‘Ali’
let age = 24
let job = ‘Software Engineer’
let getBio = (name, age, job) => `${name} is a ${age} year-old ${job}` [/python]
Если в вашей программе много людей, то следующий код будет более понятным:
[python]class Person {
constructor (name, age, job) {
this.name = name
this.age = age
this.job = job
}
getBio () {
return `${this.name} is a ${this.age} year-old ${this.job}`
}
}[/python]
Или, если в вашем сценарии только один человек, то можно так:
[python]const ali = {
name: ‘Ali’,
age: 24,
job: ‘Software Engineer’,
getBio: function () {
return `${this.name} is a ${this.age} year-old ${this.job}`
}
}[/python]
Аналогично, разбивайте длинные программы на разные файлы, чтобы ваш код был более модульным и удобоваримым. Длинные файлы зачастую трудно анализировать, к тому же небольшие отрывки кода можно использовать повторно в других проектах.
Группируйте подобные вещи в вашем коде, чтобы он стал более подходящим для повторного использования.
В общем…
Это хорошие советы относительно того, как сделать код чище, но они не высечены на скрижалях! Я сама не пользуюсь ими всеми постоянно (это заметно, если глянуть на мои личные проекты), и никакой код не совершенен. Это лишь подсказки, как писать код, чтобы его было легче использовать повторно, проще читать и расширять.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]