Написание документации к коду — задача не самая приятная и радостная, но если вы делаете большой проект и/или участвуете в командной разработке, то, я бы сказал, это вещь просто даже необходимая. Если у вас много разных интерфейсов, классов, функций, методов, с различными парметрами и выходными данными, и с этим приходится работать более чем одному разработчику, очень здорово иметь под рукой описание всех этих самых классов, их атрибутов и параметров, а не бегать каждый раз к разработчику и спрашивать какой параметр что значит. Это ни в коем случае не отменяет того, что сами названия классов, методов и параметров должны иметь осмысленные имена, но не об этом сейчас речь. Сейчас мы поговорим о документировании исходных кодов на php. Я для этих целей использую такой инструмент как Doxygen.
Что такое Doxygen?
Для тех, кто не в курсе что это такое, краткая справка. Как написано на сайте проекта:
Doxygen — это кроссплатформенная система документирования исходных текстов, которая поддерживает C/C++, Objective-C, Python, Java, IDL, PHP, C#, Fortran, VHDL и, частично, D.
Сайт проекта: http://www.stack.nl/~dimitri/doxygen/
Данная утилитка есть под все основные платформы: Windows/Linux/MacOS; а некоторые энтузиасты даже портировали ее под Solaris/OS/2/IRIX/FreeBSD. Так же на сайте имеется прекрасная документация как в pdf-формате, так и в chm-формате. Очень рекомендую с ней ознакомиться.
Документирование php-кода.
Не буду описывать процесс установки doxygen на комп, потому как это простая процедура, не отличающаяся от установки любого другого приложения.
Для комментирования кода можно использовать несколько стилей, среди которых есть Javadoc, C-style комментарии или же Qt-style комментарии. Я для себя выбрал формат Javadoc по той причине, что он, можно сказать, совместим с форматом phpdoc, и, следовательно, если вы пишите код не в блокноте, а в какой-нибудь среде разработки, которая автоматически понимает phpdoc комментарии, это дает вам сразу возможность видеть подсказки в коде, автоматически подсказывать типы и значения параметров функций и прочие радости жизни. Это проверено в Eclipse IDE (PDT) и Netbeans, но подозреваю, что и в других продвинутых средах разработки это тоже будет работать. Далее будут скриншоты того как это выглядит в Eclipse. А пока приведу пример документирования php-кода:
cr = curl_init();
$this->url = $url;
$this->data = $data;
$this->err = false;
curl_setopt($this->cr, CURLOPT_URL, $url);
if($submit_type == "POST")
curl_setopt($this->cr, CURLOPT_POST, 1 );
if($data)
curl_setopt($this->cr, CURLOPT_POSTFIELDS, $data);
curl_setopt($this->cr, CURLOPT_RETURNTRANSFER, 1);
}
/**
* Выполнение запроса на сервере
*/
function exec_query()
{
$this->result = curl_exec($this->cr);
if (curl_errno($this->cr))
$this->err = curl_error($this->cr);
curl_close($this->cr);
}
/**
* Получение результата запроса
* @return Результат запроса
*/
function get_answer()
{
return $this->result;
}
/**
* Проверка на ошибку
* @return false или описание ошибки
*/
function check_error()
{
return $this->err;
}
}
?>
Если описать класс таким образом, то, например, в Eclipse в любом месте проекта, где вы захотите получить подсказку по методам,свойствам класса, вы увидите примерно следующее:
По моему, это замечательно: сразу видно что делает этот метод, какие параметры он принимает на вход и какого они типа. Ко всему прочему во вьюхе «outline» все функции показываются с типами параметров, что тоже очень приятно.
Если у вас есть абстрактные классы, от которых наследуются реальные, то нет необходимости описывать каждый метод в каждом классе, достаточно описать метод в абстрактном классе, а в наследуемых сделать ссылки и все будет прекрасно работать, причем Эклипс практически сам генерит нужный комментарий, так что не переживайте, что вам придется их писать самим.
query = "CALL Process_User_Login ('".$login."', '".$password."', '".$session_id."', ".$module_id.", '".$client_ip."');";
$this->make_query();
}
/**
* Обработка выхода пользователя из системы
* @see includes/classes/CDb_Abstract#get_query_Process_User_Logout($user_id)
*/
public function get_query_Process_User_Logout($user_id)
{
$this->query = "CALL Process_User_Logout (" . $user_id . ");";
$this->make_query();
}
...
}
?>
Дополнительные плюшки.
Так же doxygen обладает еще рядом возможностей, среди которых есть генерация графа связи классов. Что в общем и целом очень полезная фича. Причем он показывает граф как «сверху-вниз», то есть для базового класса будут показаны все наследуемые, так и «снизу-вверх», то есть для класса будут показаны все предки. Выглядит это так:
Ну и напоследок, скрины того, как выглядит сгенерированная документация в формате html.
/* Там слева вверху был логотип 🙂 */





