====== Стандарты кодирования ====== ===== Общее редактирование кода ===== * используйте **только пробелы** для идентации кода вместо табуляторов, во всех современных редакторах есть функция замены табуляторов пробелами(скажем, в JEdit эта опция называется soft tabs) * один табулятор равен 2(двум) пробелам(к примеру, в JEdit, Tab width = 2, Indent Width = 2) ===== Языковые конструкции ===== ==== Операторы ==== * все операторы(кроме инкрементных) разделяются одиночным пробелом:\\ **$a = 1**, но не $a=1; однако $i++ * после управляющей конструкции(if, for, etc) не следует использовать пробелы перед скобкой и внутри скобок:\\ **if($a == 1)**, но не if ( $a == 1 ) * если после управляющих конструкций следует однострочная операция, {} можно не использовать ==== Идентация, новые строка и проч. ==== * изначально код имеет нулевое смещение относительно левого края * {...} используются с новой строки без исключения * код в блоках внутри {...} имеет идентацию на один уровень вправо относительно {} * старайтесь группировать несколько схожих операций в безинтервальные блоки * логически сгруппированные блоки отделяются символом новой строки ==== Функции, переменные, классы, методы и проч. ==== === Названия === * для названий классов следует использовать формат MyClassName:\\ **class MyClassName{}**, но не my_class_name * для названий функций/методов следует использовать формат methodName:\\ **function methodName(){}** * переменные/аттрибуты могут иметь название **$varName** либо **$var_name**, и хотя это не принципиально, мы все же склоняемся к использованию $var_name === Уровни доступа(public/protected/private) === Т.к Limb3 изначально разрабатывался для PHP4, после перехода на PHP5 не вся кодовая база использует правильные уровни доступа, однако эта ситуация будет постепенно исправлена в последующих релизах. Небольшие рекомендации насчет использования уровней доступа: * ключевое слово public обычно опускается для методов, т.к оно нам кажется излишним * уровень доступа private не используется вообще, т.к может усложнять тестирование в определенных случаях, рекомендуется использовать уровень доступа protected * закрытые(protected) методы обычно отмечаются начальным символом "_":\\ **protected function _doThisPrivately(){}**. Не все методы, имеющие такое название, имеют уровень доступа protected на данный момент, постепенно это будет исправлено * всем аттрибутам рекомендуется ставить уровень доступа protected * на данный момент все аттрибуты не имеют уровня доступа вообще(используется var), однако в дальнейшем будет использован уровень доступа protected * уровень доступа final рекомендуется использовать только в крайних случаях, когда в этом есть уверенность на **10000%**(final может представлять трудности во время тестирования). === TypeHints === На данный момент не рекомендуется пользоваться typehints вообще, т.к мок объекты SimpleTest 1.x конфликтуют с ними. Однако с выходом SimpleTest2 данная ситуация будет исправлена и использование typehints будет приветствоваться. ==== Включения PHP исходных файлов ==== * константы, которые используются для физического указания расположения библиотек обычно имеют окончание **_DIR**:\\ define('APP_DIR', '/some/path/'); * обычно мы используем include* внутри функций, а require* в глобальном namespace ==== Комментарии ==== * комментарии мы почти пока не делаем, ибо хороший код обычно говорит сам за себя и к тому же есть тесты(в будущем однако возможно появятся небольшие комментарии для phpDocumentor) * комментарии обычно уместны в тех местах кода, который пока еще не подвергался рефакторингу и поэтому его "читабельность" затруднена * также комментарии бывают исключительно полезны в тестах, где с их помощью можно сделать акцент на тонкости тестирования: ==== Лицензия ==== * лицензионная "шапка" для кода(обычно в редакторе можно настроить систему шаблонов и вызывать шаблоны один кликом): /********************************************************************************** * Copyright 2004 BIT, Ltd. http://limb-project.com, mailto: support@limb-project.com * * Released under the LGPL license (http://www.gnu.org/copyleft/lesser.html) *********************************************************************************** * * $Id$ * ***********************************************************************************/ ===== Пример кода ===== /********************************************************************************** * Copyright 2004 BIT, Ltd. http://limb-project.com, mailto: support@limb-project.com * * Released under the LGPL license (http://www.gnu.org/copyleft/lesser.html) *********************************************************************************** * * $Id$ * ***********************************************************************************/ require_once(SOME_DIR . '/Foo.class.php'); //класс class FooClass { //аттрибуты protected $foo_name; protected $request; //конструктор function FooClass($request) { $this->request = $request; $this->foo_name = 'Foo'; } protected function _createBar() { iclude_once(SOME_DIR . '/Bar.class.php'); return new Bar(); } //метод function doIt() { if($this->foo_name == 'Bar') { $res = globalDoIt(); echo $res; } //для простых управляющих конструкций {} можно опускать if($this->foo_name == 'Test') return; //логически сгруппированный блок кода $db = getDbConnection(); $it = $db->exec('select * from a'); foreach($it as $record) echo $record->get('id'); $i++; } } //функция function globalDoIt() { $some_var = 1; return 1; } ===== Расположение кода в файловой системе ===== * **один класс = один файл**, тоже самое относится к интерфейсам * все файлы с классами имеют case sensitive название: **ClassName.class.php**, где ClassName название класса, а расширение **.class.php** указывает на то, что это класс * тоже самое относится к интерфейсам, с небольшими изменениями: **Doable.interface.php**, где Doable название интерфейса, а расширение **.interface.php** указывает на то, что это интерфейс * подключаемый модуль имеет расширение **.inc.php** * исполняемый скрипт обычно имеет расширение **.php**(здесь есть некоторые исключения из правила, скажем, setup.php, который не является самостоятельным исполняющимся скриптом) * тесты для одного класса обычно имеют такое же название, что и сам класс + окончание **Test**, т.е **MyClassTest** * тесты обычно имеют паралельную структуру с основным кодом, т.е /src/util/lmbComplexArray.class.php => /cases/util/ComplexArrayTest.class.php