|
|
|
| Часто программные проекты имеют множество вложенных директорий, тем не менее для оценки сложности проекта удобно знать число строк во всё программном проекте.
Представляем вашему вниманию скрипт, осуществляющий рекурсивный спуск по поддиректориям проекта и подсчитывающий число строк в файлах с заданным расширением.
Вероятно многим будет интересно узнать, что типичные Web-приложения и сайты, разрабатываемые Web-студией SoftTime включают от 2 000 до 15 000 строк кода. Сам проект SoftTime содержит 50 000 строк кода.
http://www.softtime.ru/scripts/numlines.php | |
|
|
|
|
|
|
|
для: cheops
(22.07.2005 в 17:21)
| | Хм...Можно писать все в одну строку...
Я думаю может как то подсчитывать не строки, а символ (;) | |
|
|
|
|
|
|
|
для: Akira
(22.07.2005 в 18:51)
| | Можно, но правила хорошего тона это не рекомендуют в том числе, и по тому, что скрывается сложность проекта... | |
|
|
|
|
|
|
|
для: cheops
(22.07.2005 в 17:21)
| | Не понятно только зачем нужна $ext = strrchr($dirname."/".$file, "."); , ведь можно регулярное выражение подредактировать:
заменить
$extentions = array("#\.php#i");
на
$extentions = array("#\.php$#i"); | |
|
|
|
|
|
|
|
для: isset
(22.07.2005 в 19:03)
| | Согласен. | |
|
|
|
|
|
|
|
для: cheops
(22.07.2005 в 19:18)
| | Хм.. а как насчет пустых строк и комментариев?..
У меня, например, могут быть функции, треть кода которых сотавляет комметарий к ним.. | |
|
|
|
|
|
|
|
для: to4karu
(23.07.2005 в 10:44)
| | Они тоже учитываются - это мировая практика - комментарии вообще считают неотъемлемой частью проекта и считают их наряду с обычными операторами - их же тоже нужно редактировать и поддерживать при изменении кода. Кроме того, комментариями снабжают сложные моменты коды, т.е. сообщается, что этот участок имеет более высокую концентрацию сложности - поэтому для идеально-написанного проекта - число строк будет объективно отражать его сложность. | |
|
|
|
|
|
|
|
для: cheops
(23.07.2005 в 10:56)
| | Строки состоящие только из фигурных скобок тоже учитываются? | |
|
|
|
|
|
|
|
для: idborn
(23.07.2005 в 15:41)
| | Да, скрипт считает просто строки в файле. Если в конце файла будет 200 пустых строк - он их тоже посчитает. | |
|
|
|
|
|
|
|
для: cheops
(23.07.2005 в 18:50)
| | Я тут подумал :) Может немного изменить ваш код? Выше темой я уже для обхода переписал. | |
|
|
|
|
|
|
|
для: Akira
(29.07.2005 в 14:03)
| | Код менять можно и нужно :))), в разделе "Примеры PHP" лежат затравки и идеи, главным образом для того, чтобы на них было удобно ссылаться при обсуждении, а не помещать каждый раз здоровый листинг в тему, а потом каждый раз выгружать его. | |
|
|
|
|
|
|
|
для: cheops
(29.07.2005 в 14:09)
| | Я тут просто замучался свои проекты называть :) Забываю, сколько всего изменял :) По этому поводу есть идея.
У нас есть проект. Вот он работает. Запускаем скрипт подсчета. Он нам выдает опр. кол-во строк. Допустим 2500.
2500 - это версия 0.0
Мы наизменяли, запускаем опять, если строк на 500 больше/меньше к номеру версии +0.1 т.е.
Версия продукта 0.1.
Как мысль? | |
|
|
|
|
|
|
|
для: Akira
(29.07.2005 в 14:26)
| | А смысл ? Тада по номеру можно будет определить скоко строк добавили, а удалили скоко ?:)) Да и вообще не с кол-ве строк дело.
Честно говоря, я не особо вижу смысл считать кол-во строк проекта, мой редактор их и так считает неплохо. Другое дело - действительно символы или токены (фразы). У меня частельно строчка из одного тэга состоит, а другая из целой кучи.
С точки зрения ценности информации кол-во строк гораздо менее цено, нежели кол-во строк.
Мне нравится вот такой способ формирования атомов номера проекта.
Например - x.0g - гамма (не факт, что все работает и все протестино).
x.а- альфа - сами знаете
x.х - поправки + доп. изменения/функции
x.х.х - изменения, касаемые ошибок
x.х.х.х - изменения, касаемые безопасности работы приложения. | |
|
|
|
|
|
|
|
для: Duran
(29.07.2005 в 14:54)
| | Если внесли изменение в 500 строк по проекту. То это уже сущ. изменение. а если не 500 а 3000? Вот и версия взлетает в 6 раз.
Хорошо когда один. А если нет? Так хоть будет ясно как работа движеться.
Поставил крон. И раз в сутки проверка. | |
|
|
|
|
|
|
|
для: Duran
(29.07.2005 в 14:54)
| | >С точки зрения ценности информации кол-во строк гораздо
>менее цено, нежели кол-во строк.
>
моя система:
имя 0.x - в стадии разработки
имя 1 - рабочая версия
имя 1.х - незначительное добавления/исправлена ошибка и т.п.
имя 2 - существенное добавление (новая функция, смена дизайна и т.д.) | |
|
|
|
|
|
|
|
для: P@Sol
(29.07.2005 в 14:59)
| | У меня нет времени этим занематься :) Мен программинг поглашает полностью. Я не могу уследить, что именно я сотворил. | |
|
|
|
|
|
|
|
для: Akira
(29.07.2005 в 15:11)
| | для этого у меня есть две папки на сервере и на локльном компе....программирую на сервере...сотворил что то стоящее записал на локальный комп в соответствующую папку...потом бац новую функцию добавил -> на локальный комп в след. папку.. | |
|
|
|
|
|
|
|
для: P@Sol
(29.07.2005 в 15:30)
| | Все сложно и отвлекает от работы :) Я творческий человек, работаю на вдохновление (аналог пиво) | |
|
|
|
|
|
|
|
для: Akira
(29.07.2005 в 15:32)
| | Внесу свою небольшую лепту в общее дело подсчёта строк в проекте.
Мой пример не основан на рекурсии. Ему чужда кроссплатформенность. Он написан для никс систем, поскольку главное - производительность.
<?
$check = array("php","htm","html","tpl"); // массив расширений файлов, в которых будем читать строки
exec ("find ../".$dirname,$files); // $dirname - имя корневой дирректории хоста в системе,
//$files - абсолютно все файлы и дирректории с вложением на любом уровне
for ($i=0; $i<count($files); $i++){ // обходим массив $files
ereg(".+\.(.+)$",$files[$i],$regs); // пишем какое расширение у очередного файла
if (!is_dir($files[$i]) && in_array($regs[1],$check)){ // елси это файл и расширение есть в массиве $check разрешаем считать количество строк
$content = file($files[$i]); // читаем файл в массив
}
if ($content !== False){ // если файл не вернул ошибку, добавляем к общему числу строк, количество строк в файле
$total = $total + count($content);
}
}
echo ("В вашем проекте строк: ".$total);
?>
|
| |
|
|
|
|
|
|
|
для: [CHOL]Scorpion
(29.07.2005 в 21:57)
| | Код рекурсивной фукнции scan_dir, которая обходит директории
<?
function scan_dir($dirname)
{
GLOBAL $extentions, $count;
# Если путь пустой, то используем текущий каталог
empty($dirname) ? $dirname = "*" : $dirname = $dirname."/*";
$dir = glob($dirname);
// Если директория существует обходим.
if ($dir)
{
foreach($dir as $filename)
{
if (is_file($filename))
{
// Расширение файла
$ext=strrchr($filename, ".");
foreach($extentions as $exten)
// Если файл попадает под маску,то считаем строки
if(preg_match($exten, $ext))
{
// Читаем содержимое файла
$content = file($filename);
// Подсчтываем число файлов
$count += count($content);
// Удаляем массив
unset($content);
}
}
if (is_dir($filename))
{
scan_dir($filename);
}
}
}
}
?>
|
Код вызова функции scan_dir()
<?
// Имя корневой директории проекта
$dirname = "";
// Массив с расширениями файлов, для которых следует подсчитывать
// число строк
$extentions = array("#.php#i");
// $extentions = array("#\.cpp#i","#\.h#i");
// Счётчик строк - глобальная переменная
$count = 0;
// Вызов функции, осуществляющей рекурсивный спуск по подкаталогам
// корневого каталога
scan_dir($dirname);
// Записываем число строк в переменную $count
file_put_contents("test",$count);
?>
|
| |
|
|
|
|
|
|
|
для: Akira
(30.07.2005 в 17:44)
| | Ну вот собсна тоже написал, для PHP5:
<?php
// Немного поправляем итератор FilterIterator
class myFilterIterator extends FilterIterator {
private $regexp;
public function accept() {
return preg_match($this->regexp, $this->getFilename());
}
public function regexp($regexp) {
$this->regexp=$regexp;
}
}
$path = "c:/www/"; // Начальная директория
$ext = "\.php|\.sql"; // Расширения, через |, перед точкой ставим \
// Дальше считаем:
$b = new myFilterIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
$b->regexp('#'.$ext.'$#i');
$count = 0;
foreach($b as $file) {
$content = file($file->getPath().'/'.$file);
$count += count($content);
unset($content);
}
// И выводим
echo $count;
?>
|
| |
|
|
|
|
|
|
|
для: isset
(30.07.2005 в 18:38)
| | Не очень понятно зачем для 5 версии? Там же есть стандартная scandir(). | |
|
|
|
|
|
|
|
для: Akira
(30.07.2005 в 18:52)
| | Так она же не обходит вложенные директории, только ту которую укажешь, а то что выше написано рекурсивно обходит | |
|
|
|
|
|
|
|
для: isset
(30.07.2005 в 18:56)
| | А что мешает ее запустить рекурсивно? Помните в книге было написано "Не изобретайте велосипеда" :)) Мне кажеться scandir работает пошустрее. | |
|
|
|
|
|
|
|
для: Akira
(30.07.2005 в 19:05)
| | Рекомендую прочитать про Iterator-ы, можно из того что выше сделать с файлами все что угодно | |
|
|
|
|
|
|
|
для: Akira
(30.07.2005 в 19:05)
| | В какой книге кстати?)
Это не велосипед, скорее всего scandir использует такие же итераторы | |
|
|
|
|
|
|
|
для: isset
(30.07.2005 в 19:12)
| | В самой первой :) Это ед. книга которую мне хватило денег :) Да и наткнулся я на нее случайно. | |
|
|
|