This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/includes/kohana/modules/userguide/guide/ru-ru/about.conventions.md

301 lines
15 KiB
Markdown
Raw Normal View History

2010-08-21 04:43:03 +00:00
# Соглашения
При работе с фреймворком приветствуется использование Kohana [coding style](http://dev.kohanaphp.com/wiki/kohana2/CodingStyle). В нем используется [BSD/Allman стиль](http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%81%D1%82%D1%83%D0%BF_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.A1.D1.82.D0.B8.D0.BB.D1.8C_.D0.9E.D0.BB.D0.BC.D0.B0.D0.BD.D0.B0) расстановки фигурных скобок и прочего форматирования кода.
## Имена классов и расположение файлов {#classes}
Для облегчения работы [автозагрузки](about.autoloading) в Kohana, имена классов строго регламентированы. Имя класса должно начинаться с заглавной буквы, а для разделения слов в имени используется нижнее_подчёркивание. Нижнее подчёркивание отражает расположение файла в файловой структуре проекта.
Данные соглашения предусматривают:
1. Не рекомендуется использовать CamelCase в имени класса, за исключением случаев, когда нежелательно создавать дополнительные поддиректории.
2. Все файлы классов и директории должны быть в нижнем регистре.
3. Все классы должны располагаться в директории `classes`, которая может быть на любом уровне [каскадной файловой системы](about.filesystem) фреймворка.
[!!] В отличие от Kohana версии 2.x, в Kohana 3 нет разделения между "типами" классов: будь то "контроллер", "модель", "библиотека" или "хелпер". Все классы располагаются в директории "classes/" вне зависимости от того, являются ли они статическими "хелперами" или объектами "библиотеки". Вы вправе реализовывать любой дизайн класса, который Вам необходим: статический, синглтон, адаптер и т.п.
## Примеры
Помните, нижнее подчёркивание в наименовании класса отвечает за разделение на директории и отражает расположение файла в файловой структуре проекта.
Название класса | Файл
----------------------|-------------------------------
Controller_Template | classes/controller/template.php
Model_User | classes/model/user.php
Database | classes/database.php
Database_Query | classes/database/query.php
Form | classes/form.php
## Стандарты кодирования {#coding_standards}
Для того, чтобы Ваш код был удобочитаемым и выглядел последовательным, мы просим всех на максимально придерживаться стандартов кодирования.
### Фигурные скобки
Используйте, пожалуйста, [BSD/Allman стиль](http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%81%D1%82%D1%83%D0%BF_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.A1.D1.82.D0.B8.D0.BB.D1.8C_.D0.9E.D0.BB.D0.BC.D0.B0.D0.BD.D0.B0) расстановки фигурных скобок.
### Соглашение в именовании классов
В Kohana используется нижнее_подчёркивание в именовании классов. Именование с использованием camelCase не приветствуется.
#### Классы
// Корневые библиотеки используют суффикс _Core
class Beer_Core {
// При расширение функционала библиотеки суффикс не используется
class Beer extends Beer_Core
// Класс контроллера использует суффикс _Controller
class Apple_Controller extends Controller {
// Класс модели использует суффикс _Model
class Cheese_Model extends Model {
// Класс хелпера
class peanut {
Если Вы не передаёте параметры в конструктор при создании класса, не используйте круглые скобки при его объявлении:
// Правильно:
$db = new Database;
// Не правильно:
$db = new Database();
#### Функции и методы
Имена функций должны быть в нижнем регистре и использовать нижнее_подчёркивание для разделения слов:
function drink_beverage($beverage)
{
#### Переменные
Все переменные должны быть в нижнем регистре и использовать нижнее_подчёркивание для разделения слов (camelCase использовать запрещено):
// Правильно:
$foo = 'bar';
$long_example = 'uses underscores';
// Не правильно:
$weDontWantThis = 'understood?';
### Отступы
Используйте табуляцию для отступов в Вашем коде. Использование пробелов вместо табуляции строго запрещено.
Вертикальные отступы (при многострочном выравнивании) формируются пробелами. Так как ширина табуляции может отличаться у разных людей, для вертикального выравнивания табуляция является не самым лучшем способом.
$text = 'это разделённый на несколько строк длинный текст. Зачастую, '
. 'при многострочном разделении используют ограничение в 80 знаков '
. 'на строку. Для удобочитаемости кода крайне важно применять правильное '
. 'вертикальное выравнивание текста. Помните, что любые отступы '
. 'должны выполняться в виде табуляции, а вертикальное выравнивание уже '
. 'должно завершаться пробелами, которые идут сразу после табов .';
### Конкатенация строк
Не используйте пробелы вокруг оператора конкатенации:
// Правильно:
$str = 'one'.$var.'two';
// Не правильно:
$str = 'one'. $var .'two';
$str = 'one' . $var . 'two';
### Однострочные операторы
Однострочные операторы IF могут быть использованы лишь в случае прерывания выполнения кода (например, return или continue):
// Допустимо:
if ($foo == $bar)
return $foo;
if ($foo == $bar)
continue;
if ($foo == $bar)
break;
if ($foo == $bar)
throw new Exception('You screwed up!');
// Не допустимо:
if ($baz == $bun)
$baz = $bar + 2;
### Операторы сравнения
Используйте, пожалуйста, для сравнения операторы OR и AND:
// Правильно:
if (($foo AND $bar) OR ($b AND $c))
// Не правильно:
if (($foo && $bar) || ($b && $c))
Используйте, пожалуйста, elseif вместо else if:
// Правильно:
elseif ($bar)
// Не правильно:
else if($bar)
### Конструкции switch
Каждый оператор case, break и default должны располагаться на новой строке. Блок внутри case и default должны иметь отступ в 1 таб.
switch ($var)
{
case 'bar':
case 'foo':
echo 'hello';
break;
case 1:
echo 'one';
break;
default:
echo 'bye';
break;
}
### Круглые скобки
Необходимо отделять имя оператора и следующие за ним скобки пробелом. Оператор ! (оператор отрицания, восклицательный знак) для удобочитаемости должен быть выделен пробелом с обеих сторон.
// Правильно:
if ($foo == $bar)
if ( ! $foo)
// Не правильно:
if($foo == $bar)
if(!$foo)
if ((int) $foo)
if ( $foo == $bar )
if (! $foo)
### Тернарные операторы
Все тернарные операции должны придерживаться стандартного формата. Используйте круглые скобки только для выделения условий, а не для выделения простых переменных.
$foo = ($bar == $foo) ? $foo : $bar;
$foo = $bar ? $foo : $bar;
Все сравнения и операции должны быть заключены в круглые скобки:
$foo = ($bar > 5) ? ($bar + $foo) : strlen($bar);
При многострочном разделении тернарного комплекса (при очень длинных условиях, превышающих длину в 80 знаков), для вертикального выравнивания стоит использовать пробелы. Операторы при этом должны располагаться один под другим:
$foo = ($bar == $foo)
? $foo
: $bar;
### Приведение типов
При приведении типов, следует использовать пробелы вокруг оператора приведения:
// Правильно:
$foo = (string) $bar;
if ( (string) $bar)
// Не правильно:
$foo = (string)$bar;
По возможности, используйте приведение типов вместо тернарных операторов:
// Правильно:
$foo = (bool) $bar;
// Не правильно:
$foo = ($bar == TRUE) ? TRUE : FALSE;
При приведение к числовому или булеву типам, используйте сокращённый формат:
// Правильно:
$foo = (int) $bar;
$foo = (bool) $bar;
// Не правильно:
$foo = (integer) $bar;
$foo = (boolean) $bar;
### Константы
Имена констант должны быть строго в верхнем регистре:
// Правильно:
define('MY_CONSTANT', 'my_value');
$a = TRUE;
$b = NULL;
// Не правильно:
define('MyConstant', 'my_value');
$a = True;
$b = null;
При сравнении располагайте константы в конце:
// Правильно:
if ($foo !== FALSE)
// Не правильно:
if (FALSE !== $foo)
Такой выбор немного спорный, но можно его объяснить следующим. Если вербализировать предыдущие условия и написать их, то можно их прочитать следующим образом для верного примера:
если переменная $foo в точности не является FALSE
И для неверного:
если FALSE в точности не является переменной $foo
Так как наш язык предусматривает чтение слева направо, то и нет причин для того, чтобы ставить константу первой при сравнении.
### Комментарии
#### Однострочные комментарии
Используйте // перед строкой комментария, делайте отступ и начинайте комментарий с заглавной буквы. Никогда не используйте для комментариев #.
// Правильно
//Не правильно
// не правильно
# Не правильно
### Регулярные выражения
При использовании регулярных выражений, используйте синтаксис PCRE вместо POSIX. PCRE признан более мощной и быстрой библиотекой регулярных выражений.
// Правильно:
if (preg_match('/abc/i'), $str)
// Не правильно:
if (eregi('abc', $str))
Используйте одинарные кавычки вокруг регулярного выражения. Одинарные кавычки удобочитаемы ввиду их простоты. Строки, заключённые в одинарные кавычки, в отличие от двойных кавычек, не поддерживают интерполяцию переменных и конструкции с обратным слешем (\n, \t и т.д.).
// Правильно:
preg_match('/abc/', $str);
// Не правильно:
preg_match("/abc/", $str);
При использовании регулярного выражения для поиска и замены, используйте $n нотацию для ссылок. Это более предпочтительно, нежели \\n.
// Правильно:
preg_replace('/(\d+) dollar/', '$1 euro', $str);
// Не правильно:
preg_replace('/(\d+) dollar/', '\\1 euro', $str);
И в заключении, обратите внимание, что символ $ для определения позиции в конце строки не учитывает наличие символа новой строки. Используйте при необходимости модификатор D, чтобы этого избежать. [Подробная информация](http://blog.php-security.org/archives/76-Holes-in-most-preg_match-filters.html).
$str = "email@example.com\n";
preg_match('/^.+@.+$/', $str); // TRUE
preg_match('/^.+@.+$/D', $str); // FALSE