複雜業務簡單化

來源:互聯網
上載者:User

標籤:

複雜業務簡單化的一個小技巧在複雜系統中,當對業務資料進行“刪除”時(一般不允許對業務資料進行刪除,只是舉例) ,需要根據其它業務資料進行判斷如:   1.已產生出庫單不允許刪除,   2.付款單已確認不允許刪除,   3.已經退換貨則不允許刪除。   實際業務中可能會更加複雜。       當出現這種情況時將導致“刪除”業務判斷會非常多,而且會經常修改,很有可能當其它業務發生變化時需要重新去調整“刪除”業務。 解決方案:為業務資料增加一個中介軟體“是否可以刪除的標識”其它業務發生變化時修改此標識為false  其它業務修改時不能將此標識改為true 刪除時只根據此標識做判斷,可能會手動修改業務標識(進階操作)       不能將此標識改為true是因為 改為true需要去做很多驗證,為了避免複雜性所以不能修改標識為true。       如:使用者提出需求“自營店,可以修改價格,可以添加贈品,不扣預存款。非自營店,不能改價格,不能加贈品,扣款存款”             程式設計時最好別把 “自營或非自營”做為判斷條件,而將“是否允許修改價格,是否允許添加贈品,是否扣除預存款”做為判斷條件,對店鋪(業務資料)增加相應的控制開關配置。             這樣可能很好的提高程式擴充性,未來業務發生變化時可以不用修改代碼。比如 需要"非自營店可能添加贈品"時。      對業務資料的控制開關配置可以使用key/value形式通一設計持久化儲存,這些開關拒絕和業務資料的查詢有聯絡。      注意事項:1.如果系統中大量使用開關配置,會經常會開關配置進行修改,需要考慮並發性,防止多個業務同時對相同的控制開發進行修改。                    2.此類配置不會做為資料檢索條件          以上是工作中記錄內容,分享相應的處理代碼,希望對你們有用    

/// <summary>
/// 資料配置類
/// </summary>
public class SmartConfig : BaseEntity
{
/// <summary>
/// 類型
/// </summary>
[MaxLength(32)]
public string Type { get; set; }
/// <summary>
/// 類型標識
/// </summary>
[MaxLength(32)]
public string TypeIdentity { get; set; }
/// <summary>
/// 時間截
/// </summary>
[MaxLength(32)]
public string Timestamp { get; set; }
/// <summary>
/// 配置
/// </summary>
public string Config { get; set; }
}

這是Table對應的實體類,用於資料存放區。

 

  

/// <summary>
/// 業務資料配置類
/// 請勿直接new這個對象,使用SmartConfigService.Get 方法擷取對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <remarks>2014-08-20 ywb 建立</remarks>
public class Smart<T>
{
/// <summary>
/// 請勿直接new這個對象,使用SmartConfigService.Get 方法擷取對象
/// </summary>
/// <param name="typeIdentity"></param>
/// <param name="timestamp"></param>
/// <param name="config"></param>
public Smart(string typeIdentity, string timestamp, T config)
{
this.Timestamp = timestamp;
this.Type = typeof(T).Name.Replace("C_", "");
this.TypeIdentify = typeIdentity;
this.Config = config;
}
/// <summary>
/// 業務資料類型
/// </summary>
public string Type { get; private set; }
/// <summary>
/// 業務資料標識
/// </summary>
public string TypeIdentify { get; private set; }
/// <summary>
/// 時間戳記
/// </summary>
public string Timestamp { get; private set; }
/// <summary>
/// 配置
/// </summary>
public T Config { get; private set; }
}

業務資料配置類

 

 

/// <summary>
/// 菜 配置
/// </summary>
/// <remarks>
/// 約定命名規則為 首碼“C_ ”+ “業務表名”
/// 這種方式不太符合規範但是好用,配合VS智能提示寫代碼方便
/// </remarks>
public class C_Dish
{
public C_Dish()
{
//在建構函式中設定配置項的預設值
NeedCooking = true;
EnabledPrint = true;
Return = false;
AllowToCart = true;
}
/// <summary>
/// 需要廚師烹飪
/// </summary>
[Description("需要廚師烹飪")]
public bool NeedCooking { get; set; }
/// <summary>
/// 狀態為“完成”時可退
/// </summary>
[Description("狀態“完成”時能退")]
public bool Return { get; set; }

/// <summary>
/// 啟用列印
/// </summary>
[Description("啟用列印")]
public bool EnabledPrint { get; set; }

/// <summary>
/// 允許顧客點餐
/// </summary>
[Description("允許顧客點餐")]
public bool AllowToCart { get; set; }

}

