Сравните два алгоритма, какой лучше.

Ge0SuB

Guest
Сравните два алгоритма, какой лучше.

Привет, есть задача, распарсить конфиг файл.
Есть две функции которые делают то-же самое, возвращают масив строк определенной секции из файла, возник спор, какая функция лучше, красивее, быстрее. итд..
Вот вункции :
Вариант 1
PHP:
	private function GetConfigPart ( $PartName )
	{
    	for ( $a = 0; $a < sizeof ( $this->ConfigArray ); $a++ )
		{
			if ( strpos ( $this->ConfigArray[$a], $PartName ) )
    			$StartPathSection = 1;
			if ( strlen ( $this->ConfigArray[$a] ) < 10 and $StartPathSection == 1 )
    			$StopPathSection = 1;
			if ( $StartPathSection == 1 and $StopPathSection != 1 )
			{
    			if ( $SavePart == 1 )
					$PartOfConfig[] = $this->ClearConfigString ( $this->ConfigArray[$a] );
				$SavePart = 1;
    		}
		}
		return $PartOfConfig;
	}
Вариант 2
PHP:
	private function getSectionStartPos ( $PartName ) 
	{
		for ( $a=0; $a < sizeof ( $this->ConfigArray ); $a++ )
			if ( strpos ( $this->ConfigArray[$a], $PartName ) )
				break;
		return $a;
	}

	private function getSectionEndPos ( $startPos ) 
	{
		for ( $a = $startPos+1; $a < sizeof ( $this->ConfigArray ); $a++ )
			if ( strlen ( $this->ConfigArray[$a] ) < 10  ) 
					break;
		return $a;
	}


	private function GetConfigPart ( $PartName ) 
	{
		$startPos = $this -> getSectionStartPos ( $PartName );
		$endPos = $this -> getSectionEndPos ( $startPos );
		for ( $i = $startPos+1; $i < $endPos; $i ++ )
			$PartOfConfig[] = $this->ClearConfigString ( $this->ConfigArray[$i] );
		return $PartOfConfig;
	}
Очень интересно услышать Ваше мнение. Спасибо.
 

melfar

Guest
Вы про
parse_ini_file()
слышали?

А про ассоциативные массивы?
 

Popoff

popoff.donetsk.ua
Вариант 3:

PHP:
function GetConfigPart ( $PartName ) 
{
  $k=-1;
  for ( $i = 0; $i < count( $this->ConfigArray ); $i++ ) 
  { 
     if ( strpos ( $this->ConfigArray[$i], $PartName ) ) 
     {
        $k=$a;
        break;
     }
  }
  if($k<0) return array();
  $PartOfConfig=array();
  for($i=$k;$i<count( $this->ConfigArray )&&strlen ( $this->ConfigArray[$i] ) >= 10;$i++)
    $PartOfConfig[] = $this->ClearConfigString ( $this->ConfigArray[$i] );
  return $PartOfConfig;
}
ЗЫ:
1. Вы уверены, что начало-конец определяются именно так?
2. Чувствуется, что первый вариант писал человек, который раньше писал на паскале и которому кажется, что в программировании часто можно встретить сложные задачи.
3. В целом, второй вариант выглядит более профессиональным, хотя в нем есть лишние проходы и не понятно, зачем введены дополнительные функции - они имели бы смысл, если бы имели хоть чуть-чуть более сложное тело.

-~{}~ 11.11.05 14:37:

Кстати, да. Все, что я написал, касается *только* приведенного кода и не имеет никакого отношения к решаемой Вами задаче.
 

Ge0SuB

Guest
Мне и было интересно просто сравнение одинаковых алгаритмов. то что они может быть не совершенны по своей идее, это само собой. Первый вариант писал я, а второй еще один програмист.
Так вот, я всегда писал на ПХП, на паскале очень давно в школе, а второй человек( вариант 2) пишет на с++ и на пхп не пишет.

Я согласен с тем что второй вариант выглядит более профиссионально, но по моему в первом варианте намного всё понятней.
Но это мое мнение, так как я и делал тот самый первый вариант :)

2parse_ini_file : Спасибо, не слышал.. но ведт топик заключаеться не в том что-бы вы помогли мне написать парсер конфиг файла а просто посмотреть на готовый код и чравнить его.. вот и всё.
 

melfar

Guest
Нда.. теперь уже и такие спецы пишут на C++..

Что по вашему мнению значит "распарсить конфиг файл"?
Каким образом может относится ваша (неэффективная) функция поиска подстроки в массиве строк к парсингу конфиг-файла?

Вы всерьез полагаете, что каждый раз, когда вам нужно узнать содержимое какой-либо константы в какой-либо секции конфиг-файла, необходимо каждый раз заново его обрабатывать?

Для начала определитесь с задачей, которую хотите решить, и тогда поймете что для решения задачи ваша функция не требуется вообще.
 

Popoff

popoff.donetsk.ua
Нет, в первом варианте все очень запутано. Слишком много лишних переменных.
 

Ge0SuB

Guest
они не лишнии, без них никак. там три флага.
первый для нахождения начала секции, второй для нахождения конца секции.
а вот третий SavePart действительно не нужен, можно без него обойтись.. Но вот без StartPathSection и StopPathSection в первом варианте точно не обойтись.
 

Popoff

popoff.donetsk.ua
Ge0SuB
Возможно, я когда-нибудь созрею для того, чтобы написать статью о том, почему флаги усложняют программу, кто и почему их вносит в программу, к каким проблемам может привести их использование и как можно программировать без них. Использование флагов чем-то напоминает использование GOTO. В целом, те, кому нравится этот оператор, как правило, избавляются от него введением флагов. Но ведь можно немножко подумать и получить красивый и понятный код без этого оператора и без флагов.

-~{}~ 11.11.05 16:35:

Программа с флагами - это плохо продуманный автомат - в флагах хранится состояние этого автомата. Для решения той задачи, которую решает приведенный Вами код, не требуются автоматы.
 

[Gisma]

Новичок
ваш вариант может и меньше по размерам, но второй вариант более удобен хотя бы тем, что код разделен на функциональные блоки поэтому более прост на выходе, а следовательно более надежный.
Отладить его проще, чем первый вариант, для его отладки требуется только опрашивать результаты выполнения функций и сравнивать с правильными. Так что практика второго варианта лучше
 
Сверху