Thí dụ
Tôi đã bắt gặp mã nguyên khối thực hiện "mọi thứ" ở một nơi - tải dữ liệu từ cơ sở dữ liệu, hiển thị đánh dấu HTML, hoạt động như một bộ định tuyến / bộ điều khiển / hành động. Tôi bắt đầu áp dụng mã cơ sở dữ liệu di chuyển SRP vào tệp riêng của mình, cung cấp cách đặt tên tốt hơn cho mọi thứ và tất cả đều có vẻ tốt, nhưng sau đó tôi bắt đầu nghi ngờ về lý do tại sao tôi làm việc này.
Tại sao phải tái cấu trúc? Mục đích là gì? Có phải nó vô dụng? Lợi ích là gì? Lưu ý rằng tôi hầu như chỉ để lại tệp nguyên khối, nhưng chỉ tái cấu trúc phần nhỏ hơn có liên quan đến khu vực mà tôi cần thực hiện một số công việc.
Mã gốc:
Để đưa ra một ví dụ cụ thể, tôi đã xem qua đoạn mã này - nó tải các thông số kỹ thuật của sản phẩm theo id sản phẩm đã biết hoặc bởi id phiên bản do người dùng chọn:
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 */
Tái cấu trúc:
Vì tôi đang thực hiện một số công việc yêu cầu tôi thay đổi mọi thứ trong phần mã cụ thể này, tôi đã thay đổi nó để sử dụng mẫu kho lưu trữ và nâng cấp nó để sử dụng các tiện ích MySQL hướng đối tượng:
//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();
}
}
Tôi có nên làm điều này?
Nhìn lại các thay đổi, mã vẫn còn đó, mã có cùng chức năng, nhưng trong các tệp khác nhau, tên, địa điểm khác nhau, sử dụng kiểu hướng đối tượng hơn là theo thủ tục. Trên thực tế, thật buồn cười khi lưu ý rằng mã được cấu trúc lại trông có vẻ bồng bềnh hơn rất nhiều mặc dù có cùng chức năng.
Tôi thấy trước một số câu trả lời rằng "nếu bạn không biết lý do tại sao bạn tái cấu trúc, đừng làm điều đó", và có lẽ tôi có thể đồng ý. Lý do của tôi là để cải thiện chất lượng mã theo thời gian (và hy vọng của tôi là tôi sẽ làm như vậy bằng cách tuân theo SRP và các nguyên tắc khác).
Là những lý do đủ tốt hay tôi đang lãng phí thời gian vào việc "sắp xếp lại mã xung quanh" theo cách này? Nói chung, việc tái cấu trúc này có cảm giác hơi giống với việc giẫm nước thành thật - nó cần có thời gian và nó trở nên "tách biệt" hơn theo SRP nhưng mặc dù ý định tốt của tôi, tôi không cảm thấy mình đang cải thiện đáng kinh ngạc. Do đó, tranh luận nếu tốt nhất là để lại mã như trước đây và không tái cấu trúc.
Tại sao tôi lại cấu trúc lại ở nơi đầu tiên?
Trong trường hợp của tôi, tôi đang thêm chức năng mới cho một dòng sản phẩm mới, vì vậy tôi phải tuân theo cấu trúc mã hiện có cho các dòng sản phẩm tương tự hoặc tự viết.
select *
trở thành "cách thực hành tốt nhất".
Select * from ..
có thể được coi là một mô hình chống. Xem stackoverflow.com/q/3639861/31326