這是具體業務擁有的配置,在建構函式中設定業務資料配置項的預設值

 

 

/// <summary>
/// 配置Service
/// </summary>
public static class SmartConfigService
{
/// <summary>
/// 更新 SySmartConfig
/// 如果返回false 很可能是並發引起的,需要業務終止執行。
/// </summary>
/// <param name="type">業務類型</param>
/// <param name="typeIdentity">業務類型標識</param>
/// <param name="config">配置</param>
/// <param name="timestamp">更新前的時間戳記</param>
/// <param name="newTimestamp">更新後的時間戳記</param>
/// <returns></returns>
public static bool Update(string type, string typeIdentity, string config, string timestamp, string newTimestamp)
{

var flag = DB.Wdd.Database.ExecuteSqlCommand("update SmartConfigs set Config={0},Timestamp={1} where Type={2} and TypeIdentity={3} and Timestamp={4}"
, config, newTimestamp, type, typeIdentity, timestamp) == 1;
CacheMemory.Remove(string.Format(CacheKey.Domain_SmartConfig, type, typeIdentity));
return flag;

}
/// <summary>
/// 擷取 SySmartConfig 如果資料庫中沒有,則建立並返回SySmartConfig
/// </summary>
/// <param name="type">業務類型</param>
/// <param name="typeIdentity">業務類型標識</param>
/// <param name="timestamp">時間戳記</param>
/// <returns></returns>
public static SmartConfig Get(string type, string typeIdentity, string timestamp)
{
var cacheKey = string.Format(CacheKey.Domain_SmartConfig, type, typeIdentity);
return CacheMemory.Get<SmartConfig>(cacheKey, () =>
{
var config = DB.Wdd.SmartConfigs.FirstOrDefault(p => p.Type == type && p.TypeIdentity == typeIdentity);
if (config != null) return config;

config = new SmartConfig()
{
Config = string.Empty,
Timestamp = timestamp,
Type = type,
TypeIdentity = typeIdentity
};
DB.Wdd.AddEntity<SmartConfig>(config);
return config;
}, new TimeSpan(24, 0, 0));
}

/// <summary>
/// 儲存 業務資料配置
/// 如果返回false 很可能是並發引起的,需要業務終止執行。
/// </summary>
/// <param name="smart">業務資料配置.</param>
public static bool Save<T>(Smart<T> smart)
{
if (smart == null) throw new ArgumentNullException("smart");
return Update(smart.Type, smart.TypeIdentify, Newtonsoft.Json.JsonConvert.SerializeObject(smart.Config), smart.Timestamp, Timestamp(DateTime.Now));
}

/// <summary>
/// 擷取 業務資料配置
/// </summary>
/// <param name="typeIdentity">業務類型標識.</param>
public static Smart<T> Get<T>(string typeIdentity)
{
var type = typeof(T).Name.Replace("C_", "");
var smartConfig = Get(type, typeIdentity, Timestamp(DateTime.Now));
if (string.IsNullOrEmpty(smartConfig.Config)) smartConfig.Config = "{}";

//轉換出錯異常不處理
var config = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(smartConfig.Config);
return new Smart<T>(typeIdentity, smartConfig.Timestamp, config);
}

/// <summary>
/// 擷取時間戳記.
/// </summary>
/// <param name="dt">時間.</param>
/// <returns></returns>
private static string Timestamp(DateTime dt)
{
DateTime dt1 = new DateTime(1970, 1, 1);
TimeSpan ts = dt - dt1;
return ts.TotalMilliseconds.ToString();
}
}

這是介面層代碼實現,開發人員只需要關心以下二個方法

public static bool Save<T>(Smart<T> smart)

public static Smart<T> Get<T>(string typeIdentity)

其它方法不需要關心,可改為private。

調用代碼如下:

            var dish = SmartConfigService.Get<C_Dish>("1");            dish.Config.NeedCooking = true;            SmartConfigService.Save(dish);

儲存的時候可以判斷一下傳回值如果為false,可能是因為並發,應結束業務處理

複雜業務簡單化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.