Я разрабатываю метод расчета итога для корзины покупок, написанный на PHP, и хотел бы получить отзыв о хорошем шаблоне проектирования для обработки различных условий. Я пытаюсь предложить администраторам несколько стратегий для расчета скидок. Администраторам будет предоставлен выбор применить скидки до или после применения налогов, а также применить скидку к доставке или нет. Это дает обзор моей задачи.
Переменные
У меня есть следующие переменные для этой задачи с возможными значениями:
$tax_option
: «до», «после»
$shipping_option
: «да», «нет»
В дополнение к этим двум переменным формула для расчета общей стоимости будет меняться в зависимости от отношения между $subtotal
(количество товаров в корзине) и $reduction
(общая сумма, подлежащая дисконтированию) ,
Вообще говоря, моя логика заключается в том, что я проверяю каждую из 4 комбинаций переменных $tax_option
и $shipping_option
. Мне также нужно изменить формулу для ситуаций, когда $subtotal
меньше или равно $reduction
. Всего у меня 8 разных условий.
Возможности
Я полагаю, что у меня действительно есть 3 варианта: операторы if
, оператор switch
или шаблон стратегии. Я покажу структуру оператора if
и шаблон стратегии, но исключу возможность switch
, потому что в данном контексте это не совсем правильно.
if
Заявления
Вот общая схема утверждения if, которое я рассматриваю. Обратите внимание, что я знаю, что мог бы немного перестроить это, но по любой причине это более читабельно для меня.
if($tax_option == 'after' && $shipping_option == 'yes')
{
if($subtotal <= $reduction)
{
}
else
{
}
}
elseif($tax_option == 'before' && $shipping_option == 'yes')
{
if($subtotal <= $reduction)
{
}
else
{
}
}
elseif($tax_option == 'before' && $shipping_option == 'no')
{
if($subtotal <= $reduction)
{
}
else
{
}
}
elseif($tax_option == 'after' && $shipping_option == 'no')
{
if($subtotal <= $reduction)
{
}
else
{
}
}
else
$new_total = $total;
Шаблон стратегии
Посмотрев в Интернете решение этой проблемы, я узнал о паттерне стратегии , который выглядит потрясающе. Я начал работать над этим здесь и не буду возражать против некоторых отзывов. Пока это выглядит как следующий код с очевидным удалением некоторых подпрограмм.
class DPPCalculateTotal
{
protected $formulas = array();
public function DPPCalculateTotal($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
foreach($this->formulas as $formula)
{
if($formula->test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction))
{
return $formula->calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction);
}
}
}
function add_formula(DPPFormula $formula)
{
$this->formulas = $formula;
}
}
interface DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction);
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction);
}
class AfterTaxesYesShippingGreaterSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class AfterTaxesYesShippingLesserSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class AfterTaxesNoShippingGreaterSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class AfterTaxesNoShippingLesserSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class BeforeTaxesYesShippingGreaterSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class BeforeTaxesYesShippingLesserSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class BeforeTaxesNoShippingGreaterSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
class BeforeTaxesNoShippingLesserSubotal implements DPPFormula
{
public function test($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
public function calculate_total($tax_option, $shipping_option, $total, $subtotal, $shipping, $tax, $coupons_amount, $reduction)
{
}
}
Вопросы
1) Как вы думаете, что будет лучшим вариантом для продолжения здесь?
2) Каковы преимущества шаблона стратегии в этом случае?
3) Так как я впервые пробую Шаблон стратегии, похоже, я иду в правильном направлении?
Большое спасибо за ваш вклад! Я с удовольствием изучаю этот шаблон и буду благодарен за любые отзывы, которые я смогу получить!