我有一個函式可以回傳發票上有多少產品,這對我來說似乎很簡單,但也許它可以使用一些重構?
public function getTotalProductsNumber(): int
{
$dataset = 'supplier_invoice_products inner join supplier_invoices as si using (supplier_invoice_id)';
$dbmSupplier = new Dbm_Supplier($dataset);
$whereAndOpt = $this->getConditionsAndOptions();
$where = $whereAndOpt['where'];
$opt = $whereAndOpt['opt'];
$select = 'sum(product_quantity) as sumTotal';
$invoiceTotalProductsNumber = $dbmSupplier->findFirstSimple($where, $select, $opt);
$invoiceTotalProductsNumber['sumTotal'] = (int)$invoiceTotalProductsNumber['sumTotal'];
return $invoiceTotalProductsNumber['sumTotal'];
}
如何將其提取到至少兩個函式中?
uj5u.com熱心網友回復:
對于這種事情,理想情況下你會使用 ORM。由于我不確定您使用的是哪個,如果有的話,我可能會在這個方向上將它重構為更多的東西,所以它感覺更接近 ORM 的作業方式:
public function getTotalProductsNumber(): int
{
$dataset = 'supplier_invoice_products inner join supplier_invoices as si using (supplier_invoice_id)';
$extras = $this->getConditionsAndOptions();
$queryBuilder = [
'dbm' => new Dbm_Supplier($dataset),
'where' => $extras['where'],
'opt' => $extras['opt']
];
return $this->sumOfProductQuantities($queryBuilder);
}
private function sumOfProductQuantities(array $queryBuilder): int
{
$select = 'sum(product_quantity) as sumTotal';
$row = $this->queryBuilderFirstRow($queryBuilder, $select);
return (int)$row['sumTotal'];
}
private function queryBuilderFirstRow(array $qb, string $select): array
{
return $qb['dbm']->findFirstSimple($qb['where'], $select, $qb['opt']);
}
uj5u.com熱心網友回復:
我個人認為這非常簡單且非常干凈,但我可以建議的唯一優化是提取getConditionsAndOptions
部分,因為它似乎用于您的代碼的其他幾個部分。請看這個:
public function getTotalProductsNumber(): int
{
$dataset = 'supplier_invoice_products inner join supplier_invoices as si using (supplier_invoice_id)';
$dbmSupplier = new Dbm_Supplier($dataset);
list($where, $opt) = $this->getWhereAndOpt();
$select = 'sum(product_quantity) as sumTotal';
$invoiceTotalProductsNumber = $dbmSupplier->findFirstSimple($where, $select, $opt);
$invoiceTotalProductsNumber['sumTotal'] = (int)$invoiceTotalProductsNumber['sumTotal'];
return $invoiceTotalProductsNumber['sumTotal'];
}
private function getWhereAndOpt(): array
{
$whereAndOpt = $this->getConditionsAndOptions();
return [
$whereAndOpt['where'],
$whereAndOpt['opt'],
];
}
另一點可能是名稱約定。我可以看到您使用snail_case
了 Dbm_Supplier 命名。最好是dbm_supplier
或DbmSupplier
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/487904.html
上一篇:如何在PHP中組合多個正則運算式