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

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

May 10, 2015

Download

Business

Gelis Wu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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