Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчёт числа строк в программном проекте
 
 автор: cheops   (22.07.2005 в 17:21)   письмо автору
 
 

Часто программные проекты имеют множество вложенных директорий, тем не менее для оценки сложности проекта удобно знать число строк во всё программном проекте.
Представляем вашему вниманию скрипт, осуществляющий рекурсивный спуск по поддиректориям проекта и подсчитывающий число строк в файлах с заданным расширением.
Вероятно многим будет интересно узнать, что типичные Web-приложения и сайты, разрабатываемые Web-студией SoftTime включают от 2 000 до 15 000 строк кода. Сам проект SoftTime содержит 50 000 строк кода.

http://www.softtime.ru/scripts/numlines.php

   
 
 автор: Akira   (22.07.2005 в 18:51)   письмо автору
 
   для: cheops   (22.07.2005 в 17:21)
 

Хм...Можно писать все в одну строку...
Я думаю может как то подсчитывать не строки, а символ (;)

   
 
 автор: cheops   (22.07.2005 в 19:17)   письмо автору
 
   для: Akira   (22.07.2005 в 18:51)
 

Можно, но правила хорошего тона это не рекомендуют в том числе, и по тому, что скрывается сложность проекта...

   
 
 автор: isset   (22.07.2005 в 19:03)   письмо автору
 
   для: cheops   (22.07.2005 в 17:21)
 

Не понятно только зачем нужна $ext = strrchr($dirname."/".$file, "."); , ведь можно регулярное выражение подредактировать:
заменить
$extentions = array("#\.php#i");
на
$extentions = array("#\.php$#i");

   
 
 автор: cheops   (22.07.2005 в 19:18)   письмо автору
 
   для: isset   (22.07.2005 в 19:03)
 

Согласен.

   
 
 автор: to4karu   (23.07.2005 в 10:44)   письмо автору
 
   для: cheops   (22.07.2005 в 19:18)
 

Хм.. а как насчет пустых строк и комментариев?..
У меня, например, могут быть функции, треть кода которых сотавляет комметарий к ним..

   
 
 автор: cheops   (23.07.2005 в 10:56)   письмо автору
 
   для: to4karu   (23.07.2005 в 10:44)
 

Они тоже учитываются - это мировая практика - комментарии вообще считают неотъемлемой частью проекта и считают их наряду с обычными операторами - их же тоже нужно редактировать и поддерживать при изменении кода. Кроме того, комментариями снабжают сложные моменты коды, т.е. сообщается, что этот участок имеет более высокую концентрацию сложности - поэтому для идеально-написанного проекта - число строк будет объективно отражать его сложность.

   
 
 автор: idborn   (23.07.2005 в 15:41)   письмо автору
 
   для: cheops   (23.07.2005 в 10:56)
 

Строки состоящие только из фигурных скобок тоже учитываются?

   
 
 автор: cheops   (23.07.2005 в 18:50)   письмо автору
 
   для: idborn   (23.07.2005 в 15:41)
 

Да, скрипт считает просто строки в файле. Если в конце файла будет 200 пустых строк - он их тоже посчитает.

   
 
 автор: Akira   (29.07.2005 в 14:03)   письмо автору
 
   для: cheops   (23.07.2005 в 18:50)
 

Я тут подумал :) Может немного изменить ваш код? Выше темой я уже для обхода переписал.

   
 
 автор: cheops   (29.07.2005 в 14:09)   письмо автору
 
   для: Akira   (29.07.2005 в 14:03)
 

Код менять можно и нужно :))), в разделе "Примеры PHP" лежат затравки и идеи, главным образом для того, чтобы на них было удобно ссылаться при обсуждении, а не помещать каждый раз здоровый листинг в тему, а потом каждый раз выгружать его.

   
 
 автор: Akira   (29.07.2005 в 14:26)   письмо автору
 
   для: cheops   (29.07.2005 в 14:09)
 

Я тут просто замучался свои проекты называть :) Забываю, сколько всего изменял :) По этому поводу есть идея.
У нас есть проект. Вот он работает. Запускаем скрипт подсчета. Он нам выдает опр. кол-во строк. Допустим 2500.
2500 - это версия 0.0
Мы наизменяли, запускаем опять, если строк на 500 больше/меньше к номеру версии +0.1 т.е.
Версия продукта 0.1.
Как мысль?

   
 
 автор: Duran   (29.07.2005 в 14:54)   письмо автору
 
   для: Akira   (29.07.2005 в 14:26)
 

