插件开发技术说明(16)---消除代码冗余

来源:互联网 发布:手机所有交友软件 编辑:程序博客网 时间:2024/05/16 18:36

1.问题场景

代码冗余是程序结构性问题.

其最大的缺陷是程序的维护成本(包括代码修改,调试和测试).次要影响之一是编译的可执行文件增大了,占用了运行时内存.


几种单据的促销使用的CPromotion,CSaleDivider在以下模块中都有定义:存在3个极其相似的副本.
---yoopo_data.h初始定义,对应COrder
---sd:sd_data.h (对应CSale)
---mpm:mpm_data.h(对应CPurchase)

首先需要澄清的是,初始定义时我并未意识到后来多种单据都存在促销的情况,对后期需求没有进一步了解.否则不会是当初的设计.


促销极可能是未来存在变数的一个领域.
任何调整都涉及到上述3个模块的同步调整.


促销相关的概念:
.促销方案:对应促销单(CPromotion)
.促销策略:CPromotion::CPromotionOrderItemMgr内置
.可促销单据:引入CPromotable,CPromotableDetail类 

***促销相关类及分单器移入到新的公共文件common\Promtable文件中.

COrder,CSale,CPurchase都从CPromotable派生.其对应明细都从CPromotableDetail派生


2.实现

Promotable.h文件定义如下:除以下内容外,CPromotion及相关类也移入此文件.

/////////////////////////////////////////////////////////////////////////////< 单据分单器///< 对每一促销方案的明细生成一张单据class COrderDivider {public:map<SLIC_SHEETID,vector<CSheetDetail*>* > details_;bool Find(SLIC_SHEETID sheet_id);void Add(SLIC_SHEETID sheet_id,CSheetDetail* detail);};typedef COrderDivider CSheetDivider; ///< 单据分单器class CPromotion;class CPromotableDetail;/////////////////////////////////////////////////////////////////////////////////< 可促销单据class CPromotable : public CSheet {public:float   disc_value_;///<    整单优惠金额float   crm_value_;         ///<    促销优惠金额public:CPromotable(SLIC_SHEETTYPE sheet_type):CSheet(sheet_type),disc_value_(0),crm_value_(0) {}CPromotable(SLIC_SHEETTYPE sheet_type,SLIC_SHEETID sheet_id):CSheet(sheet_type,sheet_id),disc_value_(0),crm_value_(0) {}virtual CPromotableDetail* NewDetail() = 0;};/////////////////////////////////////////////////////////////////////////////////< 可促销单据明细class CPromotableDetail : public CSheetDetail {public:SLIC_GOODS_ID goods_id_; ///< 商品IDint bulk_qty_; ///< 散装数int pack_qty_; ///< 件装数int pack_unit_qty_; ///< 件包装数float bulk_price_; ///< 散装价float pack_price_;  ///< 件装价SLIC_SHEETID promotion_sheetid_; ///< 促销单号float disc_value_; ///< 优惠金额bool gift_flag_; ///< 赠品标识    int gift_qty_;                       ///< 赠品数量string prefer_notes_;CPromotion *promotion_;public:CPromotableDetail():goods_id_(0),bulk_qty_(0),pack_qty_(0),pack_unit_qty_(1),bulk_price_(0),pack_price_(0),promotion_sheetid_(0),disc_value_(0),gift_flag_(0),gift_qty_(0),promotion_(0) {}};


3.应用调整

COrder调整如下:

class COrder : public  CPromotable {public:struct COrderDetail : public CPromotableDetail {public:COrderDetail():CPromotableDetail(),line_num_(1),order_(0){}public:COrder():CPromotable(1050),pay_type_(0),pur_value_(0),pay_value_(0),ret_flag_(0),from_id_(4),source_(0) {}CPromotableDetail* NewDetail() { return new COrderDetail; }};

.从CPromotable派生,构造函数调整
.明细从CPromotableDetail派生,构造函数调整
.实现NewDetail

4.促销实现的局限

促销策略:
。条件
。优惠内容:
一个促销策略一种条件,一个优惠内容,如满金额立减。
一个促销策略可应用到不同的促销方案,不同的单据类型


促销方案:
。一个促销方案,目前只支持一种优惠策略.
即不支持以下情形:
A,B,C三个商品,(1)A,B满金额立减,(2)A,C满数量赠品.
这2个策略理论上还存在与和或的组合。这引入了潜在的最优策略问题,如当或关系时,系统如何决定最后方案。
基于此,不能把促销策略复杂化,可以从实用角度简化。如考虑无限可能,则促销策略非脚本化不可。


0 0
原创粉丝点击