- PVSM.RU - https://www.pvsm.ru -

Idiomatic.js — Принципы написания консистентного, идиоматического кода на JavaScript

Доброго времени суток уважаемые читатели. Буквально недавно я наткнулся на очень интересный и необычный проект на Github, который посвящен замечательному языку программирования JavaScript и называется Idiomatic.js [1].

Данный проект — попытка авторов создать спецификацию, определяющую список норм и правил написания кода на JavaScript, некий «кодекс чести» для программистов. В написании данного документа приняли участие свыше 20 матерых разработчиков. Предложенная специфика уже переведена на 12 языков. Idiomatic.js уже набрал 4500 старов, 500 форков и даже привлек внимание у компании Mozilla, поскольку ссылка на него уже размещена на главной странице MDN Javascript [2] в разделе «Инструменты и дополнительные ресурсы».

Код в любом проекте должен выглядеть так, будто его писал один человек, неважно как много людей работали над ним

Приведу несколько цитат от авторов проекта:

«Все последующее является списком норм, которыми я руководствуюсь при написании кода, чьим автором я являюсь; любой вклад в проекты, которые я создал, должен отвечать этим нормам. Я не намерен навязывать свои предпочтения в стиле другим людям или проектам; собственный стиль написания кода достоин уважения.»

Rick Waldron [3]

«Чтобы быть хорошим управляющим проекта, нужно понимать, что писать код для себя это Плохая Идея. Если тысячи людей используют ваш код, то пишите свой код максимально понятно, а не на собственное усмотрение.»

Idan Gazit [4]

«Споры по поводу стилей бессмысленны. У вас должно быть руководство по стилю и вы должны следовать ему.»

Rebecca Murphey


Пример документа:

Красивый Синтаксис

A. Скобки, Фигурные Скобки, Переносы Строк

// if/else/for/while/try всегда разделяются пробелом,
// это улучшает читабельность

// 2.A.1.1
// Пример неразборчивого синтаксиса

if(condition) doSomething();

while(condition) iterating++;

for(var i=0;i<100;i++) someInterativeFn();

// 2.A.1.1
// Используйте пробелы для того, чтобы улучшить читабельность

if ( condition ) {
  // выражения
}

while ( condition ) {
  // выражения
}

for ( var i = 0; i < 100; i++ ) {
  // выражения
}

// Еще лучше:

var i,
  length = 100;

for ( i = 0; i < length; i++ ) {
  // выражения
}

// Или...

var i = 0,
  length = 100;

for ( ; i < length; i++ ) {
  // выражения
}

var prop;

for ( prop in object ) {
  // выражения
}

if ( true ) {
  // выражения
} else {
  // выражения
}

B. Присваивание, Объявление, Функции (Именованные, Функции-Выражения, Функции-Конструкторы)

// 2.B.1.1
// Переменные
var foo = "bar",
  num = 1,
  undef;

// Объявление литералов:
var array = [],
  object = {};

// 2.B.1.2
// Использование только одного `var` на одну область видимости улучшает читабельность
// и упорядочивает блок объявления переменных (также сохраняет вам несколько нажатий клавиш)

// Неправильно
var foo = "";
var bar = "";
var qux;

// Правильно
var foo = "",
  bar = "",
  quux;

// или...
var // комментарий для переменных
foo = "",
bar = "",
quux;

// 2.B.1.3
// Оператор var всегда должен быть в начале области видимости (функции).
// То же самое верно для констант и оператора let из ECMAScript 6.

// Неправильно
function foo() {

  // выражения

  var bar = "",
    qux;
}

// Правильно
function foo() {
  var bar = "",
    qux;

  // все выражения после объявления переменных.
}

// 2.B.2.1
// Объявление Именованных Функций
function foo( arg1, argN ) {

}

// Использование
foo( arg1, argN );

// 2.B.2.2
// Объявление Именованных Функций
function square( number ) {
  return number * number;
}

// Использование
square( 10 );

// Очень надуманный стиль передачи параметров
function square( number, callback ) {
  callback( number * number );
}

square( 10, function( square ) {
  // обратный вызов
});

// 2.B.2.3
// Функция-Выражение
var square = function( number ) {
  // вернуть что-то ценное и важное
  return number * number;
};

// Функция-Выражение с Идентификатором
// Такое объявление хорошо тем, что функция может вызвать сама себя
// и ее имя будет видно в стеке вызова функций:
var factorial = function factorial( number ) {
  if ( number < 2 ) {
    return 1;
  }

  return number * factorial( number-1 );
};

// 2.B.2.4
// Объявление Конструктора
function FooBar( options ) {

  this.options = options;
}

// Использование
var fooBar = new FooBar({ a: "alpha" });

fooBar.options;
// { a: "alpha" }


На мой взгляд проект достоин внимания широкой публики. Я считаю, что массовое соблюдение подобных нормативов улучшит и упорядочит разработку, более того «дисциплина» написания, возможно повлияет на сокращение «быдлокода» в целом. Если идея распространиться в нео сфере, то подобная специфика появиться и для других языков программирования, а спустя время даже некачественные сайты обучающие кодингу, на которых регулярно обучаются новички, будут содержать корректный консистентный идиоматический код.

Я не являюсь программистом с богатым опытом, но если Вы такой, то вместе с авторами проекта призываю Вас принять участие в улучшении этого «живого документа»: fork, clone, branch, commit, push, pull request.

Да будет же мир кода лучше! Спасибо всем за внимание.

Автор: ilusha_sergeevich

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/35535

Ссылки в тексте:

[1] Idiomatic.js: https://github.com/rwldrn/idiomatic.js

[2] главной странице MDN Javascript: https://developer.mozilla.org/ru/docs/JavaScript

[3] Rick Waldron: https://github.com/rwldrn

[4] Idan Gazit: https://github.com/idan

[5] Источник: http://habrahabr.ru/post/181426/