net 技術研討(linq與架構開發)

34
談談談談談 LINQ 談談 談談 講講 講講講 Gelis Wu Email: [email protected] Skype [email protected] Blog http://www.dotblogs.com.tw/gel is/ 講講.NET 講講 Solution Web 講講講講講講講講講講講Architecture Design

Upload: gelis-wu

Post on 10-May-2015

257 views

Category:

Business


6 download

TRANSCRIPT

Page 1: Net 技術研討(linq與架構開發)

談架構設計 與LINQ 簡介、緣起講師:吳俊毅 Gelis WuEmail: [email protected][email protected] : http://www.dotblogs.com.tw/gelis/專長: .NET 相關 Solution 、 Web 應用、分散式應用程式設計、 Architecture Design

Page 2: Net 技術研討(linq與架構開發)

課程大綱

什麼是架構設計、概念是什麼?誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?如何去看別人寫的 Code ?重構與架構有什麼關係?程式碼架構 VS 分層的架構何謂 架構設計 與 Design Pattern ,兩者差異在哪?分別要解決什麼問題?LINQ 簡介、緣起

Page 3: Net 技術研討(linq與架構開發)

什麼是架構設計、概念是什麼?

Page 4: Net 技術研討(linq與架構開發)

什麼是架構設計、概念是什麼?

架構的定義無外乎是系統設計中重要的一環,程式設計師需要懂架構設計嗎?其實不見得。

• 架構往往寫在 SD 的心中, PG 只需要按表操課,按圖施工即可。

• 東西做得出來就可以了 ( 不要發生錯誤 ) ( 做出來東西是客戶要的 )

這很重要

但程式設計師落若是懂一些架構設計,在開發絕對是有許

多好處的!

Page 5: Net 技術研討(linq與架構開發)

誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?

Page 6: Net 技術研討(linq與架構開發)

誰需要會架構設計?什麼時候需要了解架構設計?有這個概念對我在開發上有什麼好處?

看起來, PG 不了解架構依然也可以活得很好,但是如果程式碼越寫越多,客戶的需求一直不斷的變動,除了開發新的功能之外,我還要能夠方便快速的 Maintain 舊有已經寫好的程式碼,這個時候你就必須思考一種我可以快速、好維護、修改不至於牽動全身的一種開發的方法,這就是架構設計的開端。

PS: 其實架構是一種思考模式

Page 7: Net 技術研討(linq與架構開發)

如何去看別人寫的 Code ?重構與架構有什麼關係?

Page 8: Net 技術研討(linq與架構開發)

ASP.NET 時代的義大利麵式寫法 (1)每一頁都有

Session 的判斷,沒有重構

到處都有 Alert 的JavaScript 敘述,訊

息沒有模組化

Page 9: Net 技術研討(linq與架構開發)

ASP.NET 時代的義大利麵式寫法 (2)

SQL 敘述與SqlConnection 、 SqlCommand 等全部都寫

在網頁上

Page 10: Net 技術研討(linq與架構開發)

ASP.NET 時代的義大利麵式寫法 (3)

使用 Literal 控制項輸出 JavaScript

Page 11: Net 技術研討(linq與架構開發)

重構的概念

所謂的重構,即是將程式碼結構化,去除重複的程式碼。有些人會說:我寫程式不寫重複的程式碼,這即為程式碼重構的基本概念。概念比較強的 PG 通常在撰寫程式時,隨時都已重構的思維在撰寫程式。

Page 12: Net 技術研討(linq與架構開發)

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 = " 目前使用者無新增權限 "; }

}}

Page 13: Net 技術研討(linq與架構開發)

重構第一式

應該將 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;}

Page 14: Net 技術研討(linq與架構開發)

重構第二式

將取得 新增 按鈕權限的程式獨立出來,以讓所有頁面共用呼叫。

protected bool GetAddButtonSecurity() { RoleFunProperty role =null;

if (ViewState["RoleFunProperty"] == null) role = GetFuncPermission(); else role = (RoleFunProperty)ViewState["RoleFunProperty"]; return role.RF_FunAdd; }

Page 15: Net 技術研討(linq與架構開發)

重構第三式

但是頁面有 新增、修改、刪除 等按鈕,總不能每次都判斷一次ViewState["RoleFunProperty"]因此應該切出一個GetAndKeepFuncPermission() 方法

protected RoleFunProperty GetAndKeepFuncPermission() { RoleFunProperty role = null; if (ViewState["RoleFunProperty"] == null) role = GetFuncPermission(); else role = (RoleFunProperty)ViewState["RoleFunProperty"];

return role; }

Page 16: Net 技術研討(linq與架構開發)

重構第四式

此時各個按鈕權限的取得變成如下:/// <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; }

