net 技術研討(linq與架構開發)
TRANSCRIPT
談架構設計 與LINQ 簡介、緣起講師:吳俊毅 Gelis WuEmail: [email protected] : [email protected] : http://www.dotblogs.com.tw/gelis/專長: .NET 相關 Solution 、 Web 應用、分散式應用程式設計、 Architecture Design
課程大綱
什麼是架構設計、概念是什麼?誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?如何去看別人寫的 Code ?重構與架構有什麼關係?程式碼架構 VS 分層的架構何謂 架構設計 與 Design Pattern ,兩者差異在哪?分別要解決什麼問題?LINQ 簡介、緣起
什麼是架構設計、概念是什麼?
什麼是架構設計、概念是什麼?
架構的定義無外乎是系統設計中重要的一環,程式設計師需要懂架構設計嗎?其實不見得。
• 架構往往寫在 SD 的心中, PG 只需要按表操課,按圖施工即可。
• 東西做得出來就可以了 ( 不要發生錯誤 ) ( 做出來東西是客戶要的 )
這很重要
但程式設計師落若是懂一些架構設計,在開發絕對是有許
多好處的!
誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?
誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?
看起來, PG 不了解架構依然也可以活得很好,但是如果程式碼越寫越多,客戶的需求一直不斷的變動,除了開發新的功能之外,我還要能夠方便快速的 Maintain 舊有已經寫好的程式碼,這個時候你就必須思考一種我可以快速、好維護、修改不至於牽動全身的一種開發的方法,這就是架構設計的開端。
PS: 其實架構是一種思考模式
如何去看別人寫的 Code ?重構與架構有什麼關係?
ASP.NET 時代的義大利麵式寫法 (1)每一頁都有
Session 的判斷,沒有重構
到處都有 Alert 的JavaScript 敘述,訊
息沒有模組化
ASP.NET 時代的義大利麵式寫法 (2)
SQL 敘述與SqlConnection 、 SqlCommand 等全部都寫
在網頁上
ASP.NET 時代的義大利麵式寫法 (3)
使用 Literal 控制項輸出 JavaScript
重構的概念
所謂的重構,即是將程式碼結構化,去除重複的程式碼。有些人會說:我寫程式不寫重複的程式碼,這即為程式碼重構的基本概念。概念比較強的 PG 通常在撰寫程式時,隨時都已重構的思維在撰寫程式。
private void Page_Load(System.Object sender, System.EventArgs e){
if (!IsPostBack) {RoleFunProperty role = null;if (ViewState["RoleFunProperty"] == null){
RoleFunProperty rfP = new RoleFunProperty();DataTable dtPermission = sqlDt(Sql);DataRow dr = null;foreach (DataRow dr_loopVariable in dtPermission.Rows) {
dr = dr_loopVariable; rfP.RF_FunQuery = (dr["RF_FunQuery"] == DBNull.Value ? false : bool.Parse(dr["RF_FunQuery"].ToString())); rfP.RF_FunAdd = (dr["RF_FunAdd"] == DBNull.Value ? false : bool.Parse(dr["RF_FunAdd"].ToString())); rfP.RF_FunUpdate = (dr["RF_FunUpdate"] == DBNull.Value ? false : bool.Parse(dr["RF_FunUpdate"].ToString()));
rfP.RF_FunDel = (dr["RF_FunDel"] == DBNull.Value ? false : bool.Parse(dr["RF_FunDel"].ToString()));
rfP.RF_FunPrint = (dr["RF_FunPrint"] == DBNull.Value ? false : bool.Parse(dr["RF_FunPrint"].ToString()));
}}
else rfP = (RoleFunProperty)ViewState["RoleFunProperty"]; if (! rfP .RF_FunAdd) { btnAdd.Enabled = false; btnAdd.ToolTip = " 目前使用者無新增權限 "; }
}}
重構第一式
應該將 RoleFunProperty 寫成一個方法。protected RoleFunProperty GetFuncPermission(){
string UR_RMRoleID = Session["UR_RMRoleID"].ToString();string id = MenuID;string Sql = "select * from RoleFun RF " + "where RF.RF_RMRoleId='" + UR_RMRoleID + "' " + "AND
RF.RF_MCId=" + id;if (id == null | string.IsNullOrEmpty(id)) {return null;
}RoleFunProperty rfP = new RoleFunProperty();DataTable dtPermission = sqlDt(Sql);
DataRow dr = null;foreach (DataRow dr_loopVariable in dtPermission.Rows) {
dr = dr_loopVariable; rfP.RF_FunQuery = (dr["RF_FunQuery"] == DBNull.Value ? false : bool.Parse(dr["RF_FunQuery"].ToString())); rfP.RF_FunAdd = (dr["RF_FunAdd"] == DBNull.Value ? false : bool.Parse(dr["RF_FunAdd"].ToString()));
rfP.RF_FunUpdate = (dr["RF_FunUpdate"] == DBNull.Value ? false : bool.Parse(dr["RF_FunUpdate"].ToString())); rfP.RF_FunDel = (dr["RF_FunDel"] == DBNull.Value ? false : bool.Parse(dr["RF_FunDel"].ToString()));
rfP.RF_FunPrint = (dr["RF_FunPrint"] == DBNull.Value ? false : bool.Parse(dr["RF_FunPrint"].ToString())); }
return rfP;}
重構第二式
將取得 新增 按鈕權限的程式獨立出來,以讓所有頁面共用呼叫。
protected bool GetAddButtonSecurity() { RoleFunProperty role =null;
if (ViewState["RoleFunProperty"] == null) role = GetFuncPermission(); else role = (RoleFunProperty)ViewState["RoleFunProperty"]; return role.RF_FunAdd; }
重構第三式
但是頁面有 新增、修改、刪除 等按鈕,總不能每次都判斷一次ViewState["RoleFunProperty"]因此應該切出一個GetAndKeepFuncPermission() 方法
protected RoleFunProperty GetAndKeepFuncPermission() { RoleFunProperty role = null; if (ViewState["RoleFunProperty"] == null) role = GetFuncPermission(); else role = (RoleFunProperty)ViewState["RoleFunProperty"];
return role; }
重構第四式
此時各個按鈕權限的取得變成如下:/// <summary> /// 取得新增按鈕權限 /// </summary> /// <returns></returns> protected bool GetAddButtonSecurity() { RoleFunProperty role = GetAndKeepFuncPermission(); return role.RF_FunAdd; } /// <summary> /// 取得修改按鈕權限 /// </summary> /// <returns></returns> protected bool GetUpdateButtonSecurity() { RoleFunProperty role = GetAndKeepFuncPermission(); return role.RF_FunUpdate; } /// <summary> /// 取得刪除按鈕權限 /// </summary> /// <returns></returns> protected bool GetDelButtonSecurity() { RoleFunProperty role = GetAndKeepFuncPermission(); return role.RF_FunDel; }
程式碼較為乾淨,達到共用的目的!
程式碼架構 VS 分層的架構
程式碼的分層
如: ASP.NET MVC 的 Controller, Model (Business/Data Access Layer)
跨機器的分層
何謂 架構設計 與 Design Pattern ,兩者差異在哪?分別要解決什麼問題?
架構設計 vs Design Pattern
所謂的 Design Pattern 中文譯為設計模式,他是種程式碼設計思維,通常用以解決一些程式碼設計時常見的一些像是易懂、易維護、易修改、耦合度低等等議題。
要解決的問題 ( 大/小 ) 不同
關注的點不同
那究竟與『架構設計』有什麼不同?
Creational 模式
如何有效率的產 生、管理 與操作物件,一直都是值得討論的課題, Creational 模式即與物件的建立相關,在這個分類下的模式給出了一些指導原則及設計的方向。常見的如:
• Simple Factory 模式 • Abstract Factory 模式 • Factory Method 模式 • Builder 模式 • Prototype 模式 • Singleton 模式 • Registry of Singleton 模式
Structural 模式
如何設計物件之間 的靜態結構,如何完成物件之間的繼承、實 現與依賴關係,這關乎著系統設計出來是否健壯。常見的如:
• Default Adapter 模式 • Adapter 模式 - Object Adapter • Adapter 模式 - Class Adapter • Bridge 模式 • Composite 模式 • Decorator 模式 • Facade 模式 • Proxy 模式
Behavioral 模式
物件之間的合作行 為構成了程式最終的行為,物件之間若有設 計良好的行為互動,不僅使得程式執行時更有效率,更可以讓物件的職責更為清晰、整個程式的動態結構(像是物件調度)更有彈性。常見的如: • Command 模式
• Iterator 模式 • Strategy 模式 • Template Method 模式 • Observer 模式 • Mediator 模式 • State 模式 • Visitor 模式 • Interpreter 模式
多執行緒模式
在很多應用中都會使用多執行緒。常用的如:
• Guarded Suspension 模式
• Worker Thread 模式• Thread Pool 模式• …
架構設計 vs Design Pattern
因此,所謂的架構設計則談得更廣,不像 Design Pattern 只關注某一塊程式碼的設計,架構設計則比較需要全面性的思考,不光是程式碼架構、分層,開發架構的分層、跨機器的分層,舉凡效能議題、 Ap Server 所使用的通訊協定、Ap Server 架構規劃、網路規劃、資料庫系統規劃,甚至作業系統、檔案系統,都在架構設計範疇內。
由於架構議題太廣,本篇只談程式碼開發架構、程式碼分層等議題。
LINQ 簡介、緣起
LINQ 簡介、緣起
LINQ 的發展與簡介LINQ 包含的技術
LINQ 的發展與簡介
LINQ 是 (Language Integrated Query) 的縮寫最早出現於 .NET 3.0提供物件的查詢語言,資料來源可以多樣化,不見得是存取資料庫一致的 (資料/物件 )查詢只要 Provider 提供,不管後端資料為何 (XML 、 JSON 、檔案系統、 WMI 、 LOG 、 RMDB) 等等…
LINQ 包含的技術 (1)
所有的 LINQ 查詢作業都包含三個不同的動作
1. 取得資料來源。2. 建立查詢。3. 執行查詢。
在 LINQ 中,查詢的執行與查詢本身不同;也就是說,只建立查詢變數並不能擷取任何資料。
LINQ 包含的技術 (2)-技術架構
LINQ 範例
所有的 LINQ 查詢回傳的都是支援 IQueryable 介面型態的物件。
Result 物件即為 IQueryable 物件
上程式可得到的結果如左邊
Connect. Share. Discussshttp://www.microsoft.com/taiwan/techdays2012/
Microsoft Certification & Training Resources
http://www.microsoft.com/learning/zh/tw/
Resources for IT Professionalshttp://social.technet.microsoft.com/Forums/zh-tw/categories/
Resources for Developershttp://social.msdn.microsoft.com/Forums/zh-tw/categories/
Resources
Connect. Share. Discussshttp://www.microsoft.com/taiwan/techdays2012/
Microsoft Certification & Training Resources
http://www.microsoft.com/learning/zh/tw/
Resources for IT Professionalshttp://social.technet.microsoft.com/Forums/zh-tw/categories/
Resources for Developershttp://social.msdn.microsoft.com/Forums/zh-tw/categories/
Resources
Q & A