最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小菜編程成長記(一 面試受挫——代碼無錯(cuò)就是好?)第3/3頁

 更新時(shí)間:2006年10月17日 00:00:00   作者:  

五 體會(huì)簡單工廠模式的美妙

次日,小菜再來找大鳥,問道:“你昨天說計(jì)算器這樣的小程序還可以用到面向?qū)ο笕筇匦裕坷^承和多態(tài)怎么可能用得上,我實(shí)在不可理解?!?

大鳥:“小菜很有鉆研精神嗎?好,今天我讓你功力加深一級(jí)。你先要考慮一下,你昨天寫的這個(gè)代碼,能否做到很靈活的可修改和擴(kuò)展呢?”

小菜:“我已經(jīng)把業(yè)務(wù)和界面分離了呀,這不是很靈活了嗎?”

大鳥:“那我問你,現(xiàn)在如果我希望增加一個(gè)開根(sqrt)運(yùn)算,你如何改?”

小菜:“那只需要改Operation類就行了,在switch中加一個(gè)分支就行了。”

大鳥:“問題是你要加一個(gè)平方根運(yùn)算,卻需要把加減乘除的運(yùn)算都得來參與編譯,如果你一不小心,把加法運(yùn)算改成了減法,這不是大大的糟糕。打個(gè)比方,如果現(xiàn)在公司要求你為公司的薪資管理系統(tǒng)做維護(hù),原來只有技術(shù)人員(月薪),市場(chǎng)銷售人員(底薪+提成),經(jīng)理(年薪+股份)三種運(yùn)算算法,現(xiàn)在要增加兼職工作人員的(時(shí)薪)算法,但按照你昨天的程序?qū)懛?,公司就必須要把包含有的原三種算法的運(yùn)算類給你,讓你修改,你如果心中小算盤一打,‘TMD,公司給我的工資這么低,我真是郁悶,這會(huì)有機(jī)會(huì)了',于是你除了增加了兼職算法以外,在技術(shù)人員(月薪)算法中寫了一句 
復(fù)制代碼 代碼如下:

if (員工是小菜)
{
salary = salary * 1.1;
}

那就意味著,你的月薪每月都會(huì)增加10%(小心被抓去坐牢),本來是讓你加一個(gè)功能,卻使得原有的運(yùn)行良好的功能代碼產(chǎn)生了變化,這個(gè)風(fēng)險(xiǎn)太大了。你明白了嗎?”

小菜:“哦,你的意思是,我應(yīng)該把加減乘除等運(yùn)算分離,修改其中一個(gè)不影響另外的幾個(gè),增加運(yùn)算算法也不影響其它代碼,是這樣嗎?”

大鳥:“自己想去吧,如何用繼承和多態(tài),你應(yīng)該有感覺了?!?

小菜:“OK,我馬上去寫?!?
復(fù)制代碼 代碼如下:

/// <summary>
/// 運(yùn)算類
/// </summary>
class Operation
{
private double _numberA = 0;
private double _numberB = 0;

/// <summary>
/// 數(shù)字A
/// </summary>
public double NumberA
{
get{ return _numberA; }
set{ _numberA = value;}
}

/// <summary>
/// 數(shù)字B
/// </summary>
public double NumberB
{
get{ return _numberB; }
set{ _numberB = value; }
}

/// <summary>
/// 得到運(yùn)算結(jié)果
/// </summary>
/// <returns></returns>
public virtual double GetResult()
{
double result = 0; 
return result;
}
}

復(fù)制代碼 代碼如下:

/// <summary>
/// 加法類
/// </summary>
class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0; 
result = NumberA + NumberB;
return result;
}
}

/// <summary>
/// 減法類
/// </summary>
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}

/// <summary>
/// 乘法類
/// </summary>
class OperationMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}

/// <summary>
/// 除法類
/// </summary>
class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB==0)
throw new Exception("除數(shù)不能為0。");
result = NumberA / NumberB;
return result;
}
}

小菜:“大鳥哥,我按照你說的方法寫出來了一部分,首先是一個(gè)運(yùn)算類,它有兩個(gè)Number屬性,主要用于計(jì)算器的前后數(shù),然后有一個(gè)虛方法GetResult(),用于得到結(jié)果,然后我把加減乘除都寫成了運(yùn)算類的子類,繼承它后,重寫了GetResult()方法,這樣如果要修改任何一個(gè)算法,都不需要提供其它算法的代碼了。但問題來了,我如何讓計(jì)算器知道我是希望用哪一個(gè)算法呢?”

大鳥:“寫得很不錯(cuò)嗎,大大超出我的想象了,你現(xiàn)在的問題其實(shí)就是如何去實(shí)例化對(duì)象的問題,哈,今天心情不錯(cuò),再教你一招‘簡單工廠模式',也就是說,到底要實(shí)例化誰,將來會(huì)不會(huì)增加實(shí)例化的對(duì)象(比如增加開根運(yùn)算),這是很容易變化的地方,應(yīng)該考慮用一個(gè)單獨(dú)的類來做這個(gè)創(chuàng)造實(shí)例的過程,這就是工廠,來,我們看看這個(gè)類如何寫?!?BR>
復(fù)制代碼 代碼如下:

/// <summary>
/// 運(yùn)算類工廠
/// </summary>
class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}

return oper;
}
}

大鳥:“哈,看到吧,這樣子,你只需要輸入運(yùn)算符號(hào),工廠就實(shí)例化出合適的對(duì)象,通過多態(tài),返回父類的方式實(shí)現(xiàn)了計(jì)算器的結(jié)果。”
復(fù)制代碼 代碼如下:

Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();

