實踐出真理
在前面總結的兩篇設計模式相關的知識內容,對於如何規範程式碼,編寫程式碼有了一個比較清晰的瞭解,在編寫程式碼中,也會刻意程式碼應該如何編寫,而不是像擠麵條似的把程式碼功能邏輯寫成一堆。
需求
以下是我根據最近接到的一個新需求去修改的程式碼。需求是在原本的活動下,修改擴充更多的活動型別,原先的需求只有固定的活動(如買一送一,買二送一,第二件享受折扣),如果要設定買一送二等就不能實現,對此,需要將原先的活動大改,將活動分為5種型別(滿足活動滿減,滿足活動折扣,買x件送x件,一口價活動,第x件享受活動)。這樣使運營在配置活動時,想要配置怎樣的活動都可以得到滿足。
需求分析
這裡只寫了大致思路和虛擬碼。
對於每一個活動型別,都需要校驗活動型別是否合法,是否達到活動的使用條件和活動優惠價格,可以作為公共部分抽離出來。對此我建立了一個活動介面類。
//活動介面類
interface ActivityInterface
{
//校驗活動型別合法性
public function verify();
//是否滿足活動使用條件
public function available();
//計算活動優惠金額
public function calculation();
}
由於存在五種不同型別,這裡建立五個不同的活動類去繼承介面,並分別實現介面的方法。
//滿減型別活動類
class SubTypeActivity implements ActivityInterface
{
//校驗活動型別合法性
public function verify(){
//方法實現
};
//是否滿足活動使用條件
public function available(){
//方法實現
};
//計算活動優惠金額
public function calculation(){
//方法實現
};
}
//折扣型別活動類
class DiscountTypeActivity implements ActivityInterface
{
//校驗活動型別合法性
public function verify(){
//方法實現
};
//是否滿足活動使用條件
public function available(){
//方法實現
};
//計算活動優惠金額
public function calculation(){
//方法實現
};
}
//指定折扣型別活動類
class AppointDiscountTypeActivity implements ActivityInterface
{
//校驗活動型別合法性
public function verify(){
//方法實現
};
//是否滿足活動使用條件
public function available(){
//方法實現
};
//計算活動優惠金額
public function calculation(){
//方法實現
};
}
//贈送型別活動類
class GivingTypeActivity implements ActivityInterface
{
//校驗活動型別合法性
public function verify(){
//方法實現
};
//是否滿足活動使用條件
public function available(){
//方法實現
};
//計算活動優惠金額
public function calculation(){
//方法實現
};
}
//一口價型別活動類
class BuyoutTypeActivity implements ActivityInterface
{
//校驗活動型別合法性
public function verify(){
//方法實現
};
//是否滿足活動使用條件
public function available(){
//方法實現
};
//計算活動優惠金額
public function calculation(){
//方法實現
};
}
這裡建立完成五個活動類後,對於各個不同的活動類的呼叫,如果是用過程式的方式去編寫程式碼,程式碼耦合度和可讀性會很差,對此我建立了一個ActivityFactoryService活動工廠服務類。在該類上實現不同活動類的呼叫和訪問控制。以下是活動工廠服務類的相關程式碼,後續如果需要新增其他的活動型別,只需要新增活動類,並在getActivityFactory方法中新增新的if分支,當然活動型別應該不會太多,所以我這裡就使用ifelse去判斷。
class ActivityFactoryService implements ActivityInterface
{
protected $service;
public function __construct($activity)
{
$this->getActivityFactory($activity);
}
/**
* 使用工廠模式得到不同型別活動類
* @param $activity
* @throws \Exception
*/
public function getActivityFactory($activity)
{
//這裡使用了列舉類,列舉了所有活動型別去判斷
if ($activity->type == ActivityType::SUB_TYPE){
//滿減型別
$this->service = new SubTypeActivity($activity);
}else if ($activity->type == ActivityType::ALL_DISCOUNT_TYPE){
//折扣型別
$this->service = new DiscountTypeActivity($activity);
}else if ($activity->type == ActivityType::APPOINT_DISCOUNT_TYPE){
//指定折扣型別
$this->service = new AppointDiscountTypeActivity($activity);
}else if ($activity->type == ActivityType::GIVING_TYPE){
//贈送型別
$this->service = new GivingTypeActivity($activity);
}else if ($activity->type == ActivityType::BUYOUT_TYPE){
//一口價型別
$this->service = new BuyoutTypeActivity($activity);
}
if (!$this->service){
throw new \Exception('活動型別錯誤');
}
}
//校驗活動型別合法性
public function verify()
{
return $this->service->verify();
}
//是否滿足活動使用條件
public function available()
{
return $this->service->available();
}
//計算活動優惠金額
public function calculation()
{
return $this->service->calculation();
}
}
以上是我對於一個新需求的相關分析,並對實現程式碼進行處理的一個過程。
本作品採用《CC 協議》,轉載必須註明作者和本文連結