Автор оригинала: FreeCodeCamp Community Member.
Запись кода – это одно, но написание чистого чистота, читаемый код – это другое. Но что такое «чистый код?» Я создал этот короткий Чистый код для начинающих Guide Чтобы помочь вам на пути к освоению и пониманию искусства чистого кода.
Представьте, что вы читаете статью. Там есть параграф, который дает вам краткий обзор того, о чем в статье. Есть заголовки, каждый с кучей абзацев. Параграфы структурированы с соответствующими битами информации, сгруппированными вместе и приказали таким образом, чтобы статью «течь» и читает хорошо.
Теперь, образ статьи не было никаких заголовков. Есть абзацы, но они длинные и в путающем порядке. Вы не можете сниматься прочитать статью, и приходится действительно погрузиться в контент, чтобы почувствовать, о чем в статье. Это может быть довольно неприятным!
Ваш код должен прочитать как хорошая статья. Подумайте о ваших классах/файлах в качестве заголовков, и ваши методы в качестве пунктов. Предложения – это заявления в вашем коде. Вот некоторые из характеристик чистого кода:
- Чистый код сосредоточен – каждая функция, каждый класс и модуль должен сделать одну вещь и делать это хорошо.
- Это должно быть элегантным – чистый код должен быть простой читать. Чтение Это должно заставить вас улыбаться. Это должно оставить вас задуматься: «Я точно знаю, что делает этот код»
- Чистый код заботится о. Кто-то занял время, чтобы держать его простым и упорядоченным. Они уделили соответствующее внимание деталям. Они заботились.
- Тесты должны проходить – сломанный код не чистый!
На большой вопрос дня – как вы на самом деле пишу чистый код как младший разработчик? Вот мои лучшие советы, чтобы начать.
Используйте согласованные форматирование и отступ
Книги будут трудно прочитать, если расстояние между линиями несовместима, размеры шрифтов были разными, и разрывы линии были повсюду. То же самое касается вашего кода.
Чтобы сделать ваш код четко и легко читать, убедитесь, что отступ, разрывы линии и форматирование согласуются. Вот хороший и плохой пример:
Добро
function getStudents(id) {
if (id !== null) {
go_and_get_the_student();
} else {
abort_mission();
}
}- На первый взгляд вы можете сказать, что есть
Если/elseЗаявление в рамках функции - Брекеты и постоянные отступы позволяют легко увидеть, где код блоков и заканчивается
- Брекеты являются последовательными – обратите внимание, как открывающая скобка для
Функцияи дляЕслинаходятся на одной линии
Плохо
function getStudents(id) {
if (id !== null) {
go_and_get_the_student();}
else
{
abort_mission();
}
}Вуа! Так много неправильно здесь.
- Отступ повсюду – вы не можете сказать, где функция заканчивается, или где
Если/elseБлок запускается (да, есть ли, если/else Block там!) - Брекеты запутаны и не являются последовательными
- Интервал между линией несовместимо
Это немного преувеличенного примера, но он показывает преимущество использования постоянных отступов и форматирования. Я не знаю о тебе, но «хороший» пример был намного проще для меня!
Хорошая новость заключается в том, что есть много плагинов IDE, которые вы можете использовать для автоматического формата кода для вас. Аллилуйя!
- VS код: Красивее
- Атом: Атом украсит
- Предвежен текст: Предел
Используйте четкие переменные и имена методов
В начале я говорил о том, как важно, чтобы ваш код легко читать. Большой аспект этого – это название, которое вы выбираете (это одно из ошибок , которые я сделал, когда я был младшим разработчиком ). Давайте посмотрим на пример хорошего имена:
function changeStudentLabelText(studentId){
const studentNameLabel = getStudentName(studentId);
}
function getStudentName(studentId){
const student = api.getStudentById(studentId);
return student.name;
}Этот фрагмент кода хорош для ряда способов:
- Функции четко называются хорошо называемыми аргументами. Когда разработчик читает это, в их разуме ясно, «если я позвоню»
getStudentname ()Метод сStudentiD, я получу имя студента «- им не нужно ориентироваться кgetstudentname ()Метод, если им не нужно! - В пределах
getstudentname ()Метод, переменные и вызовы методов снова четко называются – легко увидеть, что метод вызоветAPI, получитьСтудентобъект и возвращаетИмяимущество. Легкий!
Выбирая хорошие имена при написании чистого кода для начинающих сложнее, чем вы думаете. По мере роста вашего приложения используйте эти конвенции, чтобы убедиться, что ваш код легко читать:
- Выберите стиль именования и быть последовательным. Либо
камераилиunder_scoresНо не оба! - Назовите вашу функцию, методы и переменные тем, что делает то, что делает то, или что такая вещь. Если ваш метод получить что-то, положить
получитьво имя. Если ваша переменная магазины Цвет автомобиля, назовите этоCarcolour, Например.
Бонусный совет – Если вы не можете назвать свою функцию или метод, то эта функция делает слишком много. Продолжай и сломайте его на меньшие функции! E.G Если вы получите вызов вашей функции UpdateCarandsave () Создать 2 метода UpdateCar () и Savecar () Отказ
Используйте комментарии, где это необходимо
Есть поговорка, «код должен быть самодоступным», который в основном означает, вместо того, чтобы использовать комментарии, ваш код должен прочитать достаточно хорошо сокращение необходимости в комментариях. Это действительный момент, и я думаю, это имеет смысл в идеальном мире. Тем не менее, мир кодирования далеко не идеально, поэтому иногда комментарии необходимо.
Комментарии документации – это комментарии, которые описывают, что делает конкретную функцию или класс. Если вы пишете библиотеку, это будет полезно для разработчиков, которые используют вашу библиотеку. Вот пример из usejsdoc:
/** * Solves equations of the form a * x = b
* @example *
// returns 2 * globalNS.method1(5, 10);
* @example *
// returns 3 * globalNS.method(5, 15);
* @returns {Number} Returns the value of x for the equation. */ globalNS.method1 = function (a, b) { return b / a; };Уточнение комментариев предназначено для всех (включая ваше будущее Я), который может потребоваться сохранить, рефакторировать или расширить свой код. Чаще всего можно избежать разъяснений комментариев в пользу «самодокуменного кода». Вот пример разъяснения комментария:
/* This function calls a third party API. Due to some issue with the API vender, the response returns "BAD REQUEST" at times. If it does, we need to retry */
function getImageLinks(){
const imageLinks = makeApiCall();
if(imageLinks === null){
retryApiCall();
} else {
doSomeOtherStuff();
}
}Вот несколько комментариев, которые вы должны попробовать и избежать. Они не предлагают много ценности, могут быть вводят в заблуждение и просто загромождать код.
Избыточные комментарии, которые не добавляют значение:
// this sets the students age function setStudentAge();
Вводящие в заблуждение комментарии:
//this sets the fullname of the student function setLastName();
Смешные или оскорбительные комментарии:
// this method is 5000 lines long but it's impossible to refactor so don't try function reallyLongFunction();
Помните сухое принцип (не повторяйте себя)
Сухой принцип указан как:
На самом простом уровне это в основном означает, что вы должны стремиться снизить количество дублированного кода, который существует. (Обратите внимание, что я сказал: « Уменьшить» И не «Устранить» – Есть несколько случаев, когда дублированный код не является концом мира!)
Дублированный код может быть кошмаром для поддержания и изменения. Давайте посмотрим на пример:
function addEmployee(){
// create the user object and give the role
const user = {
firstName: 'Rory',
lastName: 'Millar',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
axios.post('/user', user)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
function addManager(){
// create the user object and give the role
const user = {
firstName: 'James',
lastName: 'Marley',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
axios.post('/user', user)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
function addAdmin(){
// create the user object and give the role
const user = {
firstName: 'Gary',
lastName: 'Judge',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
axios.post('/user', user)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}Представьте себе, что вы создаете веб-приложение для персонала для клиента. Это приложение позволяет администраторам добавлять пользователей ролями в базу данных через API. Есть 3 роля; Сотрудник, менеджер и админ. Давайте посмотрим на некоторые функции, которые могут существовать:
Прохладный! Код работает, и все хорошо в мире. Через некоторое время наш клиент приходит и говорит:
Поэтому, прежде чем мы прыгаем и начните кодировать, давайте вернемся. Помните в начале этого чистого кода для начинающих статьи, когда я сказал «Чистый код должен быть сосредоточен». I.e, Сделай одну вещь и сделай это хорошо? Здесь наш текущий код имеет небольшую проблему. Код, который делает вызов API и обрабатывает ошибку, повторяется, что означает, что мы должны изменить код в 3 места для удовлетворения новых требований. Раздражающий!
Итак, что если мы увековерили это на быть более сосредоточенным ? Посмотрите на следующее:
function addEmployee(){
// create the user object and give the role
const user = {
firstName: 'Rory',
lastName: 'Millar',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
saveUserToDatabase(user);
}
function addManager(){
// create the user object and give the role
const user = {
firstName: 'James',
lastName: 'Marley',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
saveUserToDatabase(user);
}
function addAdmin(){
// create the user object and give the role
const user = {
firstName: 'Gary',
lastName: 'Judge',
role: 'Admin'
}
// add the new user to the database - and log out the response or error
saveUserToDatabase(user);
}
function saveUserToDatabase(user){
axios.post('/users', user)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log("there was an error " + error);
});
}Мы переместили логику, которая создает вызов API в собственный метод SaveUserTodatabase (пользователь) (Это хорошее имя? Вы решаете!) Какие другие методы позвоню Чтобы сохранить пользователя. Теперь, если нам нужно снова изменить логику API, нам нужно только обновить 1 метод. Аналогично, если мы должны добавить другой метод, который создает пользователей, метод сохранения пользователя в базу данных через API уже существует. Ура!
Пример рефакторинга, используя то, что мы узнали до сих пор
Давайте закроем наши глаза и действительно притворяйтесь, что мы делаем приложение калькулятора. Существуют функции, которые используются, которые позволяют добавлять, вычесть, умножить и разделить соответственно. Результат выводится на консоль.
Вот что мы имеем до сих пор. Посмотрите, можете ли вы обнаружить проблемы, прежде чем двигаться дальше:
function addNumbers(number1, number2)
{
const result = number1 + number2;
const output = 'The result is ' + result;
console.log(output);
}
// this function substracts 2 numbers
function substractNumbers(number1, number2){
//store the result in a variable called result
const result = number1 - number2;
const output = 'The result is ' + result;
console.log(output);
}
function doStuffWithNumbers(number1, number2){
const result = number1 * number2;
const output = 'The result is ' + result;
console.log(output);
}
function divideNumbers(x, y){
const result = number1 / number2;
const output = 'The result is ' + result;
console.log(output);
}Каковы проблемы?
- Отступ несовместим – это не имеет большого значения, какой формат отступа мы используем, так же, как это согласуется
- 2-я функция имеет некоторые избыточные комментарии – мы можем сказать, что происходит, чтение имени функции и код внутри функции, поэтому нам действительно нужен комментарий здесь?
- 3-й и 4-й функции не используют хорошее название –
Достофвитнурники ()Разве не лучшее имя функции, так как он не говорит, что это делает.(х, у)не описательные переменные тоже – этоX & YФункции? Числа? Бананы? - Методы делать больше, чем одна вещь – Выполняет расчет, но также отображает выход. Мы можем разделить Дисплей Логика на отдельный метод – согласно Сухой принцип
Теперь мы будем использовать то, что мы узнали в этом чистом коде для начинающих руководств по рефакторе все, чтобы наш новый код выглядел:
function addNumbers(number1, number2){
const result = number1 + number2;
displayOutput(result)
}
function substractNumbers(number1, number2){
const result = number1 - number2;
displayOutput(result)
}
function multiplyNumbers(number1, number2){
const result = number1 * number2;
displayOutput(result)
}
function divideNumbers(number1, number2){
const result = number1 * number2;
displayOutput(result)
}
function displayOutput(result){
const output = 'The result is ' + result;
console.log(output);
}- Мы исправили отступ, чтобы это соответствовало
- Скорректировано именование функций и переменных
- Убрал ненужные комментарии
- Переместил
DisplayOutput ()логика в свой собственный метод – если вывод должен изменить, нам нужно только изменить его одно место
Поздравляю! Теперь вы можете поговорить о том, как вы знаете принципы чистого кода в интервью и когда написание вашего убийцы резюме !
Не «за чистый» ваш код
Я часто вижу, что разработчики переходят сверху, когда дело доходит до чистого кода. Будьте осторожны, чтобы не попробовать и очистить свой код слишком много, так как он может иметь противоположный эффект, и на самом деле сделать ваш код сложнее читать и поддерживать. Это также может оказать влияние на производительность, если разработчик должен постоянно прыгать между множеством файлов/методов, чтобы сделать простое изменение.
Будьте внимательны к чистому коду, но не переверните его на ранних этапах ваших проектов. Убедитесь, что ваш код работает, и хорошо проверен. Во время этапа рефакторинга – это когда вы действительно должны подумать о том, как убирать код с использованием сухого принципа и т. Д.
В этом чистом коде для начинающих руководства мы узнали, как:
- Используйте согласованные форматирование и отступ
- Используйте четкие переменные и имена методов
- Используйте комментарии, где это необходимо
- Используйте сухой принцип (не повторите себя)
Если вам понравилось это руководство, обязательно проверим Чистый код: Справочник Agile программного обеспечения мастерство Роберт С Мартином Отказ Если вы серьезно относитесь к написанию чистого кода и вырвалось из младшего уровня разработчика, я настоятельно рекомендую эту книгу.
Спасибо за прочтение!
Чтобы получить последние руководства и курсы для младших разработчиков прямо в свой почтовый ящик, обязательно присоединитесь к списку рассылки на www.chrisblakely.dev !