大鳥: “哈,界面的實(shí)現(xiàn)就是這樣的代碼,不管你是控制臺(tái)程序,Windows程序,Web程序,PDA或手機(jī)程序,都可以用這段代碼來實(shí)現(xiàn)計(jì)算器的功能,當(dāng)有一天我們需要更改加法運(yùn)算,我們只需要改哪里?”

小菜:“改OperationAdd 就可以了。”

大鳥: “那么我們需要增加各種復(fù)雜運(yùn)算,比如平方根,立方根,自然對(duì)數(shù),正弦余弦等,如何做?”

小菜:“只要增加相應(yīng)的運(yùn)算子類就可以了呀。”

大鳥: “嗯?夠了嗎?”

小菜:“對(duì)了,還需要去修改運(yùn)算類工廠,在switch中增加分支?!?

大鳥: “哈,那才對(duì),那如果要修改界面呢?”

小菜:“那就去改界面呀,關(guān)運(yùn)算什么事呀。”

小菜:“ 回想那天我面試題寫的代碼,我終于明白我為什么寫得不成功了,原來一個(gè)小小的計(jì)算器也可以寫出這么精彩的代碼,謝謝大鳥?!?

大鳥: “吼吼,記住哦,編程是一門技術(shù),更加是一門藝術(shù),不能只滿足于寫完代碼運(yùn)行結(jié)果正確就完事,時(shí)??紤]如何讓代碼更加簡煉,更加容易維護(hù),容易擴(kuò)展和復(fù)用,只有這樣才可以是真的提高。寫出優(yōu)雅的代碼真的是一種很爽的事情。不過學(xué)無止境,其實(shí)這才是理解面向?qū)ο蟮拈_始呢。給你出個(gè)作業(yè),做一個(gè)商場(chǎng)收銀軟件,營業(yè)員根據(jù)客戶購買商品單價(jià)和數(shù)量,向客戶收費(fèi)?!?

小菜:“就這個(gè)?沒問題呀?!?

相關(guān)文章

  • C#實(shí)現(xiàn)圖片縮略圖功能的示例詳解

    C#實(shí)現(xiàn)圖片縮略圖功能的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)圖片縮略圖的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#生成本地配置文件的實(shí)現(xiàn)示例

    C#生成本地配置文件的實(shí)現(xiàn)示例

    本文將介紹如何使用C#語言生成本地配置文件,以便為應(yīng)用程序提供靈活的配置選項(xiàng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Unity實(shí)現(xiàn)答題系統(tǒng)的示例代碼

    Unity實(shí)現(xiàn)答題系統(tǒng)的示例代碼

    這篇文章主要和大家分享了利用Unity制作一個(gè)答題系統(tǒng)的示例代碼,文中的實(shí)現(xiàn)方法講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-05-05
  • C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法

    C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法,通過兩個(gè)按鈕點(diǎn)擊事件實(shí)現(xiàn)ListView選中項(xiàng)的上下移動(dòng)功能,需要的朋友可以參考下
    2015-06-06
  • C#實(shí)現(xiàn)壓縮pdf文件的示例代碼

    C#實(shí)現(xiàn)壓縮pdf文件的示例代碼

    PDF 文件如果文件太大則會(huì)影響傳輸效果同時(shí)也會(huì)占用過多磁盤空間,所以這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)有效地壓縮 PDF 文件,需要的可以參考下
    2023-11-11
  • c# SqlDataAdapter中的Fill是怎么實(shí)現(xiàn)的

    c# SqlDataAdapter中的Fill是怎么實(shí)現(xiàn)的

    這篇文章主要介紹了c# SqlDataAdapter中的Fill是怎么實(shí)現(xiàn)的,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#修改IIS站點(diǎn)framework版本號(hào)的方法

    C#修改IIS站點(diǎn)framework版本號(hào)的方法

    這篇文章主要介紹了C#修改IIS站點(diǎn)framework版本號(hào)的方法,涉及C#調(diào)用使用ASP.NET IIS注冊(cè)工具Aspnet_regiis.exe進(jìn)行IIS站點(diǎn)framework版本號(hào)修改的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • c#實(shí)現(xiàn)字符串反序輸出字符串的實(shí)例

    c#實(shí)現(xiàn)字符串反序輸出字符串的實(shí)例

    下面小編就為大家分享一篇c#實(shí)現(xiàn)字符串反序輸出字符串的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#實(shí)現(xiàn)軟件開機(jī)自動(dòng)啟動(dòng)的兩種常用方法總結(jié)

    C#實(shí)現(xiàn)軟件開機(jī)自動(dòng)啟動(dòng)的兩種常用方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)軟件開機(jī)自動(dòng)啟動(dòng)的兩種常用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • 利用C#代碼實(shí)現(xiàn)圖片旋轉(zhuǎn)360度

    利用C#代碼實(shí)現(xiàn)圖片旋轉(zhuǎn)360度

    本文介紹利用C#代碼實(shí)現(xiàn)圖片旋轉(zhuǎn)360度,具體實(shí)例代碼已附上,僅供大家參考,希望對(duì)大家有所幫助
    2016-11-11

最新評(píng)論

和顺县| 东台市| 烟台市| 平乡县| 长沙县| 巴林左旗| 黑河市| 那曲县| 荔浦县| 竹山县| 邢台市| 淅川县| 界首市| 东源县| 赤城县| 方正县| 兴化市| 衡阳市| 陆河县| 吉木萨尔县| 榆中县| 盘山县| 滦南县| 图木舒克市| 安徽省| 克东县| 罗城| 阳城县| 灵武市| 台中市| 县级市| 江华| 平远县| 万年县| 富锦市| 岑巩县| 当阳市| 安多县| 安平县| 开原市| 大悟县|