├── 01.php.md ├── 02.php.md └── README.md /01.php.md: -------------------------------------------------------------------------------- 1 | ### Код на Ревью 2 | 3 | ```php 4 | function hammingWeight($weight) 5 | { 6 | $array = str_split(decbin($weight)); 7 | $amount = 0; 8 | foreach ($array as $value) { 9 | $amount += $value; 10 | } 11 | return $amount; 12 | } 13 | ``` 14 | 15 | ### Контрольные точки 16 | 17 | * Понятно ли с первого взгляда что делает функция (основываясь на содержимом)? 18 | * Попробуйте воспроизвести определение понятия "Вес Хемминга" глядя только на код 19 | 20 | ### Спецификация 21 | 22 | Вес Хэмминга это количество единиц в двоичном представлении числа. 23 | Реализуйте функцию `hammingWeight`, которая считает вес Хэмминга. 24 | 25 | ### Проблемы 26 | 27 | > Ничего не говорящие и запутывающие имена переменных 28 | 29 | Как известно, именование переменных, является одной из самых сложных задач в разработке и данный пример это подтверждает. 30 | Плохие имена не только не помогают читать код, но и могут запутывать. В данном примере переменная `$weight` это, на самом деле, 31 | исходное число, а вес это `$amount`. 32 | 33 | Имя `$array` не запутывает, но и не помогает. Разумно, в данном случае, было назвать переменную `$digits`, что соответствует сути. 34 | 35 | > Алгоритм вычисления веса опирается не на спецификацию, а на корреляцию 36 | 37 | По случайному совпадению оказалось что можно сложить все цифры, из которых состоит число в двоичном представлении, и мы получим вес Хемминга. 38 | Да это сработает и этим фактом воспользовался автор, но определение веса Хемминга звучит совсем по другому. Это приводит к семантическому 39 | разрыву. По коду сложно понять и восстановить описание, а так же верно и обратное. После знакомства с определением, трудно увидеть в коде 40 | его реализацию. 41 | 42 | > Алгоритм опирается на особенности типизации в php 43 | 44 | PHP обладает, так называемой, слабой типизацией. Это означает что php автоматически преобразует типы операндов в различных операциях, 45 | вместо того чтобы сообщить об ошибке. Например при сложении числа со строкой. Слабая типизация это источник большого количества проблем 46 | и странного поведения программы при определенных входных данных. Это относится не только к php, в javascript ситуация точно такая же. 47 | 48 | ### Вывод 49 | 50 | Функция выглядит магической и требует время на осознание. Перед тем как она будет понята, смотрящему придется увидеть указанную корреляцию. 51 | 52 | ### Решение 53 | 54 | Использовать реализацию основанную на определении понятия "вес Хемминга". 55 | 56 | ```php 57 | function hammingWeight($num) 58 | { 59 | $weight = 0; 60 | $digits = str_split(decbin($num)); 61 | foreach ($digits as $value) { 62 | if ($value == '1') { 63 | $weight++; 64 | } 65 | } 66 | return $weight; 67 | } 68 | ``` 69 | -------------------------------------------------------------------------------- /02.php.md: -------------------------------------------------------------------------------- 1 | ### Код на Ревью 2 | 3 | ```php 4 | = 0; $i--){ 12 | if ($orig_arr[0] == "-"){ 13 | $reverse_arr[0] = "-"; 14 | } 15 | $reverse_arr[] = $orig_arr[$i]; 16 | } 17 | 18 | return (int)$reverse = implode("",$reverse_arr); 19 | } 20 | ``` 21 | 22 | ### Контрольные точки 23 | 24 | * Можно ли назвать код элегантным? 25 | * Сколько времени требуется для того чтобы понять как работает код для сохранения знака? 26 | 27 | ### Спецификация 28 | 29 | Необходимо перевернуть число. Знак должен оставаться на своем месте. 30 | 31 | ``` 32 | 31 == reverseInt(13); 33 | -321 == reverseInt(-123); 34 | ``` 35 | 36 | ### Проблемы 37 | 38 | > Стандарты кодирования 39 | 40 | Короткий вывод: их тут нет. Несоответствие стандартам очень плохой звоночек. И чем более опытный человек тем хуже. Это автоматически означает 41 | что будут проблемы в команде вплоть до конфликтов. В php (как и в большинстве других языков) сейчас существует один общий главный стандарт 42 | и это первое чему должен соответствовать код. К тому же эти стандарты могут проверять автоматически используя соответствующие решения (phpcs). 43 | 44 | > Обработка знака 45 | 46 | Проверка на знак сделана крайне странно и сложно. 47 | 48 | * В цикле проверяется условие, которое отрабатывает на каждой итерации. Причем если число действительно отрицательное, то установка будет 49 | происходить каждый раз! 50 | * Из-за предыдущего пункта вытекает то, что присвоение нельзя делать как обычно `[] =`, поэтому используется `[0]`, что приводит к хитрой 51 | комбинации в случае если число отрицательное. 52 | * В целом сама проверка с циклом не связана, но находится там, только для того чтобы сдвинуть индекс массива. 53 | 54 | > Возврат 55 | 56 | Зачем-то делается присвоение переменной, которая никак не используется во время возврата. 57 | 58 | ### Вывод 59 | 60 | Оформление кода нарушает стандарты кодирования на php во всех своих проявлениях. Проверка на знак сделана слишком хитро, видно что 61 | автор подогнал решение под особенности php. 62 | 63 | ### Решение 64 | 65 | Вариант решения с циклом приведен ниже. В идеальном случае надо просто воспользоваться функцией для переворота строки. 66 | 67 | ```php 68 | = 0; $i--) { 76 | $reversedDigits[] = $digits[$i]; 77 | } 78 | $newNumber = (int) implode('', $reversedDigits); 79 | 80 | return $num > 0 ? $newNumber : -$newNumber; 81 | } 82 | ``` 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Код-ревью решений задач из Хекслета 2 | 3 | Решили задание на Хекслете (в [уроках](https://ru.hexlet.io/courses) или в [практике](https://ru.hexlet.io/challenges))? 4 | 5 | Присылайте решение в [issues](https://github.com/Hexlet/code-reviews/issues) 6 | и мы постараемся сделать код-ревью вашего решения и выложить в этот репозиторий. 7 | 8 | ### Создание запроса на ревью 9 | 10 | * Создайте issue. 11 | * Приложите текст задачи, а так же ссылку на задание к уроку если это задание к уроку, и имя 12 | практики если это практика. 13 | * Приложите ваше решение. Обязательно используйте 14 | [возможности markdown](https://guides.github.com/features/mastering-markdown/) для форматирования вашего кода. 15 | --------------------------------------------------------------------------------