Created
June 14, 2022 13:07
-
-
Save SmetDenis/cd9459edd030403b774a29efb91ef94f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php declare(strict_types=1); | |
/** | |
* Задача | |
* - Написать программу, которая выводит цифры от 1 - 50. | |
* - Условия: Если, цифру можно делить на 5, то программа должна вывести не цифру, а вывести слово "да". | |
* - Если можно цифру разделить на 7, то программа должна вывести не цифру, а вывести слово - "нет". | |
* - Если цифру можно делить на 5 и на 7, то программа должна вывести не цифру, а вывести слово - "данет". | |
*/ | |
/** | |
* Заметки от кандидата: | |
* | |
* <режим-зануды> | |
* 1. По условиям задачи нужно написать программу, а не просто функцию. | |
* Поэтому мысленно представим, что это консольное приложение с возможным хардкодом внутри (числа 1 и 50). | |
* 2. Полагаю, что в тексте задачи правильно будет не "цифра", а "число". | |
* Иначе есть вероятность неправильно истолковать задачу и заниматься разбором литер. | |
* 3. Если нет цели менять начало и конц диапазона, то задача упрощается до ф-и fooBarFromRange, | |
* которая возвращает массив-константу. Т.к. нет смысла вычислять список снова и снова. | |
* </режим-зануды> | |
* | |
* 4. Да, задача простая и тупая. А я выпендривался везде и по чуть-чуть. | |
* Надеюсь вы проникнитесь явно еявным юмором в этом коде =) Но если думаете что это все перебор, то нам не по пути =) | |
* А я просто хотел сделать интересным фу-бар вместо скучного снипета. | |
* | |
* P.S. Это не отменает факта, что сказанное в комментариях имеет смысл. | |
*/ | |
#### Code ############################################################################################################## | |
/** | |
* 1. Тело функции можно заменить на возвращение длинного массива (хардкода), если данные на входе никогда не меняются. | |
* - Нет смысла выполнять этот код снова и снова, чтобы получить одинаковый результат. | |
* Это чистая функция, со всеми вытекающими. | |
* - Для абстракции и места хранения содержательного комментария - функция останется, просто вернет готовый массив. | |
* По факту, комментарием будут условия задачи. | |
* | |
* 2. Если в будущем придется работать с длинным массивом данных, то | |
* range() стоит заменить на аналог с yield (генератор). Можно будет чуть-чуть оптимизировать на памяти. | |
* | |
* @param int $startRange | |
* @param int $endRange | |
* @return array | |
*/ | |
function fooBarFromRange(int $startRange, int $endRange): array | |
{ | |
return array_reduce(range($startRange, $endRange), static function ($acc, $number): array { | |
$appendValue = ''; | |
if ($number % 5 === 0) { | |
$appendValue .= 'да'; | |
} | |
if ($number % 7 === 0) { | |
$appendValue .= 'нет'; | |
} | |
if (!$appendValue) { | |
// Приводим число к строке, чтобы на выходе получилась коллекция из одного типа переменных (строка). | |
$appendValue = (string)$number; | |
} | |
$acc[$number] = $appendValue; // Сохраняем целочисленный ключ для удобства "отладки". | |
return $acc; | |
}, []); | |
} | |
/** | |
* По сути, эта функция абстракция отвечает за вывод. | |
* | |
* @param string[] $outputList | |
* @return void | |
*/ | |
function foobarPrinter(array $outputList): void | |
{ | |
print_r($outputList); // Выводим как нам будет удобно, хоть построчно, хоть по диагонали, хоть в логи. | |
} | |
// Runtime | |
// 1. Если это именно программа, то лучше сделать это внешними опциями, типа `php ./foobar --start=1 --end=50` с дефолтными значениями. | |
// 2. С помощью комбинирования и композиции этих функций добиваемся гибкости под капотом итд. Типа фреймворк =) | |
foobarPrinter(fooBarFromRange(1, 50)); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment