Начиная работать с различными языками программирования в сфере веб разработки, очень трудно запомнить все соглашения об именовании при переходах от одного языка к другому. Особенно, когда веб разработчики не имеют общего мнения по поводу того, что считать лучшей практикой программирования. Чтобы облегчить жизнь новичкам, в данной статье приводятся несколько общих соглашений об именовании.
1. Подчеркивание перед именем свойства
Если рассматривать переменные или методы, имена которых начинаются с _, то сложно будет найти какое-нибудь магическое действие, сокрытое от глаз. Это просто соглашение об именовании, которое служит отличным напоминанием разработчику о том, что переменная/свойство/метод объявлен как private или protected, и не доступно вне класса.
PHP
// Данная переменная недоступна вне класса
private $_someVariable;
class MyClass {
// Объявленный метод доступен только внутри данного класса или
// класса, который наследует его.
protected function __behindTheScenesMethod() {}
}
Обратите внимание, что подчеркивание в вышеприведенном коде НЕ ОБЪЯВЛЯЕТ переменную или метод как private. Для этого существует ключевые слова private/protected. Подчеркивание служит только в качестве напоминания (если придется вернуться к разбору кода спустя полгода)!
JavaScript
var Female = (function() {
var _trueAge = 50,
_trueWeight = 140;
return {
age : _trueAge - 15,
weight : _trueWeight - 30
};
})();
Female.age; // 35
Female.weight; // 110
Female._trueAge; // неопределенно (причина - свойство объявлено как private)
Объявляя Female эквивалентной не функции, а возвращаемому объекту, мы создаем частную переменную. Префикс в виде подчеркивания будет напоминать об этом.
2. КОНСТАНТЫ, написанные заглавными буквами
Константа - это переменная со статическим значением, которое не меняется. Например, если в проекте требуется умножать какое-нибудь значение на величину налога, то вы можете назначить данный коэффициент, например, .06, константе (если налог измениться, будет удобно поставить новую цифру в одном месте, а не перетряхивать весь код). Однако не все языки имеют такой тип переменных. Следовательно, отличной практикой является использование только заглавных букв в написании имени константы, чтобы напомнить самому себе о данном факте. Это общее соглашение в мире JavaScript и оно используется для его встроенных констант, например, MATH.PI.
JavaScript
var TAXRATE = .06;
PHP
define('TAXRATE', .06);
3. Односимвольный префикс
Наверняка вам уже попадались переменные, имена которые начинались с какого-нибудь маленького символа, например "s" или "i".
$sName = 'Капитан Сорви-Голова';
Это так называемая венгерская нотация, которая потеряла свою популярность в последние годы, но, тем не менее, все еще есть компании, которые ее используют в своих разработках. Венгерская нотация является соглашением о наименовании, которое предназначено для напоминания разработчику о типе переменной, с которой он работает: string, integer, и так далее.
Особенно неодобрительно на ее использование смотрят в мире JavaScript, так как в данном языке переменные не имеют жестко заданного типа. Представьте, что используя венгерскую нотацию, мы объявляем строку с именем, в котором первым символом стоит префикс "s", но чуть позже мы начинаем использовать данную переменную как целочисленную (integer)? В данном случае такая форма записи начнет работать против нас.
var sName = "Оберст-командор Мениторо Ла Цойг";
typeof(sName); // string
....
sName = undefined;
typeof(sName) // undefined
Символ доллара
Для пользователей jQuery: прежде чем стать на пьедестал и похвалить себя за неиспользование такого соглашения об именовании, спросите себя - использовали ли вы для переменных, значения которых обернуто в объект jQuery, символ доллара вначале? Если да, то знайте - это форма венгерской нотации. Назначение такого префикса состоит в том, чтобы информировать разработчика о свойствах переменной.
// Символ доллара напоминает, что данная переменная
// имеет доступ к методам jQuery.
var $container = $('#container');
Следует ли его использовать?
Ответ на поставленный вопрос полностью зависит от вас. Хотя многие разработчики jQuery используют префикс в виде символа доллара.
4. Первый символ в верхнем регистре
А как рассматривать “переменные”, имена которых начинаются с символа в верхнем регистре?
$response = $SomeClass->doSomething();
В вышеприведенном коде $SomeClass является классом, а не переменной. Данное соглашение о наименовании используется очень многими программистами. Когда возвращаешься к работе с кодом спустя некоторое время, такое именование сигнализирует, что имя используется для работы с классом, для которого доступны объекты и методы.
// Обратите внимание на заглавную M в имени класса.
class $MyClass {
function __construct() {}
}
JavaScript
В JavaScript в действительности не используются классы, но есть функции конструкторы.
var Jeff = new Person();
Причина, по которой используется заглавный символ в имени конструктора (Person) заключается в том, что очень просто забыть ключевое слово new. В таких случаях JavaScript не выдает никаких сообщений, и они могут стать ночным кошмаром при поиске проблемы. А заглавный символ является весьма удобным флагом для разработчика при отладке.
В качестве альтернативы вы можете создать защиту от такой забывчивости. Нужно проверить, чем является конструктор в действительности, и провести корректировку.
function Person(name) {
// Если опустить ключевое слово new, то будет использоваться конструктор window.
// В данном случае будем компенсировать отсутствие и возвращать новый экземпляр
if ( this.constructor !== Person ) {
return new Person(name);
}
this.name = name;
}
// Намеренно "забыто" ключевое слово new
var Joey = Person('Костя');
Joey.name; // Костя
5. РазделениеСловЗаглавнымиБуквами против использования_подчеркиваний
Почему в одних случаях используют разделение слов в именах переменных с помощью заглавных первых букв, а в других разделяют слова символом подчеркивания? Как правильно? Правила целиком зависят от соглашений в вашей рабочей группе. Оба метода равнозначны.
// Используем заглавные буквы
var preacherOfSockChanging = 'Лейтенант Бу';
// Используем символ подчеркивания
var preacher_of_sock_changing = 'Лейтенант Бу';
Однако, не смотря на все вышесказанное, следует соблюдать правила именования, принятые в используемом языке программирования. Например, многие разработчики JavaScript используют разделение слов в переменных заглавными буквами, а программисты PHP предпочитают использовать подчеркивание. Хотя данный вопрос не является камнем преткновения. В Zend Framework широко используется разделение слов заглавными буквами.
6. Структура каталогов
Данный вопрос становится особенно острым при работе в команде. В таких условиях просто необходимо иметь продуманную структуру каталога проекта. Но даже при работе над небольшими задачами в одиночку не стоит складывать таблицы стилей и скрипты в одну большую кучу в корневом каталоге без какой-либо организации. Многие разработчики предпочитают размещать изображения, скрипты и таблицы стилей в подкаталогах с родительской директорией Assets (переводится как "средство").
/ Project Root
/Assets
/ js
/ min
script_min.js
script.js
/ css
/ min
style_min.css
style.css
/ img
img1.jpg
index.html
otherFile.html
Отметьте также наличие папок min, которые содержат динамически добавляемые минимизированные версии ваших скриптов и таблиц стилей.
7. Семантика
При создании разметки ваши id и классы должны описывать тип контента, но никак не презентационные аспекты. Например:
Очень плохо
<div id="немного-левее-и-чуть-чуть-выше"> Вася Пупкин - дурак, курит табак. </div>
Лучше
<div class="section"> Вася Пупкин - дурак, курит табак. </div>
Самый хороший вариант
<section> Вася Пупкин - дурак, курит табак. </section>
Почему? Допустим спустя шесть месяцев вы решите, что прославлять Васю Пупкина стоит в секции, которая расположена немного-ПРАВЕЕ-и-чуть-чуть-выше? В данном случае ваш id сразу же потеряет смысл.
Постепенно мы переходим в мир HTML5, и использование идентификаторов существенно сокращается, потому что для различных разделов страницы есть стандартные теги.
8. Сокращения
Решение об использовании сокращений в коде всегда принимается на поле битвы между легкостью чтения и размером кода. Рассмотрим два примера:
Вы используете тернарный оператор?
var name = 'Моня';
// обычное использование
if ( name === 'Родослав' ) {
alert("Это я!");
} else {
alert("Никого нет дома");
}
// Тернарный оператор
(name === 'Родослав') ? alert("Это я!") : alert("Никого нет дома");
Как насчет использования логического И для сокращения условных операндов?
var getTweets = true;
// Обычное использование
if ( getTweets ) {
alert('Щас мы ево зачепим!');
}
// Логическое И
// Правая часть выражения не будет исполняться до тех пор, пока левая часть не будет иметь значение "true"
getTweets && alert('Щас мы ево зачепим!');
Очень многие разработчики косо смотрят на такое использование логического И, объясняя существенной потерей легкости чтения кода. Хотя это правильный аргумент, тем не менее, даже в jQuery часто используется данный метод.
Заключение
В данной статье рассмотрено несколько распространенных соглашений наименования, но их использование является личным делом каждого. В действительности, многие команды разработчиков пишут настоящие фолианты по правилам именования.