六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

一次重構(gòu)導(dǎo)向設(shè)計(jì)模式的實(shí)戰(zhàn)(.NET)

[摘要]代碼僅僅是說明問題,和實(shí)際的有所不同在項(xiàng)目開發(fā)過程中,有這樣的需求:定義一個(gè)查詢窗體使用DataGrid顯示列表雙擊Grid后打開指定記錄的編輯頁面,窗體類為FormSearchEntity于是這么寫了private void Grid_DoubleClick(object sender,Syst...
代碼僅僅是說明問題,和實(shí)際的有所不同
在項(xiàng)目開發(fā)過程中,有這樣的需求:定義一個(gè)查詢窗體使用DataGrid顯示列表
雙擊Grid后打開指定記錄的編輯頁面,窗體類為FormSearchEntity于是這么寫了
private void Grid_DoubleClick(object sender,System.EventArgs e)
{
string entityID = 雙擊記錄的ID字段值; //這個(gè)有固定的辦法
FormEntity frmEntity = new FormEntity(entityID);
........
frmEntity.Show();
}
其中的FormEntity就是對業(yè)務(wù)實(shí)體的編輯界面,在構(gòu)造函數(shù)中傳入一個(gè)ID,然后
加載該記錄的相關(guān)數(shù)據(jù),在這里不作重點(diǎn)解釋。

接下來有要在查詢界面上添加一個(gè)按鈕“Go”,執(zhí)行的動作和Grid雙擊是一樣的,就是
在Grid中選中記錄,點(diǎn)擊Go打開實(shí)體的操作界面。

這樣,就使用重構(gòu)中的Extract Method手法:
private void Grid_DoubleClick(object sender,System.EventArgs e)
{
string entityID = 雙擊記錄的ID字段值;
OpenEntityForm(entityID);

}
private void btnGo_Click(object sender,System.EventArgs e )
{
string entityID = 雙擊記錄的ID字段值;
OpenEntityForm(entityID);
}
private void OpenEntityForm(string entityID)
{
FormEntity frmEntity = new FormEntity(entityID);
........
frmEntity.Show();
}

到現(xiàn)在看來,這樣作有什么用呢?直接在Go的Click時(shí)間中調(diào)用Grid的DoubleClick不就行了嗎?事實(shí)上Extract Method不僅僅是防止重復(fù)代碼
同時(shí)也可以提高代碼的可重用性,作用在下面會看到。

現(xiàn)在,又要對另一個(gè)的表進(jìn)行同樣的操作,那就再定義一個(gè)窗體,把上面的代碼改改就成了,但是就出現(xiàn)了重復(fù)代碼,這是不好的味道。那么這樣作:把OpenEntityForm方法改為Virtual,同時(shí)聲明為Protected,里面的代碼都去掉
protected void OpenEntityForm(string entityID)
{

}
把窗體更名為FormSearchEntityBase再重新寫一個(gè)類FormSearchEntityA來繼承FormSearchEntityBase,override父類的OpenEntityForm方法

protected override void OpenEntityForm(string entityID)
{
FormEntityA frmEntityA = new FormEntityA(entityID);
........
frmEntityA.Show();
}

實(shí)體B的查詢界面也一樣FormSearchEntityB繼承自FormSearchEntityBase,override父類的OpenEntityForm方法
protected override void OpenEntityForm(string entityID)
{
FormEntityB frmEntityB = new FormEntityB(entityID);
........
frmEntityB.Show();
}
這樣,如果后面還有相同的需求,就從FormSearchEntityBase繼承一個(gè)類,override父類的OpenEntityForm方法就可以了

現(xiàn)在,來看看TemplateMethod模式
意圖:
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。
適用性:
一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)。
各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)
控制子類擴(kuò)展

例子代碼:
namespace TemplateMethod_DesignPattern
{
using System;

class Algorithm
{
public void DoAlgorithm()
{
Console.WriteLine("In DoAlgorithm");

// do some part of the algorithm here

// step1 goes here
Console.WriteLine("In Algorithm - DoAlgoStep1");
// . . .

// step 2 goes here
Console.WriteLine("In Algorithm - DoAlgoStep2");
// . . .

// Now call configurable/replacable part
DoAlgoStep3();

// step 4 goes here
Console.WriteLine("In Algorithm - DoAlgoStep4");
// . . .

// Now call next configurable part
DoAlgoStep5();
}

virtual public void DoAlgoStep3()
{
Console.WriteLine("In Algorithm - DoAlgoStep3");
}

virtual public void DoAlgoStep5()
{
Console.WriteLine("In Algorithm - DoAlgoStep5");
}
}

class CustomAlgorithm : Algorithm
{
public override void DoAlgoStep3()
{
Console.WriteLine("In CustomAlgorithm - DoAlgoStep3");
}

public override void DoAlgoStep5()
{
Console.WriteLine("In CustomAlgorithm - DoAlgoStep5");
}
}

/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
CustomAlgorithm c = new CustomAlgorithm();

c.DoAlgorithm();

return 0;
}
}
}


再來對比下上面對窗體類進(jìn)行改動的代碼和TemplateMethod的例子代碼,這就是一個(gè)TemplateMethod模式了

有一種觀點(diǎn)說在設(shè)計(jì)期使用設(shè)計(jì)模式常會導(dǎo)致過渡設(shè)計(jì),目前的敏捷方法和重構(gòu)都漸漸提倡代碼演化和重構(gòu)達(dá)到設(shè)計(jì)模式。
我也是在寫完代碼后才發(fā)現(xiàn)這已經(jīng)是一個(gè)模式了。



主站蜘蛛池模板: 日本国产一区 | 香蕉久久a毛片 | 三级精品视频在线播放 | 四虎www免费人成 | 欧美亚洲激情在线 | 亚洲婷婷综合网 | 亚洲一区免费看 | 午夜天堂在线视频 | 日本天堂网在线观看 | 日韩大片免费看 | 丝袜 欧美 视频 首页 在线 | 色噜噜狠狠网站 | 中文字幕亚洲无线码在一区 | 四虎精品福利视频精品 | 欧美在线视频免费播放 | 日韩精品国产自在欧美 | 欧美亚洲国产另类 | 色综合久久夜色精品国产 | 伊人久久大香线蕉观看 | 日韩欧美网站 | 亚洲成a人v欧美综合天堂软件 | 亚洲专区区免费 | 日韩 欧美 综合 在线 制服 | 日本欧美一区二区三区片 | 在线观看h视频播放高清 | 亚洲六月丁香六月婷婷蜜芽 | 青青在线精品2022国产 | 亚洲欧美一 | 日韩精品小视频 | 全免费午夜一级毛片一级毛 | 天天干国产 | 欧美性视频在线播放黑人 | 中文字幕在线看视频一区二区三区 | 天使萌一区二区三区免费观看 | 亚洲国产高清在线精品一区 | 日本黄色免费网址 | 亚洲综合偷自成人网第页色 | 欧美在线日韩在线 | 日韩精品福利视频一区二区三区 | 婷婷色吧| 色综合久久久久久久久久久 |