пример
Я натолкнулся на монолитный код, который делает «все» в одном месте - загружает данные из базы данных, показывает разметку HTML, действует как маршрутизатор / контроллер / действие. Я начал применять SRP, перемещая код базы данных в собственный файл, обеспечивая лучшее именование вещей, и все это выглядело хорошо, но потом у меня возникли сомнения относительно того, почему я это делаю.
Почему рефакторинг? Какова цель? Это бесполезно? В чем выгода? Обратите внимание, что я в основном оставил монолитный файл как есть, но рефакторил только меньшую часть, относящуюся к области, где мне нужно было выполнить какую-то работу.
Оригинальный код:
Чтобы привести конкретный пример, я наткнулся на этот фрагмент кода - он загружает спецификации продукта либо по известному идентификатору продукта, либо по выбранному пользователем идентификатору версии:
if ($verid)
$sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid);
else
$sql1 = "SELECT * FROM product_spec WHERE product_id = " . clean_input($productid) ;
$result1 = query($sql1);
$row1 = fetch_array($result1);
/* html markup follows */
Рефакторинг:
Поскольку я выполняю некоторую работу, требующую от меня изменений в этой конкретной части кода, я изменил его, чтобы использовать шаблон репозитория, и обновил его для использования объектно-ориентированных средств MySQL:
//some implementation details omitted
$this->repository = new SpecRepository($mysql);
if ($verid)
$row1 = $this->repository->getSpecByVersion($verid);
else
$row1 = $this->repository->getSpecByProductId($productid);
/* html markup follows to be refactored or left alone till another time*/
//added new class:
class SpecRepository extends MySqlRepository
{
function getSpecByVersion(int $verid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE id = ?
", $verid)->getSingleArray();
}
function getSpecByProductId(int $productid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE product_id = ?
", $productid)->getSingleArray();
}
}
Должен ли я сделать это?
Оглядываясь назад на изменения, код все еще там, код с той же функциональностью, но в разных файлах, разных именах, местах, используя скорее объектно-ориентированный стиль, чем процедурный. На самом деле забавно заметить, что переработанный код выглядит намного раздутым, несмотря на то, что он обладает той же функциональностью.
Я предвижу некоторые ответы: «Если вы не знаете причин, по которым вы проводите рефакторинг, не делайте этого», и, возможно, я могу согласиться. Мои причины - со временем улучшить качество кода (и я надеюсь, что я буду делать это, следуя SRP и другим принципам).
Это достаточно веские причины или я трачу свое время на «перестановку кода вокруг» таким образом? В целом, рефакторинг - это как походка на воду, если честно - это требует времени и становится более «разделенным», насколько SRP идет, но, несмотря на мои добрые намерения, я не чувствую, что делаю потрясающие улучшения. Следовательно, обсуждаем, лучше ли оставить код, как прежде, а не рефакторинг.
Почему я рефакторинг в первую очередь?
В моем случае я добавляю новые функциональные возможности для новой линейки продуктов, поэтому я должен либо следовать существующей структуре кода для аналогичных линий продуктов, либо написать свою собственную.
select *
становится «лучшей практикой».
Select * from ..
это можно считать антишаблоном. См. Stackoverflow.com/q/3639861/31326