Как перестать писать код с ошибками

Владимир Дашукевич

{
Тема: Как перестать писать код с ошибками,
Спикер: Владимир Дашукевич,
Компания: XBSoftware,
Конференция: FrontTalks
}

Мы пишем код с багами(

Мы не виноваты

Причины ошибок

Ограниченность видимости

                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	//	... 
            

Hoisting

                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	//	... 
            
                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	//	... 
            
                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	//	... 
            
                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	//	... 
            
                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	var isActive;
            
                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	var isActive;
            
                var isActive = true, 
                justDoIt = function () {
                	var elt, isActive;
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	elt = document.createElement("A");
                	isActive;
            
                var isActive = true, 
                justDoIt = function () {
                	var elt, isActive;
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	elt = document.createElement("A");
                	isActive;
            

Что делать?

  1. Code review
  2. Линтеры
  3. ES2015

Code review

Правила

Code review

Линтеры

ESLint

JSHint + JSCS

Espree

Polyjuice

Правила

Как его использовать? Часть 1

Как его использовать? Часть 2

                var isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	var elt = document.createElement("A");
                	var isActive;
            
                var isActive = true, 
                justDoIt = function () { 
                	var elt, isActuallyActive; 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	elt = document.createElement("A");
            

ES2015

let и const

Отличия от var:

  1. Область видимости
  2. Не возможно объявить повторно
  3. Отсутствие "hoisting"

Область видимости

                justDoIt = function () { 
                	if (true) { 
                		var a = 9; 
                	}
                }
            

Область видимости

                justDoIt = function () { 
                	if (true) { 
                		let a = 9; 
                	}
                }
            

Не возможность объявить повторно

                justDoIt = function () { 
                	var a = 9;
                	var a = 3; 
                }
            

Не возможность объявить повторно

                justDoIt = function () { 
                	let a = 9;
                	var a = 3; 
                }
            

Отсутствие "hoisting"

                justDoIt = function () { 
                	a = 3;
                	var a; 
                }
            

Отсутствие "hoisting"

                justDoIt = function () { 
                	a = 3;
                	let a; 
                }
            
                let isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	let elt = document.createElement("A");
                	let isActive;
            
                let isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	let elt = document.createElement("A");
                	let isActive;
            
                let isActive = true, 
                justDoIt = function () { 
                	if (isActive) { 
                		alert("it's done!") 
                	} 
                	let elt = document.createElement("A");
                	let isActive;
            

Как его использовать?

Итоги:

  1. Делайте "code review"
  2. Обязательно используйте линтеры
  3. Пишите на ES2015

Неизвестность

 
                var addDay = function (date) { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
            
 
                var addDay = function (date) { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
            

Конструктор для Date

                var date = new Date();  
                var newDate = new Date(date); 
            

ES2015

Конструктор для Date

  1. new Date()
  2. new Date(string)
  3. new Date(number)
  4. new Date(year, month[, date[, hours[, minutes[, seconds[, ms]]]]])
  5. new Date(Date)

Незнание библиотеки

Datepicker

No description or website provided

Конструктор для datepicker

 
                _datepicker = function(elementId, options)
            

Конструктор для datepicker

 
                _datepicker = function(elementId, options)
            

Конструктор для datepicker

 
                _datepicker = function(elementId, options)
            

Настройки для datepicker

 
                options.on = {};
            

Настройки для datepicker

 
                options.on = {
                	mousoever: () => { ... }	
                };
            

Команда

Что делать?

TypeScript

Типизированный JavaScript

ES2015 + типы и интерфейсы

Инструменты TypeScript

 
                var addDay = function (date) { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
            
 
                var addDay = function (date) { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
            
 
                var addDay = function (date: Date) { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
                addDay("2016/8/10");
            
 
                var addDay = function (date: Date): Date { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
                addDay("2016/8/10");
            
 
                var addDay = function (date: Date): Date { 
                	var newDate = new Date(date); 
                	if (isNaN(newDate)) { 
                		newDate = new Date(); 
                	}
                	newDate.setDate(newDate.getDate() + 1);
                	return newDate;
                }
                addDay("2016/8/10");
            
 
                var addDay = function (date: Date): Date { 
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	date.setDate(date.getDate() + 1);
                	return date;
                }
                addDay("2016/8/10");
            
 
                var addDay = function (date: Date): Date { 
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	date.setDate(date.getDate() + 1);
                	return date;
                }
                addDay(new Date("2016/8/10"));
            

Как его использовать?

Dart

Итоги:

  1. Используйте статическую типизацию
  2. Указывайте типы как минимум для публичных методов

Чертов Runtime!

 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var a = addDay(new Date("2016/8/10")).getTime();
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { // false 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { // false 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { // false 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date; // Date
                }
            
 
                var a = addDay(new Date("2016/8/10")).getTime();
            
 
                var a = addDay(null).getTime();
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { // false 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { // false 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date;
                }
            
 
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date; //null
                }
            
                // Cannot read property 'getTime' of null 
                var a = addDay(null).getTime();
            

Nullable

Что делать?

Flow

Почему Flow?

 
                // @flow
                var addDay = function (date: Date): Date {
                	if (isNaN(date)) { 
                		date = new Date(); 
                	}
                	if (date) { 
                		date.setDate(date.getDate() + 1); 
                	}
                	return date; //null
                }
            
 
                // @flow
                var a = addDay(null).getTime();
            

Typescript 2.0

 
                var addDay = function (date: Date): Date {
                	if (date) { 
                		date = new Date(); 
                	}
                	date.setDate(date.getDate() + 1); 
                	return date; // Date
                }
            

Итоги:

  1. Делайте code review
  2. Используйте линтеры
  3. Пишите на ES2015
  4. Используйте статическую типизацию!!!

And one more thing...

Перестаньте забирать у машин их хлеб!!!

Перестаньте делать ошибки!!!

Questions

Facebook: dashukevich.vova
Twitter: life__777