예
한 곳에서 "모든 것"을 수행하는 모 놀리 식 코드를 발견했습니다. 데이터베이스에서 데이터를로드하고 HTML 마크 업을 표시하며 라우터 / 컨트롤러 / 액션으로 작동합니다. SRP 이동 데이터베이스 코드를 자체 파일에 적용하기 시작하여 더 나은 이름 지정 기능을 제공했지만 모두 좋아 보였지만 왜 내가 이것을하는지에 대한 의문이 생겼습니다.
왜 리팩터링해야합니까? 목적은 무엇입니까? 쓸모 없습니까? 이점은 무엇입니까? 필자는 대부분 모 놀리 식 파일을 그대로두고 있지만 일부 작업을 수행 해야하는 영역과 관련된 작은 부분 만 리팩토링했습니다.
원본 코드 :
구체적인 예제를 제공하기 위해이 코드 스 니펫을 발견했습니다. 알려진 제품 ID 또는 사용자가 선택한 버전 ID로 제품 사양을로드합니다.
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