程式碼較為乾淨,達到共用的目的!

Page 17: Net 技術研討(linq與架構開發)

程式碼架構 VS 分層的架構

Page 18: Net 技術研討(linq與架構開發)

程式碼的分層

如: ASP.NET MVC 的 Controller, Model (Business/Data Access Layer)

Page 19: Net 技術研討(linq與架構開發)

跨機器的分層

Page 20: Net 技術研討(linq與架構開發)

何謂 架構設計 與 Design Pattern ,兩者差異在哪?分別要解決什麼問題?

Page 21: Net 技術研討(linq與架構開發)

架構設計 vs Design Pattern

所謂的 Design Pattern 中文譯為設計模式,他是種程式碼設計思維,通常用以解決一些程式碼設計時常見的一些像是易懂、易維護、易修改、耦合度低等等議題。

要解決的問題 ( 大/小 ) 不同

關注的點不同

那究竟與『架構設計』有什麼不同?

Page 22: Net 技術研討(linq與架構開發)

Creational 模式

如何有效率的產 生、管理 與操作物件,一直都是值得討論的課題, Creational 模式即與物件的建立相關,在這個分類下的模式給出了一些指導原則及設計的方向。常見的如:

• Simple Factory 模式 • Abstract Factory 模式 • Factory Method 模式 • Builder 模式 • Prototype 模式 • Singleton 模式 • Registry of Singleton 模式

Page 23: Net 技術研討(linq與架構開發)

Structural 模式

如何設計物件之間 的靜態結構,如何完成物件之間的繼承、實 現與依賴關係,這關乎著系統設計出來是否健壯。常見的如:

• Default Adapter 模式 • Adapter 模式 - Object Adapter • Adapter 模式 - Class Adapter • Bridge 模式 • Composite 模式 • Decorator 模式 • Facade 模式 • Proxy 模式

Page 24: Net 技術研討(linq與架構開發)

Behavioral 模式

物件之間的合作行 為構成了程式最終的行為,物件之間若有設 計良好的行為互動,不僅使得程式執行時更有效率,更可以讓物件的職責更為清晰、整個程式的動態結構(像是物件調度)更有彈性。常見的如: • Command 模式

• Iterator 模式 • Strategy 模式 • Template Method 模式 • Observer 模式 • Mediator 模式 • State 模式 • Visitor 模式 • Interpreter 模式

Page 25: Net 技術研討(linq與架構開發)

多執行緒模式

在很多應用中都會使用多執行緒。常用的如:

• Guarded Suspension 模式

• Worker Thread 模式• Thread Pool 模式• …

Page 26: Net 技術研討(linq與架構開發)

架構設計 vs Design Pattern

因此,所謂的架構設計則談得更廣,不像 Design Pattern 只關注某一塊程式碼的設計,架構設計則比較需要全面性的思考,不光是程式碼架構、分層,開發架構的分層、跨機器的分層,舉凡效能議題、 Ap Server 所使用的通訊協定、Ap Server 架構規劃、網路規劃、資料庫系統規劃,甚至作業系統、檔案系統,都在架構設計範疇內。

由於架構議題太廣,本篇只談程式碼開發架構、程式碼分層等議題。

Page 27: Net 技術研討(linq與架構開發)

LINQ 簡介、緣起

Page 28: Net 技術研討(linq與架構開發)

LINQ 簡介、緣起

LINQ 的發展與簡介LINQ 包含的技術

Page 29: Net 技術研討(linq與架構開發)

LINQ 的發展與簡介

LINQ 是 (Language Integrated Query) 的縮寫最早出現於 .NET 3.0提供物件的查詢語言,資料來源可以多樣化,不見得是存取資料庫一致的 (資料/物件 )查詢只要 Provider 提供,不管後端資料為何 (XML 、 JSON 、檔案系統、 WMI 、 LOG 、 RMDB) 等等…

Page 30: Net 技術研討(linq與架構開發)

LINQ 包含的技術 (1)

所有的 LINQ 查詢作業都包含三個不同的動作

1. 取得資料來源。2. 建立查詢。3. 執行查詢。

在 LINQ 中,查詢的執行與查詢本身不同;也就是說,只建立查詢變數並不能擷取任何資料。

Page 31: Net 技術研討(linq與架構開發)

LINQ 包含的技術 (2)-技術架構

Page 32: Net 技術研討(linq與架構開發)

LINQ 範例

所有的 LINQ 查詢回傳的都是支援 IQueryable 介面型態的物件。

Result 物件即為 IQueryable 物件

上程式可得到的結果如左邊

Page 33: Net 技術研討(linq與架構開發)

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

Page 34: Net 技術研討(linq與架構開發)

Q & A