Все дело в том, что так бывает...
17 Oct 2013Именно так начинается одно из моих любимых стихотворений. Я собирался сегодня прийти домой и пописать код, но внезапно мне пришла в голову мораль одной басни, сюжет которой случился днем. Рекомендую уделить немного времени, хотя бы потому что это случалось с вами.
В статье про код ревью был "запрос" на практическую сторону. Но руки не доходят написать что-то, да и сделать это достаточно сложно, по крайней мере в том виде, в котором я вижу. Скорее всего, она появится из таких маленьких статей, как эта.
Кусочек сыра
Сегодня попался на глаза вот такой кусочек кода.
<?php
//code
if (!Utilities::arrayContains($array1, $array2)) {
return false;
}
//code
?>
Думаю что-то не так. Создают функцию в классе Utilities
только тогда, когда не могут определить ее принадлежность. Что уже странно. Во-вторых, ну название. Вроде бы и понятно все, с другой стороны, не внушает какого-то доверия.
<?php
/**
* @param array $array1
* @param array $array2
* @return boolean
*/
public static function arrayContains(array $array1, array $array2)
{
foreach ($array1 as $value1) {
if (!in_array($value1, $array2)) {
return false;
}
}
return true;
}
?>
Действительно, несколько раз пробегаю глазами, так как боюсь упустить что-то, заставляя себя поверить в увиденное. Аккуратно оставляю предложение заменить содержание на <?php empty(array_diff($array1, $array2));?>
, переименовать или удалить метод.
В итоге вечером получаем...
<?php
/**
* @param array $array1
* @param array $array2
* @return boolean
*/
public static function isArrayDiff(array $array1, array $array2)
{
$diff = array_diff($array1, $array2);
return empty($diff);
}
?>
Про лису
Хитрый лис не скажет вороне: "Дай сыр, птица". Во-первых, она может не дать его. Во-вторых, навряд ли это чему-то научит, басня-то не получится и морали не будет. Поэтому идеальный вариант для ревью - это подача чего угодно в наилучшем виде для автора кода. В более сложных случаях я и свой вариант содержания не предлагаю, так как его у меня просто нет. Просто прошу еще раз подумать, в сложных ситуациях спасает парное программирование. При этом не надо выступать в роли оратора или диктатора. Если вы хотите думать за всех, пишите проект один тогда. Не могу сказать, что у меня всегда получается быть хитропопой лисой, но я стараюсь.
Про чистый код и ворону
Я думаю, что знаю на 99 процентов причину появления такого метода. Конечно, человек уже наелся определенного куска проекта. Метод вызывается в очень неприятном месте с кучей условных конструкций, хотелось как-то лучше разгрести. Скорее всего, в голову не пришла функция array_diff
, и вынос foreach
в отдельный метод - правильный выбор.
Но сам урок начался позже. Методы из двух строчек имеют место быть, все дело в названии. В последнем варианте мы получили обертку над стандартной функцией. В данном контексте она бессмысленна. Если мы захотим реализовать работу со стеком в ООП стиле и обернуть array_pop
и array_push
в класс и методы, то у нас будет цель и причина всего этого. Здесь цель не прослеживается.
Так что же делать в данном случае? Я бы подумал над куском кода, где это вызывается. Возможно, существует определение этой операции в целом. Ведь массивы что-то содержат, у них есть нормальные имена (в статье они преднамеренно переведены в array1
и array2
).
Например, если бы array1
содержал права пользователя, а array2
все необходимые права на просмотр страницы. Тогда, на мой скромный взгляд, метод имеет место быть на 101 процент, с каким-нибудь именем isAllow*
.
Если мы не можем как-то определить и выделить по смыслу эти строчки, то и выносить их, скорее всего, нет смысла.
Мораль басни
Я думаю, стервятники и любители поржать даже не зайдут в этот скромный блог. В чем же я увидел "мораль" и почему такое название статьи?
Вы что-то прочитали, у вас куча идей и желание все перехерачить. А что-то идеальное лежит почему-то всегда на "горном перевале". Так бывает, что на эмоциях мы проскакиваем его. Прочитали о паттернах - давай плодить из plain php кучу классов, выстраивать архитектуру, которая в итоге ничуть не понятнее. Прочитали дядюшку Боба - давай все дробить без остановки. Прочитали про agile - давай ломать работу проекта. Прочитали статью - давай сразу внедрять.
Я сам постоянно допускаю подобные ошибки, но при этом думаю, что это правильно. Продолжая горную тему: это лучше, чем сидеть перед перевалом всю жизнь, не совершая каких-то дерзких попыток покорения вершин, или вообще спуститься в долину со словами: "Да ну нафиг эти горы". С приобретением опыта наши просчеты уменьшаются, а какими путниками мы станем, зависит только от нас.
Статью завершу словами: "Лучше гор могут быть только горы, на которых никто не бывал".