制定统一业务逻辑基础规则
?????? 在系統開發前都會制定代碼編寫規則,這樣能夠很好的規范系統代碼編寫,提高代碼可閱讀性和可維護性。同樣在編寫業務邏輯上自己也會定義基礎處理規則,這樣就能夠清楚明確系統中所有業務邏輯的處理過程(主要也是方便對業務邏輯的理解和維護);在實際情況中業務邏輯的規則是比較復雜和多變的,似乎制定一個統一的規則比較難。但是事實上可以采用Command模式制定業務邏輯的基礎規則,用于描述業務邏輯執行的切入點;對于一些復雜的規則(如業務流程處理等)可以通過Template Method模式對基礎規則進行擴展;這種制定規則只適用于單一職責業務邏輯,對于一些多職責業務邏輯只能選擇別的方式。
?????? 在軟件開發中解決問題的方法很多,雖然都是解決同一問題但不同人實現的方法卻可以完全不一樣;因此以下描述的內容只是本人在項目制定的業務邏輯基礎規則。在系統設計時會制定以下兩種業務邏輯的基礎規則:
1)? 多職責規則;用于業務數據的基礎操作,主要是添加,修改和刪除。
2)? 單一職責規則;用于擴展出查詢、統計和復雜處理的基礎規則(實際上是規范所有單一職責的業務邏輯)。
?
多職責規則
?????? 這種規則主要用于規范基于業務基礎操作操作的業務邏輯;職責包括對業務數據進行添加,修改和刪除等操作。這種規則在數據庫處理系統中比較常見,其行為也比較統一。在制定這種規則相對比較簡單,制定相關職責方法即可:
?????? ???? /// <summary>
???? /// 模型操作規則
???? /// </summary>
???? public interface IModelLogic
???? {
???????? /// <summary>
???????? /// 添加模型對象
???????? /// </summary>
???????? void Add();
???????? /// <summary>
???????? /// 刪除模型對象
???????? /// </summary>
???????? void Delete();
???????? /// <summary>
???????? /// 更新模型對象
???????? /// </summary>
???????? void Edit();
???? }
為了更適合應用,可以實現IModelLogic建立一個方便處理的Adapter
???? public class ModelLogicAdapter:IModelLogic
???? {
???????? private object mIndex = null;
???????? /// <summary>
???????? /// 獲取模型對象相關索引
???????? /// </summary>
???????? private object mModelObj = null;
?
?
???????? protected object Index
???????? {
????????????? get
????????????? {
?????????????????? return mIndex;
????????????? }
???????? }
????
???????? /// <summary>
???????? /// 獲取當前模型對象
???????? /// </summary>
???????? protected object ModelObj
???????? {
????????????? get
????????????? {
?????????????????? return mModelObj;
????????????? }
????????????? set
????????????? {
?????????????????? mModelObj = value;
????????????? }
???????? }
????????
?
?
???????? public ModelLogicAdapter()
???????? {
???????? }
???????? public ModelLogicAdapter(object index)
???????? {
????????????? mIndex = index;
????????????? OnLoadModel(mIndex);
???????? }
????????
???????? #region IModelLogic 成員
???????? /// <summary>
???????? /// 加載模型對象
???????? /// 派生類重寫
???????? /// </summary>
???????? /// <param name="index">模型相關索引</param>
???????? protected virtual void OnLoadModel(object index)
???????? {
?????????????
???????? }
???????? /// <summary>
???????? /// 更新當前模型對象
???????? /// </summary>
???????? public void Add()
???????? {
????????????? // TODO:? 添加 ModelLogicAdapter.Add 實現
????????????? CheckModule();
????????????? OnAdd();
???????? }
???????? protected virtual void OnAdd()
???????? {
????????????? DAOContext.Add(ModelObj);
???????? }
?
???????? /// <summary>
???????? /// 刪除當前模型對象
???????? /// </summary>
???????? public void Delete()
???????? {
?
????????????? // TODO:? 添加 ModelLogicAdapter.Delete 實現
????????????? CheckModule();
????????????? OnDelete();
???????? }
???????? protected virtual void OnDelete()
???????? {
????????????? DAOContext.Delete(ModelObj);
???????? }
?
???????? /// <summary>
???????? /// 編輯當前模型對象
???????? /// </summary>
???????? public void Edit()
???????? {
????????????? // TODO:? 添加 ModelLogicAdapter.Edit 實現
????????????? CheckModule();
????????????? OnEdit();
???????? }
???????? protected virtual void OnEdit()
???????? {
????????????? DAOContext.Edit(ModelObj);
???????? }
?
???????? #endregion
???????? private void CheckModule()
???????? {
????????????? if(ModelObj == null)
?????????????????? throw(new LogicException(TipMessage.MODELOGIC_ERROR_MODELOBJECT_ISNULL));
???????? }
???????? /// <summary>
???????? /// 獲取相關索引方法
???????? /// </summary>
???????? /// <param name="table">實體相關表名稱</param>
???????? /// <returns>索引值</returns>
???????? protected int GetRecordIndex(string table)
???????? {
????????????? lock(this.GetType())
????????????? {
?????????????????? int index=0;
?????????????????? System.Collections.IList list = (DBMapping.TablePK.TableName== table).List();
?????????????????? TablePK item;
?????????????????? if(list.Count ==0)
?????????????????? {
?????????????????????? index =1;
?????????????????????? item = new TablePK();
?????????????????????? item.TableName = table;
?????????????????????? item.RecordIndex = index;
?????????????????????? DBMapping.TablePK.Insert(item);
?????????????????? }
?????????????????? else
?????????????????? {
?????????????????????? item = (TablePK )list[0];
?????????????????????? item.RecordIndex++;
?????????????????????? index = item.RecordIndex;
?????????????????????? DBMapping.TablePK.Update(item);
?????????????????? }
?????????????????? return index;
????????????? }
???????? }
???? }
ModeLogicAdapter在原有基礎上引入了Template Method模式進行了一個小小的擴展,規定相關行為都通過OnXXX方法去描述執行;基于規則的派生類就必須通過重寫OnXXX方法來編寫具體操作行為,對于一些共性的行為可以統一編寫在相關職責方法中。
具體應用
?????? ???? /// <summary>
???? /// 用戶信息業務規則操作對象
???? /// </summary>
???? public class UserLogic : ModelLogicAdapter
???? {
???????? public UserLogic()
???????? {
???????? }
???????? public UserLogic(string usercode):base(usercode){}
???????? public Entities.SysUser UserItem
???????? {
????????????? get
????????????? {
?????????????????? return (Entities.SysUser)ModelObj;
????????????? }
????????????? set
????????????? {
?????????????????? ModelObj =? value;
????????????? }
???????? }
???????? protected override void OnLoadModel(object index)
???????? {
?????????????
????????????? ModelObj = DBMapping.SysUser.GetByIndex((string)Index);
???????? }
???????? protected override void OnAdd()
???????? {
????????????? if((DBMapping.SysUser.UserCode == UserItem.UserCode).Count() >0)
????????????? {
?????????????????? throw(new LogicException(TipMessage.USERLOGIC_ERROR_HAVERECORD));
????????????? }
????????????? base.OnAdd ();
???????? }
????????
???? }
單一職規則
?????? 由于這種規則的情況非常多(包括:查詢業務邏輯、統計業務邏輯和流程處理等;事實所有單一職責的業務規則都從此規則派生下來)因此在制定時要非常簡單不能摻雜過多的東西;通過Command模式來規范業務邏輯處理的入口點,當面臨處理很多節點時可以通過Template Method模式進行擴展。
?????? 制定基礎規則
???? /// <summary>
???? /// 基礎規則接接口
???? /// 用于描述業務邏輯執行點
???? /// </summary>
???? public interface IBaseLogic
???? {
???????? ?void Execute();
???? }
???? 擴展出基于條件的業務邏輯規則(常用于數據查詢和數據統計)
?????? /// <summary>
???? /// 條件描述接口
???? /// </summary>
???? public interface IFilter
???? {
???????? /// <summary>
???????? /// 獲取條件表達式對象
???????? /// </summary>
???????? /// <returns>條件表達式對象</returns>
???????? HFSoft.Data.Expressions.IExpression GetFilter();
???? }
???? /// <summary>
???? /// 基于條件業務邏輯描述規則
???? /// </summary>
???? public interface IFilterLogic:IBaseLogic
???? {
????????
???????? /// <summary>
???????? /// 獲取或設置條件對象
???????? /// </summary>
???????? IFilter Filter
???????? {
????????????? get;
????????????? set;
???????? }
???? }
?????? 基于條件規則的具體應用
?????? ???? /// <summary>
???? /// 用戶查詢邏輯類
???? /// </summary>
???? public class UserQuery:IFilterLogic
???? {
???????? public UserQuery()
???????? {
????????????? //
????????????? // TODO: 在此處添加構造函數邏輯
????????????? //
???????? }
???????? private System.Collections.ArrayList mItem;
???????? public System.Collections.ArrayList Items
???????? {
?
????????????? get
????????????? {
?????????????????? return mItem;
????????????? }
???????? }
???????? #region IFilterLogic 成員
????????
???????? public void Execute()
???????? {
????????????? // TODO:? 添加 UserQuery.Execute 實現
????????????? ?mItem =(System.Collections.ArrayList) Filter.GetFilter().List();
?????????????
???????? }
???????? private IFilter mFilter;
???????? public IFilter Filter
???????? {
????????????? get
????????????? {
?????????????????? // TODO:? 添加 UserQuery.Filter getter 實現
?????????????????? if(mFilter == null)
?????????????????????? return new UserFilter();
?????????????????? return mFilter;
????????????? }
????????????? set
????????????? {
?????????????????? // TODO:? 添加 UserQuery.Filter setter 實現
?????????????????? mFilter = value;
????????????? }
???????? }
?
???????? #endregion
???????? [Serializable]
???????? public class UserFilter:FilterAdapter
???????? {
????????????? public override HFSoft.Data.Expressions.IExpression GetFilter()
????????????? {
?????????????????? HFSoft.Data.Expressions.Expression exp = new HFSoft.Data.Expressions.Expression();
?????????????????? exp.Table = DBMapping.SysUser;
?????????????????? return exp;
????????????? }
?
???????? }
???? }
制定簡單流程規則
???? /// <summary>
???? /// 基礎流程規則
???? /// </summary>
???? public abstract class FlowBase:IBaseLogic
???? {
???????? public FlowBase()
???????? {
????????????? //
????????????? // TODO: 在此處添加構造函數邏輯
????????????? //
???????? }
???????? #region IBaseLogic 成員
???????? /// <summary>
???????? /// 流程執行點
???????? /// </summary>
???????? public void Execute()
???????? {
????????????? // TODO:? 添加 FlowBase.Execute 實現
??????????????? OnInit();
??????????????? Flowing();
??????????????? OnEnd();
???????? }
???????? /// <summary>
???????? /// 加載流程所需要數據
???????? /// </summary>
???????? protected abstract void OnInit();
???????? /// <summary>
???????? /// 流程處理過程
???????? /// </summary>
???????? protected abstract void Flowing();
???????? /// <summary>
???????? /// 流程處理結束過程
???????? /// </summary>
???????? protected abstract void OnEnd();
???????? #endregion
???? }
?
以上是在項目開發過程制定的業務邏輯基礎處理規則,有興趣的朋友發表一下自己的看法或自己是如何制定相關規則的。
總結
以上是生活随笔為你收集整理的制定统一业务逻辑基础规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摄影基本功训练
- 下一篇: 打算尝试瑜伽,看是否能解决长期困扰的胃痛