Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как правильно реализовать тестовое задание на должность PHP developer?

#php #инспекция_кода #задание_на_собеседовании


HR менеджер дал тестовое задание. Я выполнил. В ответ он сказал, что 


  я получил только краткий фидбек - не понравилось качество и стиль реализации.


Хочу вашего совета, что я не так написал.
Вот задание:

Тестовое задание #1:

Версии ПО: PHP 5.3-5.6

Необходимо реализовать функцию, которая произведет чтение данных файла и вернет обработанные
данные в указанном виде.

Функция должна:
 - Считать данные с файла
 - Разбить данные по строкам в массив
 - Отфильтровать массив таким образом, чтобы в нем остались лишь строки содержащие
только числа
 - Суммировать числа в каждой строке
 - Отсортировать полученные суммы в порядке убывания
 - Вернуть результат

Пример кода:

     # Путь к файлу данных  $file = __DIR__ . '/datalist.txt'; 
     # Передаем данные в функцию и получаем результат  $result = getResult( $file ); 
     # Отображаем результат  echo '
'; 
     var_export( $result );

      function getResult ( $file )  {
          # @TODO Реализовать...  }

     Пример результата работы функции:  array (    82 => 16396,    19 =>
     16169,    71 => 15864,    73 => 15224,    81 => 14244    ...


Кусок файла datalist.txt:

55 NTfy 591 405 kLj 48 644 768 164 ubd 837 oTft GPQV 163 ja 445 961
431 574 168
375 380 427 670 610 284 765 48 687 660 377 333 914 70 146 328 301 925 266
620 237 137 584 427 308 939 660 917 59 864
j hHo 279 tqpg 617 870 CoNJ 173 czgW 301 299 134 820 625 U 369 165 hutPN jiq 31 575
46 NS 397 378 954 764


Как я это реализовал:

';
var_export($result);

function getResult($file) {
#Считать данные с файла.
#Разбить данные по строкам в массив
    $line = file($file);
    $i = 0;
    foreach ($line as $value) {
        $ArrayLine = explode(' ', $value);
        foreach ($ArrayLine as $Record) {
            $result[$i] = 0;
#Отфильтровать массив таким образом, чтобы в нем остались лишь строки содержащие
только числа
            $CheckString = preg_replace('~[^A-Za-z]+~', '', $Record);
            if (strlen($CheckString) > 0) {
                unset($result[$i]);
                break;
            };
            $res = (int) $Record;
#Суммировать числа в каждой строке
            $result[$i] += $res;
        }
        $i++;
    }
#Отсортировать полученные суммы в порядке убывания
    arsort($result);
    return $result;
}

    


Ответы

Ответ 1



Код

Ответ 2



Согласен с Alexander Bragin, задание слишком игрушечное для того чтоб стоило сильно задумываться о реализации. Кроме того в задачи фактически приведён готовый алгоритм, как должна работать функция, что несколько ограничивает свободу действий в реализации (не ясно можно ли было к примеру разбить функцию или не хранить в памяти фаил целиком а считывать его построчно ...). Но могу сделать пару замечаний по стилю. Имена переменных - почему некоторые переменные записаны в CamelCase, а другие с маленькой буквы. Отступы в комментариях. Комментарии легче читаются когда они по отступам не выделяются от кода (либо идут в конце строки). Возможный баг: в задаче сказано что нужно убрать все строки которые содержат не числа. Вы проверяете регуляркой только наличие латинских букв. Если в примере будут какие либо символы то функция будет работать некорректно (не проверял код). Незакрыт тэг
, хотя возможно это просто не весь код.


Ответ 3



Можно было бы более лаконично выполнить задание: '; var_export($result); echo '
'; function getResult($file) { $result = array_map( function ($item) { return array_sum(explode(' ', $item)); }, array_filter( file($file, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES), function ($item) { return preg_match('~^[\s\d]+$~', $item); } ) ); arsort($result); return $result; }

Ответ 4



'; var_export($var); }

Ответ 5



'; var_export($result); echo "
\n"; function getResult ($file) { if (file_exists($file)) { if ($lines = file($file, FILE_SKIP_EMPTY_LINES)) { foreach ($lines as $index => $line) { $line = trim($line); preg_match_all('/\d\d{0,}/', $line, $matches); if (!empty($matches[0]) && $line === implode(' ', $matches[0])) { $lines[$index] = array_sum($matches[0]); } else { unset($lines[$index]); } } if (empty($lines)) { return "Numbers don't found"; } else { rsort($lines); return $lines; } } else { return 'File empty or has wrong structure'; } } else { return 'File not found'; } }

Комментариев нет:

Отправить комментарий