Пример неудачного извлечения функции при формировании скриншота из видеоролика


Исходный код

$mov   = new ffmpeg_movie ( '1.avi' );
$frame = $mov -> GetFrame ( 26 ):
$gd    = ToGd ( $frame );

header ( "Content-type: image/gif" );
imageGif ( $gd );

function ToGd ( $frame )
{
  RETURN $frame -> toGDimage ();
}

Что не так в исходном коде

Казалось бы, вот есть отдельная маленькая функция, всё как я люблю.

Однако здесь функция не прячет никакого знания, намерение полностью совпадает с реализацией. Сейчас описание функции звучит так: «Чтобы получить картинку из кадра, нужно вызвать метод получения картинки из кадра». Другими словами, здесь метод превращён в функцию с дргуим названием, который делает то же самое.

В правильном методе реализация отличается от намерения: «Чтобы подсветить фрагмент текста, нужно вывести его в инверсном цвете».

Как можно улучшить исходный код

Если в таком коротком коде хочется что-то спрятать, то более достойный кандидато на это — алгоритм получения кадра из ролика. По сути исходный код реализует две вещи: получает кадр в виде картинки и отдаёт её веб-клиенту. Вот первую реализацию как раз и стоит убрать.

function GetFrame( $video, $frame_number ) {
  $mov   = newffmpeg_movie ( '1.avi' );
  $frame = $mov -> GetFrame ( 26 ):
  $gd    = $frame -> toGDimage ();
  return $gd;
}
header ( "Content-type: image/gif" );
GetFrame ( '1.avi', 26 );

Теория