在上一篇中:https://www.cnblogs.com/kevin-Y/p/17792071.html
我們將程序組成爲三個主要對象:字段、查詢範圍、行爲控制器。
字段、查詢範圍都是數據,都分別對應一個類,有各自屬性,並能保存和讀取
行爲控制器則是一個接口,有N種實現類,每一種類型的字段就有一種實現類
public interface IFieldController { /// <summary> /// 處理的字段類型 /// </summary> string HandleType { get; } /// <summary> /// 獲取查詢範圍編輯器 /// </summary> /// <param name="field"></param> /// <param name="condition"></param> /// <returns></returns> Control BuildFieldEditor(FieldItem field, string condition); /// <summary> /// 讀取查詢範圍 /// </summary> /// <param name="ctrol"></param> /// <returns></returns> ConditionItem ReadCondition(Control ctrol); /// <summary> /// 生成where條件 /// </summary> /// <param name="build"></param> /// <param name="field"></param> /// <param name="condition"></param> void BuildWhere(SqlBuilder build, FieldItem field, string condition); }
在我們劃分好主要對象後,上面方法及其基本上可以確定下來。爲什麼這麼說呢?如果我不能確定該如何做呢?我以這個例子說明我們以何爲依據。
1。主程序不需要清楚有多少種類型的字段,只需要工廠方法告訴其控制類是誰
2。所有與類型有關的東西,主程序也不會理會,所以接口出入參只會是主程序知道的某一些基類或接口。
如BuildFieldEditor方法的入參condition,使用了基本的字符串作爲所有查詢範圍的描述載體。顯示的界面需要自己解釋這個文本再給界面各個控件賦值。
爲什麼使用string,而不使用object呢?主要是確保能讓主程序保存到本地文件中。
3。方法入參不會一下子就能明確下來的。可能需要完成第一個、二個控制器才能基本確定。
如BuildWhere方法的入參SqlBuilder build,一開始我想使用一個StringBuilder就行了。但做完第一個Int類型的控制器、準備做第二個String類型時,
發現幾乎所有代碼都一樣。於是將這些代碼組織了一個工具類SqlBuilder。大家可以將入參調整爲StringBuilder試試。
4。類似功能、或相關功能應放在一個類中。如讀、寫應該在一個類;序列化和反序列化也應該在一個類。
5。在上線前要勇於調整方案,力求代碼精減、職責清晰(重點:如果不知道對面對象的單一職責原則,請搜索學習一下)
本文只發布在博客園,未經同意請勿轉載!