Скидки до 20% + 2-ая профессия бесплатно и подарки на 50 000₽

Главная | Все статьи | Код

Разбор решения задачи "Вес Хемминга"

Время чтения статьи ~2 минуты 13

Код на Ревью

function hammingWeight($weight)
{
    $array = str_split(decbin($weight));
    $amount = 0;
    foreach ($array as $value) {
        $amount += $value;
    }
    return $amount;
}

Контрольные точки

  • Понятно ли с первого взгляда что делает функция (основываясь на содержимом)?
  • Попробуйте воспроизвести определение понятия "Вес Хемминга", глядя только на код

Спецификация

Вес Хэмминга это количество единиц в двоичном представлении числа. Реализуйте функцию hammingWeight, которая считает вес Хэмминга.

Проблемы

Ничего не говорящие и запутывающие имена переменных

Как известно, именование переменных является одной из самых сложных задач в разработке, и данный пример это подтверждает. Плохие имена не только не помогают читать код, но и могут запутывать. В данном примере переменная $weight это, на самом деле, исходное число, а вес это $amount.

Имя $array не запутывает, но и не помогает. Разумно, в данном случае, было назвать переменную $digits, что соответствует сути.

Алгоритм вычисления веса опирается не на спецификацию, а на корреляцию

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

Алгоритм опирается на особенности типизации в php

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

Подписывайтесь на канал Кирилла Мокевнина в Telegram — чтобы узнать больше о программировании и профессиональном пути разработчика

Вывод

Функция выглядит магической и требует время на осознание. Перед тем как она будет понята, смотрящему придется увидеть указанную корреляцию.

Решение

Использовать реализацию основанную на определении понятия "вес Хемминга".

function hammingWeight($num)
{
    $weight = 0;
    $digits = str_split(decbin($num));
    foreach ($digits as $value) {
        if ($value == '1') {
            $weight++;
        }
    }
    return $weight;
}
Аватар пользователя Kirill Mokevnin
Kirill Mokevnin 22 августа 2016
13
Похожие статьи
Рекомендуемые программы
профессия
Верстка на HTML5 и CSS3, Программирование на JavaScript в браузере, разработка клиентских приложений используя React
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Ruby, Разработка веб-приложений и сервисов используя Rails, проектирование и реализация REST API
5 месяцев
c опытом
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря