Разработка:Стандарт кодирования — различия между версиями
Alex (обсуждение | вклад) |
Alex (обсуждение | вклад) |
||
Строка 38: | Строка 38: | ||
# Объявление класса должно быть отделено от остального коду двумя пустыми строками. | # Объявление класса должно быть отделено от остального коду двумя пустыми строками. | ||
# Свойства класса должны объявляться напрямую при объявлении класса с указанием модификатора доступа (private (доступ извне запрещен), protected (разрешен доступ из наследников) или public) | # Свойства класса должны объявляться напрямую при объявлении класса с указанием модификатора доступа (private (доступ извне запрещен), protected (разрешен доступ из наследников) или public) | ||
+ | ==== Функции и методы ==== | ||
+ | # Объявление функций и методов должно сопровождаться комментарием по стандарту PHPDocumentor | ||
+ | # Все объявления методов должны содержать модификатор доступа (private (доступ извне запрещен), protected (разрешен доступ из наследников) или public) | ||
+ | # Фигурная скобка должна располагаться на следующей строке после объявления имени функции или метода на одном с ним уровнем. | ||
+ | # Тело функции должно быть сдвинуто на 4 пробела влево. | ||
+ | # Между именем функции и круглой скобкой не должно быть пробела. | ||
+ | # Если функция не возвращает значений, то true обозначает успех, false - не успех. Если функция возвращает массив, в случае успешного выполнения, но отсутствия элементов в результате, функция должна возвращать пустой массив. | ||
+ | ==== Управляющие конструкции ==== | ||
+ | Ставьте один пробел между скобками и синтаксическими конструкциями. Это не относится к функциям и их параметрам. Пример: | ||
+ | <code php> | ||
+ | if ( $a >= max($key) ) | ||
+ | { | ||
+ | |||
+ | ···· $c = $a; | ||
+ | |||
+ | } | ||
+ | </code> | ||
− | ==== Комментарии ==== | + | Блоки всегда ограничиваются фигурными скобками. При этом используется [http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B8%D0%BB%D1%8C_%D0%BE%D1%82%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%B2#.D0.A1.D1.82.D0.B8.D0.BB.D1.8C_.D0.9E.D0.BB.D0.BC.D0.B0.D0.BD.D0.B0 стиль Олмана]: |
+ | <code php> | ||
+ | if (<cond>) | ||
+ | { | ||
+ | ····<body> | ||
+ | } | ||
+ | </code> | ||
+ | ==== Комментарии и документация ==== | ||
# Комментарии должны быть подробными и содержательными. Объяснять каждое объявление классов, функций и переменных. Каждый цикл и каждая ветвь условия должны быть пояснены содержательным смыслом выполняемых действий, например: "перебираем список товаров", "если пользователь не заполнил поле имя..." | # Комментарии должны быть подробными и содержательными. Объяснять каждое объявление классов, функций и переменных. Каждый цикл и каждая ветвь условия должны быть пояснены содержательным смыслом выполняемых действий, например: "перебираем список товаров", "если пользователь не заполнил поле имя..." | ||
# Комментарии к функциям и классам оформляются в формате [http://manual.phpdoc.org/HTMLframesConverter/default/ PHPDoc] | # Комментарии к функциям и классам оформляются в формате [http://manual.phpdoc.org/HTMLframesConverter/default/ PHPDoc] | ||
# Комментарии в строках должны быть в стиле '''//'''. Они должны быть понятными и располагаться над строкой комментируемого кода. | # Комментарии в строках должны быть в стиле '''//'''. Они должны быть понятными и располагаться над строкой комментируемого кода. | ||
+ | # Файлы, содержащие PHP-код должны начинаться с комментария, предусмотренного лицензией GNU GPL. | ||
==== Дата и время ==== | ==== Дата и время ==== | ||
#Все даты и время в базе данных хранятся в [http://ru.wikipedia.org/wiki/Unix_timestamp Unix Timestamp] по [http://ru.wikipedia.org/wiki/UTC UTC] без учета летнего времени и пересчитываются в местное время при отображении. | #Все даты и время в базе данных хранятся в [http://ru.wikipedia.org/wiki/Unix_timestamp Unix Timestamp] по [http://ru.wikipedia.org/wiki/UTC UTC] без учета летнего времени и пересчитываются в местное время при отображении. | ||
# Если определена только дата, то время устанавливается 12:00 по полудню на UTC. | # Если определена только дата, то время устанавливается 12:00 по полудню на UTC. | ||
+ | |||
+ | ==== Исключения ==== | ||
+ | # Рекомендуется использование исключений для сообщения об ошибках. | ||
+ | # Любые необработанные исключения должны заканчиваться вызовом $DOF->print_error() для вывода сообщения об ошибке. | ||
+ | # Не используйте исключения для обработки штатных ситуаций, только в ошибочных и аварийных ситуаций. | ||
+ | # Для вывода исключений можно использовать следующие классы: | ||
+ | ## dof_exception - базовый класс исключения | ||
+ | ## dof_exception_coding - ошибка разработчика | ||
+ | ## dof_exception_db - ошибка обращения к СУБД | ||
+ | ## dof_exception_file - ошибка работы с файлами | ||
+ | |||
+ | ==== Прочее ==== | ||
+ | # При копировании объектов используйте PHP5-функцию копирования объектов. В MOODLE есть функция clone(), которая совместима и с PHP4 тоже. | ||
+ | # Если вы копируете переменную, которая может содержать объект, то используйте функцию MOODLE fullclone(). | ||
+ | # Все переменные перед первым использованием необходимо инициализировать. | ||
+ | # Имя модуля может включать только строчные латинские буквы и содержать не более 20 символов. | ||
+ | # Следует избегать использования глобальных переменных. | ||
+ | # Обращения к объектом Free Dean's Office выполняется через объект [[Разработка:lib/dof.php|$DOF]]. При объявлении плагина он должен сохранить ссылка на объект $DOF в собственном свойстве dof и во всех собственных методов использовать для обращения '''$this->dof''' | ||
+ | # Не должно быть никакого SQL-кода за пределом справочников ([[Разработка:Структура#Справочники|плагинов storage]]) | ||
+ | # Кроме [[Разработка:Структура#Интерфейс пользователя|плагинов im]] никакие другие плагины не должны принимать запросы по http. Исключение могут составлять плагины [[Разработка:Структура#Синхронизации|sync]], которые могут принимать входящие soap-запросы и т.п. (но и они не должны реализовывать веб-интерфейс). При этом все плагины должны быть безопасны на случай, если злоумышленик попытается обратиться по прямой ссылке к одному из их файлов (следует предотвращать запуск файла по прямой ссылке, если это может нанести урон безопасности). | ||
+ | |||
+ | ==== Исключения из правил ==== | ||
+ | # При использовании сторонних библиотек возможно отступление от пунктов 4, 5, 6. (см. пример). Это связано с экономией времени на переработку оформления библиотеки и сохранением стиля сопутствующего кода. Пример: class SomeCustomClass {function classMethod(){...}} | ||
+ | |||
=== Структура базы данных === | === Структура базы данных === | ||
− | + | # Имена колонок БД, содержащих ключ по другой колонке в БД Free Dean's Office должны заканчиваться на id | |
+ | # Имена колонок в БД, содержащих ключ объекта в собственной БД Moodle должны начинаться на mdl_ (но не должны заканчиваться на id) | ||
=== Безопасность === | === Безопасность === | ||
Строка 56: | Строка 106: | ||
=== Другие правила === | === Другие правила === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Версия 21:17, 4 мая 2009
Содержание
Правила оформления кода в проекте «Электронный деканат».
Стиль кодирования
Формат файлов
- Все файлы с кодом должны иметь расширение .php
- Все html-шаблоны должны иметь расширение .html
- Весь текст, включая исходный код, должен быть в кодировке utf-8 с оконачаниями строк в формет Unix
- Окончания строк в формате Unix (LF - 0x0A)
- Все php-теги должны быть полными <?php ... ?>. Краткие теки <? ?> не допускаются
- Все отступы – 4 пробела. Не использовать TAB.
- Длинна строки в коде не должна быть больше 80 символов. В некоторых случаях допускается 120, если это упростит читаемость кода.
- Пробелы можно использовать свободно. Не надо бояться растягивать код для улучшения читабельности.
Имена
- Имена файлов должны состоять только из латинских символов, знака подчеркивания и точки. Имя файла обязательно должно иметь расширение. Рекомендуется использовать для именования файлов слова на английском языке.
- Имена классов должны состоять из строчных латинских символов и знака подчеркивания. Рекомендуется использовать английские слова разделенных символом подчеркивания. Имя класса в плагине должно начинаться с префикса, соответствующего плагину. Если требуется, имя класса может включать преффикс и суффикс.
- Имена функций и методов должны состоять из строчных латинских символов и знака подчеркивания. Имя функции в плагине должно начинаться с префикса, соответствующего имени модуля (dof_) и плагину, в котором объявлена (типплагина_кодплагина). Затем идет часть имени, описывающая выполняемое действие. Последняя часть - это существительное, обозначающее сущность, над которой это действие производится либо набор сущностей. Не должно быть пробелов между именем функции и скобками. Это относится и к объявлению функции, и к ее использованию. Параметры всегда должны иметь разумные значения по умолчанию, если это возможно. Пример: modname_get_string($identifier, $pluginname = NULL). Между ключевым словом function и именем функции должен быть только один пробел.
- Имена параметров функций именуются по тем же правилам, что и переменные. Имя параметра должно быть кратким и информативным для сторонних программистов. Если параметр может быть не задан, используйте по умолчанию значение null, для отличия этой ситуации от передачи параметра false, 0 или если это требуется).
- Имена переменных - всегда легкие для чтения осмысленные слова английского языка, набранные в нижнем регистре. Несколько слов пишутся слитно. Но они должны быть как можно короче. Используйте имена во множественном числе для массивов объектов. Например: $courseid, $studentsgrades
- Имена глобальных переменных, должны состоять полностью из заглавных букв. Пример: $CFG
- Имена констант должны состоять из латинских символов в верхнем регистре и знака подчеркивания. Всегда начинаются с имени модуля (DOF). Если константа объявлена в плагине, она получает дополнительный префикс ТИППЛАГИНА_КОДПЛАГИНА. Слова в названии разделены символом подчеркивания. Пример: SITE_ID
- true, false и null должны быть набраны в нижнем регистре
- AND, OR, XOR должны быть набраны в верхнем регистре, не используйте сокращенные синонимы.
Строки
- Используйте одинарные кавычки, если в строке отсутствуют макроподстановки и эскейп-последовательности, а так же если в строке присутствует много двойных кавычек.
- При макроподстановках в двойных кавычках заключайте переменные в фигурные скобки.
- Объединение строк выполняется через оператор "точка" (.)
Массивы
- Не используйте отрицательных чисел для нумерации массивов (кроме случаев, когда это прямо требуется логикой программы).
- Индексация массива может начинаться с любого положительного числа, обычно с 0.
- При объявлении массива через функцию array() ставьте пробел после запятой при перечислении параметров. Длинные объявления можно переносить по строкам. При объявлении ассоциативных массивов помещайте на одну строку одну пару ключ-значение.
Классы
- Свойства класса должны объявляться до его методов.
- Фигурная скобка пишется на следующей строчке после объявления имени класса, на одном уровне с ключевым словом class.
- Объявление любого класса должно быть документировано по стандарту PHPDocumentor
- Весь код внутри класса должен быть сдвинут на 4 пробела от уровня его объявления.
- Объявление класса должно быть отделено от остального коду двумя пустыми строками.
- Свойства класса должны объявляться напрямую при объявлении класса с указанием модификатора доступа (private (доступ извне запрещен), protected (разрешен доступ из наследников) или public)
Функции и методы
- Объявление функций и методов должно сопровождаться комментарием по стандарту PHPDocumentor
- Все объявления методов должны содержать модификатор доступа (private (доступ извне запрещен), protected (разрешен доступ из наследников) или public)
- Фигурная скобка должна располагаться на следующей строке после объявления имени функции или метода на одном с ним уровнем.
- Тело функции должно быть сдвинуто на 4 пробела влево.
- Между именем функции и круглой скобкой не должно быть пробела.
- Если функция не возвращает значений, то true обозначает успех, false - не успех. Если функция возвращает массив, в случае успешного выполнения, но отсутствия элементов в результате, функция должна возвращать пустой массив.
Управляющие конструкции
Ставьте один пробел между скобками и синтаксическими конструкциями. Это не относится к функциям и их параметрам. Пример:
if ( $a >= max($key) ) { ···· $c = $a; }
Блоки всегда ограничиваются фигурными скобками. При этом используется стиль Олмана:
if (<cond>) { ····<body> }
Комментарии и документация
- Комментарии должны быть подробными и содержательными. Объяснять каждое объявление классов, функций и переменных. Каждый цикл и каждая ветвь условия должны быть пояснены содержательным смыслом выполняемых действий, например: "перебираем список товаров", "если пользователь не заполнил поле имя..."
- Комментарии к функциям и классам оформляются в формате PHPDoc
- Комментарии в строках должны быть в стиле //. Они должны быть понятными и располагаться над строкой комментируемого кода.
- Файлы, содержащие PHP-код должны начинаться с комментария, предусмотренного лицензией GNU GPL.
Дата и время
- Все даты и время в базе данных хранятся в Unix Timestamp по UTC без учета летнего времени и пересчитываются в местное время при отображении.
- Если определена только дата, то время устанавливается 12:00 по полудню на UTC.
Исключения
- Рекомендуется использование исключений для сообщения об ошибках.
- Любые необработанные исключения должны заканчиваться вызовом $DOF->print_error() для вывода сообщения об ошибке.
- Не используйте исключения для обработки штатных ситуаций, только в ошибочных и аварийных ситуаций.
- Для вывода исключений можно использовать следующие классы:
- dof_exception - базовый класс исключения
- dof_exception_coding - ошибка разработчика
- dof_exception_db - ошибка обращения к СУБД
- dof_exception_file - ошибка работы с файлами
Прочее
- При копировании объектов используйте PHP5-функцию копирования объектов. В MOODLE есть функция clone(), которая совместима и с PHP4 тоже.
- Если вы копируете переменную, которая может содержать объект, то используйте функцию MOODLE fullclone().
- Все переменные перед первым использованием необходимо инициализировать.
- Имя модуля может включать только строчные латинские буквы и содержать не более 20 символов.
- Следует избегать использования глобальных переменных.
- Обращения к объектом Free Dean's Office выполняется через объект $DOF. При объявлении плагина он должен сохранить ссылка на объект $DOF в собственном свойстве dof и во всех собственных методов использовать для обращения $this->dof
- Не должно быть никакого SQL-кода за пределом справочников (плагинов storage)
- Кроме плагинов im никакие другие плагины не должны принимать запросы по http. Исключение могут составлять плагины sync, которые могут принимать входящие soap-запросы и т.п. (но и они не должны реализовывать веб-интерфейс). При этом все плагины должны быть безопасны на случай, если злоумышленик попытается обратиться по прямой ссылке к одному из их файлов (следует предотвращать запуск файла по прямой ссылке, если это может нанести урон безопасности).
Исключения из правил
- При использовании сторонних библиотек возможно отступление от пунктов 4, 5, 6. (см. пример). Это связано с экономией времени на переработку оформления библиотеки и сохранением стиля сопутствующего кода. Пример: class SomeCustomClass {function classMethod(){...}}
Структура базы данных
- Имена колонок БД, содержащих ключ по другой колонке в БД Free Dean's Office должны заканчиваться на id
- Имена колонок в БД, содержащих ключ объекта в собственной БД Moodle должны начинаться на mdl_ (но не должны заканчиваться на id)
Безопасность
Использование JavaScript
Работа с библиотеками Moodle
Другие правила
Работа со стандартными библиотеками moodle
Этот раздел будет содержать справку по работе со стандартными пакетами moodle