Код на Ревью
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;
}