需求:通過使用不同模塊號(MODULE)和功能號(FUNC)及資料生成不同的資料包
現有代碼如下:
namespace Builder
{
/*
* 需求:通過使用不同模塊號(MODULE)和功能號(FUNC)及資料
* 生成不同的資料包
*/
/// <summary>
/// 模塊號
/// </summary>
public enum MODULE { MODULE1, MODULE2, MODULE3, MODULE4 }
/// <summary>
/// 功能號
/// </summary>
public enum FUNCTION { FUNC1, FUNC2, FUNC3, FUNC4 }
/// <summary>
/// 生成器介面
/// </summary>
public interface IBuilder
{
Object Generate();
}
/// <summary>
/// 資料生成器
/// </summary>
public abstract class DataBuilder : IBuilder
{
protected MODULE M = MODULE.MODULE1;
protected FUNCTION F = FUNCTION.FUNC1;
protected string Datas = string.Empty;
public DataBuilder(MODULE m, FUNCTION f, string datas)
{
M = m;
F = f;
Datas = datas;
}
/// <summary>
/// 構建 -- 抽象成員函式
/// </summary>
/// <returns></returns>
protected abstract Object Build();
#region IBuilder 成員
public object Generate()
{
return this.Build();
}
#endregion
}
// MOUDLE1 生成器
namespace MODULE1
{
/// <summary>
/// FUNCTION1 生成器
/// </summary>
public class DataBuilder1 : DataBuilder
{
public DataBuilder1(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
/// <summary>
/// FUNCTION2 生成器
/// </summary>
public class DataBuilder2 : DataBuilder
{
public DataBuilder2(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
public class DataBuilder3 : DataBuilder
{
public DataBuilder3(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
public class DataBuilder4 : DataBuilder
{
public DataBuilder4(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
}
// MODULE2 生成器
namespace MODULE2
{
public class DataBuilder1 : DataBuilder
{
public DataBuilder1(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
public class DataBuilder2 : DataBuilder
{
public DataBuilder2(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
public class DataBuilder3 : DataBuilder
{
public DataBuilder3(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
public class DataBuilder4 : DataBuilder
{
public DataBuilder4(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
}
namespace MODULE3
{
.....
.....
.....
.....
}
namespace MODULE4
{
.....
.....
.....
.....
}
/// <summary>
/// 生成器背景關系
/// </summary>
public static class BuilderContext
{
private static IBuilder GetBuilder(MODULE m, FUNCTION f, string datas)
{
IBuilder builder = null;
switch (m)
{
case MODULE.MODULE1:
switch (f)
{
case FUNCTION.FUNC1:
builder = new MODULE1.DataBuilder1(m, f, datas);
break;
case FUNCTION.FUNC2:
builder = new MODULE1.DataBuilder2(m, f, datas);
break;
case FUNCTION.FUNC3:
builder = new MODULE1.DataBuilder3(m, f, datas);
break;
case FUNCTION.FUNC4:
builder = new MODULE1.DataBuilder4(m, f, datas);
break;
default:
break;
}
break;
case MODULE.MODULE2:
switch (f)
{
case FUNCTION.FUNC1:
builder = new MODULE2.DataBuilder1(m, f, datas);
break;
case FUNCTION.FUNC2:
builder = new MODULE2.DataBuilder2(m, f, datas);
break;
case FUNCTION.FUNC3:
builder = new MODULE2.DataBuilder3(m, f, datas);
break;
case FUNCTION.FUNC4:
builder = new MODULE2.DataBuilder4(m, f, datas);
break;
default:
break;
}
break;
case MODULE.MODULE3:
.......
.......
.......
break;
case MODULE.MODULE4:
.......
.......
.......
break;
default:
break;
}
return builder;
}
public static object GetBuildData(MODULE m, FUNCTION f, string datas)
{
IBuilder builder = GetBuilder(m, f, datas);
if (null != builder)
{
return builder.Generate();
}
return builder;
}
}
/* 呼叫示例:
class Program
{
static void Main(string[] args)
{
object datas = BuilderContext.GetBuildData(MODULE.MODULE1, FUNCTION.FUNC2, "Hello world!");
Console.WriteLine(datas);
Console.ReadKey();
}
}
*/
}
uj5u.com熱心網友回復:
連點都沒有人點啊 ,自己頂上去uj5u.com熱心網友回復:
應該是沒人能看懂你想表達什么uj5u.com熱心網友回復:
強型別你沒辦法動態生成。如果采用動態編譯的話,那呼叫方要如何呼叫呢?所以可以采用字典,索引的方式做屬性和值的對應,這樣才能實作擴展。uj5u.com熱心網友回復:
強型別你沒辦法動態生成。如果采用動態編譯的話,那呼叫方要如何呼叫呢?所以可以采用字典,索引的方式做屬性和值的對應,這樣才能實作擴展。uj5u.com熱心網友回復:
GetBuilder內部用反射uj5u.com熱心網友回復:
看起來都一樣啊return M.ToString() + " " + F.ToString() + " " + Datas;。
uj5u.com熱心網友回復:
能否通過GOF 實作類BuilderContext中 switch的精簡,BuilderContext.GetBuilder()函式 在以后模塊號或功能號增加時,擴展非常的麻煩,如果不停的增加模塊和功能,GetBuilder中的switch將會變的無比的長。。。。。uj5u.com熱心網友回復:
M、F、Datas都是變數好不??
在示例中 改變 GetBuilderData()的引數,就變了:
class Program
{
static void Main(string[] args)
{
object datas = BuilderContext.GetBuildData(MODULE.MODULE1, FUNCTION.FUNC2, "Hello world!");
Console.WriteLine(datas);
Console.ReadKey();
}
}
uj5u.com熱心網友回復:
能否給出一點指導?我的代碼已經可以運行,只要注釋掉代碼中帶...號的行就可以編譯,能否幫忙改一下?
uj5u.com熱心網友回復:
總算看懂了FUNCTION最好改一下,這樣反射更方便
public enum FUNCTION { DataBuilder1, DataBuilder2, ...}
Type t = Type.GetType(m.ToString() + "." + f.ToString());
DataBuilder builder = (DataBuilder)Activator.CreateInstance(t, m, f, datas);
uj5u.com熱心網友回復:
首先 感謝你的回復!
可能還是我沒有把意思表達明白,我在一樓所說的模塊號和功能號并不是程式代碼的模塊和功能 實際是一種基于串口通信的協議,協議類似如下:
A (幀頭)+ 模塊命令(m)+ 功能命令(f)+自定義資料域(datas)+B(幀尾)
隨著后續硬體功能的擴展,PC端的軟體也將更跟隨協議作出擴展。
uj5u.com熱心網友回復:
協議如圖:
uj5u.com熱心網友回復:
是你沒明白
按照你7樓所說,無非是想通過m,f拿到對應的DataBuilder,不是嗎?
uj5u.com熱心網友回復:
這種感覺比較符合抽象工廠模式的應用條件,樓主參考一下看看。既然每種資料包的構成方式都是一樣的,當然是將資料和構造包分別做成類,將成品的包做成字典,呼叫的時候直接通過鍵值對呼叫字典,有擴展的時候也方便。(最好是資料類做成介面,構造包類做成靜態類,少用列舉型別)uj5u.com熱心網友回復:
Atitit 提升擴展性指標與方法總結目錄
1. 擴展性常見指標 1
1.1. 代碼簡潔,應業務變動調整修改少 1
1.2. 免編譯 1
1.3. 是否支持熱部署 1
2. 常見的方法策略 2
2.1. 盡可能轉移提升語言級別到4gl 2
2.2. 語言的代際級別關系表 2
2.3. 內嵌解釋器 運算式解釋器等 2
2.4. 盡可能配置化動態化 2
2.5. Scheme less Scheme free模式 多使用弱型別結構json等 2
2.6. 對于編譯型別語言,多使用map等動態結構 2
2.7. 中間層通道化 驅動化 3
2.8. 無中心節點,避免龐大組件出現 3
3. 其他一些擴展性方法 3
4. 提升可讀性 3
4.1. 本地化 3
4.2. Dsl 自然語言化 3
4.3. 控制轉移法 比如查表法代替if else判斷 3
1.擴展性常見指標
1.1.代碼簡潔,應業務變動調整修改少
1.2.免編譯
盡可能做到業務功能變動,代碼調整,無需編譯。。避免了帶來的打包與熱部署問題
1.3.是否支持熱部署
調整代碼無需重啟服務器服務程式
2.常見的方法策略
2.1.盡可能轉移提升語言級別到4gl
語言級別越高,可讀性越高,代碼越簡潔
語言的趨勢也是趨向于免編譯,動態性,可讀性等
2.2.語言的代際級別關系表
語言代際與級別 具體常見語言 備注
5gl 自然語言等 進展很大,但還不大成熟。。
4gl Sql h5 xml
3.5g Script系列 js 等
3gl Java c#等需要編譯的語言
2.3.內嵌解釋器 運算式解釋器等
Ongl express等 js解釋器等
2.4.盡可能配置化動態化
2.5.Scheme less Scheme free模式 多使用弱型別結構json等
常見的弱型別結構還有H5 xml等
2.6.對于編譯型別語言,多使用map等動態結構
Ui收集引數可使用request的map結構。。與后端orm工具互動引數也是map 等
2.7.中間層通道化 驅動化
2.8.無中心節點,避免龐大組件出現
3. 其他一些擴展性方法
針對靜態語言,可以使用些泛型、抽象類、介面等方法
適當使用寫 設計模式
適當抽象
產品化 為“普羅大眾”去設計,而不是為“個例”設計
4.提升可讀性
4.1.本地化
4.2.Dsl 自然語言化
4.3.控制轉移法 比如查表法代替if else判斷
Atitit 專案高擴展法.docx
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/128633.html
標籤:C#
上一篇:沒有找到適合的方法來重寫