А смысл ? Тада по номеру можно будет определить скоко строк добавили, а удалили скоко ?:)) Да и вообще не с кол-ве строк дело.

Честно говоря, я не особо вижу смысл считать кол-во строк проекта, мой редактор их и так считает неплохо. Другое дело - действительно символы или токены (фразы). У меня частельно строчка из одного тэга состоит, а другая из целой кучи.
С точки зрения ценности информации кол-во строк гораздо менее цено, нежели кол-во строк.

Мне нравится вот такой способ формирования атомов номера проекта.
Например - x.0g - гамма (не факт, что все работает и все протестино).
x.а- альфа - сами знаете
x.х - поправки + доп. изменения/функции
x.х.х - изменения, касаемые ошибок
x.х.х.х - изменения, касаемые безопасности работы приложения.

   
 
 автор: Akira   (29.07.2005 в 14:59)   письмо автору
 
   для: Duran   (29.07.2005 в 14:54)
 

Если внесли изменение в 500 строк по проекту. То это уже сущ. изменение. а если не 500 а 3000? Вот и версия взлетает в 6 раз.
Хорошо когда один. А если нет? Так хоть будет ясно как работа движеться.
Поставил крон. И раз в сутки проверка.

   
 
 автор: P@Sol   (29.07.2005 в 14:59)   письмо автору
 
   для: Duran   (29.07.2005 в 14:54)
 

>С точки зрения ценности информации кол-во строк гораздо
>менее цено, нежели кол-во строк.
>
моя система:
имя 0.x - в стадии разработки
имя 1 - рабочая версия
имя 1.х - незначительное добавления/исправлена ошибка и т.п.
имя 2 - существенное добавление (новая функция, смена дизайна и т.д.)

   
 
 автор: Akira   (29.07.2005 в 15:11)   письмо автору
 
   для: P@Sol   (29.07.2005 в 14:59)
 

У меня нет времени этим занематься :) Мен программинг поглашает полностью. Я не могу уследить, что именно я сотворил.

   
 
 автор: P@Sol   (29.07.2005 в 15:30)   письмо автору
 
   для: Akira   (29.07.2005 в 15:11)
 

для этого у меня есть две папки на сервере и на локльном компе....программирую на сервере...сотворил что то стоящее записал на локальный комп в соответствующую папку...потом бац новую функцию добавил -> на локальный комп в след. папку..

   
 
 автор: Akira   (29.07.2005 в 15:32)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:30)
 

Все сложно и отвлекает от работы :) Я творческий человек, работаю на вдохновление (аналог пиво)

   
 
 автор: [CHOL]Scorpion   (29.07.2005 в 21:57)   письмо автору
 
   для: 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); 

?>

   
 
 автор: Akira   (30.07.2005 в 17:44)   письмо автору
 
   для: [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);
?>

   
 
 автор: isset   (30.07.2005 в 18:38)   письмо автору
 
   для: 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;
?>

   
 
 автор: Akira   (30.07.2005 в 18:52)   письмо автору
 
   для: isset   (30.07.2005 в 18:38)
 

Не очень понятно зачем для 5 версии? Там же есть стандартная scandir().

   
 
 автор: isset   (30.07.2005 в 18:56)   письмо автору
 
   для: Akira   (30.07.2005 в 18:52)
 

Так она же не обходит вложенные директории, только ту которую укажешь, а то что выше написано рекурсивно обходит

   
 
 автор: Akira   (30.07.2005 в 19:05)   письмо автору
 
   для: isset   (30.07.2005 в 18:56)
 

А что мешает ее запустить рекурсивно? Помните в книге было написано "Не изобретайте велосипеда" :)) Мне кажеться scandir работает пошустрее.

   
 
 автор: isset   (30.07.2005 в 19:11)   письмо автору
 
   для: Akira   (30.07.2005 в 19:05)
 

Рекомендую прочитать про Iterator-ы, можно из того что выше сделать с файлами все что угодно

   
 
 автор: isset   (30.07.2005 в 19:12)   письмо автору
 
   для: Akira   (30.07.2005 в 19:05)
 

В какой книге кстати?)
Это не велосипед, скорее всего scandir использует такие же итераторы

   
 
 автор: Akira   (30.07.2005 в 19:13)   письмо автору
 
   для: isset   (30.07.2005 в 19:12)
 

В самой первой :) Это ед. книга которую мне хватило денег :) Да и наткнулся я на нее случайно.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования