- PVSM.RU - https://www.pvsm.ru -
Перевод книги Райана Макдермота clean-code-javascript [1]
В javascript отсутствуют ключевые слова private и public, что усложняет реализацию классов. Лучше использовать геттеры и сеттеры для доступа к свойствам объекта, чем напрямую к ним обращаться. Вы спросите «Зачем?». Вот несколько причин:
Плохо:
class BankAccount {
constructor() {
this.balance = 1000;
}
}
const bankAccount = new BankAccount();
// Покупаем, например, обувь...
bankAccount.balance -= 100;
Хорошо:
class BankAccount {
constructor(balance = 1000) {
this._balance = balance;
}
set balance(amount) {
if (verifyIfAmountCanBeSetted(amount)) {
this._balance = amount;
}
}
get balance() {
return this._balance;
}
verifyIfAmountCanBeSetted(val) {
// ...
}
}
const bankAccount = new BankAccount();
// Покупаем, например, обувь...
bankAccount.balance -= shoesPrice;
// получаем баланс
let balance = bankAccount.balance;
Это возможно с помощью замыканий.
Плохо:
const Employee = function(name) {
this.name = name;
};
Employee.prototype.getName = function getName() {
return this.name;
};
const employee = new Employee('John Doe');
console.log(`Employee name: ${employee.getName()}`);
// Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`);
// Employee name: undefined
Хорошо:
const Employee = function (name) {
this.getName = function getName() {
return name;
};
};
const employee = new Employee('John Doe');
console.log(`Employee name: ${employee.getName()}`);
// Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`);
// Employee name: John Doe
Колбеки приводят к чрезмерной вложенности и плохой читаемости кода.
Плохо:
require('request').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', (requestErr, response) => {
if (requestErr) {
console.error(requestErr);
} else {
require('fs').writeFile('article.html', response.body, (writeErr) => {
if (writeErr) {
console.error(writeErr);
} else {
console.log('File written');
}
});
}
});
Хорошо:
require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
.then((response) => {
return require('fs-promise').writeFile('article.html', response);
})
.then(() => {
console.log('File written');
})
.catch((err) => {
console.error(err);
});
Промисы очень хорошая альтернатива колбекам, но в ES2017 / ES8 спецификации появился аsync/аwait, который предлагает ещё лучше решение. Все, что вам нужно, это написать функцию с префиксом async, внутри которой вы можете писать вашу асинхронную логику императивно. аsync/аwait можно использовать прямо сейчас при помощи babel.
Плохо:
require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
.then((response) => {
return require('fs-promise').writeFile('article.html', response);
})
.then(() => {
console.log('File written');
})
.catch((err) => {
console.error(err);
});
Хорошо:
async function getCleanCodeArticle() {
try {
const response = await require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin');
await require('fs-promise').writeFile('article.html', response);
console.log('File written');
} catch(err) {
console.error(err);
}
}
Бросать ошибки хорошее решение! Это означает, что во время выполнения вы будете знать если что-то пошло не так. Вы сможете остановить выполнение вашего приложение в нужный момент и видеть место ошибки с помощью стек трейса в консоли.
Ничего не делая с пойманной ошибкой вы теряете возможность исправить ошибку или отреагировать на неё когда-либо. Вывод ошибки в консоль(console.log(error)) не дает лучшего результата, потому-что ошибка может потеряться среди выводимых записей в консоль. Если вы заворачиваете кусок кода в try / catch, значит вы предполагаете возникновение ошибки. В таком случае вы должны иметь запасной план на этот случай.
Плохо:
try {
functionThatMightThrow();
} catch (error) {
console.log(error);
}
Хорошо:
try {
functionThatMightThrow();
} catch (error) {
// Один из вариантов (более заметный, чем console.log):
console.error(error);
// Другой вариант, известить пользователя про ошибку:
notifyUserOfError(error);
// И еще вариант, отправить ошибку на сервер :
reportErrorToService(error);
// Или используйте все три варианта!
}
Вы не должны игнорировать ошибки возникшие в промисе по той же причине что отловленные ошибки в try / catch.
Плохо:
getdata()
.then((data) => {
functionThatMightThrow(data);
})
.catch((error) => {
console.log(error);
});
Хорошо:
getdata()
.then((data) => {
functionThatMightThrow(data);
})
.catch((error) => {
// Один из вариантов (более заметный, чем console.log):
console.error(error);
// Другой вариант, известить пользователя про ошибку:
notifyUserOfError(error);
// И еще вариант, отправить ошибку на сервер :
reportErrorToService(error);
// Или используйте все три варианта!
});
Автор: BoryaMogila
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/235823
Ссылки в тексте:
[1] clean-code-javascript: https://github.com/ryanmcdermott/clean-code-javascript
[2] Введение: https://habrahabr.ru/post/319472/
[3] Переменные: https://habrahabr.ru/post/319476/
[4] Функции: https://habrahabr.ru/post/319480/
[5] Классы: https://habrahabr.ru/post/319804/
[6] Объекты и структуры данных.: https://habrahabr.ru/post/319894/#dataStructuresAndClasses
[7] Асинхронность.: https://habrahabr.ru/post/319894/#asyncronyus
[8] Обработка ошибок.: https://habrahabr.ru/post/319894/#erorrHeandling
[9] Источник: https://habrahabr.ru/post/319894/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.