Если вы заботитесь о самом коде, и о том, как он написан, а не заняты лишь тем, чтобы создавать работающие программы, это означает что вы стремитесь к тому, чтобы ваш код был чистым. Профессиональный разработчик пишет код не только в расчёте на компьютеры, но и в расчёте на себя самого, встретившего этот код в будущем, и в расчёте на других программистов. Код, который вы пишете, не исчезает навсегда в недрах компьютера. Он живёт, изменяется, и, если написан плохо, вполне может сильно расстроить того, кому придётся редактировать его после того, как вы его написали. Вполне возможно, что этим «кем-то» будете именно вы.
Исходя из этих идей, чистый код можно определить как код, написанный так, что он сам себя объясняет. Этот код без труда смогут понять люди, его легко будет модифицировать или расширять.
==
использовать ===
.// Если необдуманно использовать оператор == - это может серьёзно повлиять на программную логику. Это можно сравнить с тем, что некто ожидает, что пойдёт налево, но по какой-то причине вдруг идёт направо.
0 == false // true
0 === false // false
2 == "2" // true
2 === "2" // false
// пример
const value = "500";
if (value === 500) {
console.log(value);
// этот код не выполнится
}
if (value === "500") {
console.log(value);
// этот код выполнится
}
let daysSLV = 10;
let y = new Date().getFullYear();
let ok;
if (user.age > 30) {
ok = true;
}
const MAX_AGE = 30;
let daysSinceLastVisit = 10;
let currentYear = new Date().getFullYear();
...
const isUserOlderThanAllowed = user.age > MAX_AGE;
let nameValue;
let theProduct;
let name;
let product;
const users = ["John", "Marco", "Peter"];
users.forEach(u => {
doSomething();
doSomethingElse();
// ...
// ...
// ...
// ...
// Тут перед нами ситуация, в которой возникает WTF-вопрос "Для чего используется `u`?"
register(u);
});
const users = ["John", "Marco", "Peter"];
users.forEach(user => {
doSomething();
doSomethingElse();
// ...
// ...
// ...
// ...
register(user);
});
const user = {
userName: "John",
userSurname: "Doe",
userAge: "28"
};
...
user.userName;
const user = {
name: "John",
surname: "Doe",
age: "28"
};
...
user.name;
function notif(user) {
// реализация
}
function notifyUser(emailAddress) {
// реализация
}
function getUsers(fields, fromDate, toDate) {
// реализация
}
function getUsers({ fields, fromDate, toDate }) {
// реализация
}
getUsers({
fields: ['name', 'surname', 'email'],
fromDate: '2019-01-01',
toDate: '2019-01-18'
})
function createShape(type) {
const shapeType = type || "cube";
// ...
}
function createShape(type = "cube") {
// ...
}
function notifyUsers(users) {
users.forEach(user => {
const userRecord = database.lookup(user);
if (userRecord.isVerified()) {
notify(user);
}
});
}
function notifyVerifiedUsers(users) {
users.filter(isUserVerified).forEach(notify);
}
function isUserVerified(user) {
const userRecord = database.lookup(user);
return userRecord.isVerified();
}
Object.assign
для установки свойств объектов по умолчанию.const shapeConfig = {
type: "cube",
width: 200,
height: null
};
function createShape(config) {
config.type = config.type || "cube";
config.width = config.width || 250;
config.height = config. height || 250;
}
createShape(shapeConfig);
const shapeConfig = {
type: "cube",
width: 200
// Значение ключа 'height' не задано
};
function createShape(config) {
config = Object.assign(
{
type: "cube",
width: 250,
height: 250
},
config
);
...
}
createShape(shapeConfig);
function createFile(name, isPublic) {
if (isPublic) {
fs.create(`./public/${name}`);
} else {
fs.create(name);
}
}
function createFile(name) {
fs.create(name);
}
function createPublicFile(name) {
createFile(`./public/${name}`);
}
Array.prototype.myFunc = function myFunc() {
// реализация
};
class SuperArray extends Array {
myFunc() {
// реализация
}
}
function isUserNotBlocked(user) {
// реализация
}
if (!isUserNotBlocked(user)) {
// реализация
}
function isUserBlocked(user) {
// реализация
}
if (isUserBlocked(user)) {
// реализация
}
undefined
или null
.if (isValid === true) {
// что-то сделать...
}
if (isValid === false) {
// что-то сделать...
}
if (isValid) {
// что-то сделать...
}
if (!isValid) {
// что-то сделать...
}
class Car {
// ...
getMaximumSpeed() {
switch (this.type) {
case "Ford":
return this.someFactor() + this.anotherFactor();
case "Mazda":
return this.someFactor();
case "McLaren":
return this.someFactor() - this.anotherFactor();
}
}
}
class Car {
// ...
}
class Ford extends Car {
// ...
getMaximumSpeed() {
return this.someFactor() + this.anotherFactor();
}
}
class Mazda extends Car {
// ...
getMaximumSpeed() {
return this.someFactor();
}
}
class McLaren extends Car {
// ...
getMaximumSpeed() {
return this.someFactor() - this.anotherFactor();
}
}
const Person = function(name) {
if (!(this instanceof Person)) {
throw new Error("Instantiate Person with `new` keyword");
}
this.name = name;
};
Person.prototype.sayHello = function sayHello() { /**/ };
const Student = function(name, school) {
if (!(this instanceof Student)) {
throw new Error("Instantiate Student with `new` keyword");
}
Person.call(this, name);
this.school = school;
};
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.printSchoolName = function printSchoolName() { /**/ };
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
/* ... */
}
}
class Student extends Person {
constructor(name, school) {
super(name);
this.school = school;
}
printSchoolName() {
/* ... */
}
}
this
. Это позволит объединять вызовы таких функций в цепочки.class Person {
constructor(name) {
this.name = name;
}
setSurname(surname) {
this.surname = surname;
}
setAge(age) {
this.age = age;
}
save() {
console.log(this.name, this.surname, this.age);
}
}
const person = new Person("John");
person.setSurname("Doe");
person.setAge(29);
person.save();
class Person {
constructor(name) {
this.name = name;
}
setSurname(surname) {
this.surname = surname;
// Возвратим this для получения возможности объединять вызовы методов в цепочки
return this;
}
setAge(age) {
this.age = age;
// Возвратим this для получения возможности объединять вызовы методов в цепочки
return this;
}
save() {
console.log(this.name, this.surname, this.age);
// Возвратим this для получения возможности объединять вызовы методов в цепочки
return this;
}
}
const person = new Person("John")
.setSurname("Doe")
.setAge(29)
.save();
К сожалению, не доступен сервер mySQL