小菜編程成長記(一 面試受挫——代碼無錯就是好?)第2/3頁
三 復(fù)制VS復(fù)用
小菜:“我明白了,他說用任意一種面向?qū)ο笳Z言實(shí)現(xiàn),那意思就是要用面向?qū)ο蟮木幊谭椒ㄈ?shí)現(xiàn),對嗎?OK,這個我學(xué)過,只不過當(dāng)時我沒想到而已?!?br>
大鳥:“所有編程初學(xué)者都會有這樣的問題,就是碰到問題就直覺的用計算機(jī)能夠理解的邏輯來描述和表達(dá)待解決的問題及具體的求解過程。這其實(shí)是用計算機(jī)的方式去思考,比如計算器這個程序,先要求輸入兩個數(shù)和運(yùn)算符號,然后根據(jù)運(yùn)算符號判斷選擇如何運(yùn)算,得到結(jié)果,這本身沒有錯,但這樣的思維卻使得我們的程序只為滿足實(shí)現(xiàn)當(dāng)前的需求,程序不容易維護(hù),不容易擴(kuò)展,更不容易復(fù)用。從而達(dá)不到高質(zhì)量代碼的要求?!?
小菜:“鳥哥呀,我有點(diǎn)糊涂了,如何才能容易維護(hù),容易擴(kuò)展,又容易復(fù)用呢,能不能具體點(diǎn)?”
大鳥:“比如說,我現(xiàn)在要求你再寫一個windows的計算器,你現(xiàn)在的代碼能不能復(fù)用呢?”
小菜:“那還不簡單,把代碼復(fù)制過去不就行了嗎?改動又不大,不算麻煩。”
大鳥:“小菜看來還是小菜呀,有人說初級程序員的工作就是Ctrl+C和Ctrl+V,這其實(shí)是非常不好的編碼習(xí)慣,因?yàn)楫?dāng)你的代碼中重復(fù)的代碼多到一定程度,維護(hù)的時候,可能就是一場災(zāi)難。越大的系統(tǒng),這種方式帶來的問題越嚴(yán)重,編程有一原則,就是用盡可能的辦法去避免重復(fù)。想想看,你寫的這段代碼,有哪些是和控制臺無關(guān)的,而只是和計算器有關(guān)的?”
四 業(yè)務(wù)的封裝
小菜:“你的意思是分一個類出來? 哦,對的,讓計算和顯示分開?!?br>
大鳥:“準(zhǔn)確的說,就是讓業(yè)務(wù)邏輯與界面邏輯分開,讓它們之間的耦合度下降。只有分離開,才容易達(dá)到容易維護(hù)或擴(kuò)展?!?br>
小菜:“讓我來試試看?!?BR>
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("請輸入數(shù)字A:");
string strNumberA = Console.ReadLine();
Console.Write("請選擇運(yùn)算符號(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("請輸入數(shù)字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate));
Console.WriteLine("結(jié)果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:" + ex.Message);
}
}
}
public class Operation
{
public static double GetResult(double numberA,double numberB,string operate)
{
double result = 0d;
switch (operate)
{
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
小菜:“鳥哥,我寫好了,你看看!”
大鳥:“哈,孺鳥可教也,:),寫得不錯,這樣就完全把業(yè)務(wù)和界面分離了?!?
小菜心中暗罵:“你才是鳥呢?!?nbsp;口中說道:“如果你現(xiàn)在要我寫一個Windows應(yīng)用程序的計算器,我就可以復(fù)用這個運(yùn)算類(Operation)了。”
大鳥:“不單是Windows程序,Web版程序需要運(yùn)算可以用它,PDA,手機(jī)等需要移動系統(tǒng)的軟件需要運(yùn)算也可以用它呀?!?
小菜:“哈,面向?qū)ο蟛贿^如此。下會寫類似代碼不怕了?!?
大鳥:“別急,僅此而已,實(shí)在談不上完全面向?qū)ο?,你只用了面向?qū)ο笕筇匦缘囊粋€,還兩個沒用呢?”
小菜:“面向?qū)ο笕筇匦圆痪褪欠庋b、繼承和多態(tài)嗎,這里我用到的應(yīng)該是封裝。這還不夠嗎?…………我實(shí)在看不出,這么小的程序如何用到繼承。至于多態(tài),其它我一直也不太了解它到底有什么好處,如何使用它?!?
大鳥:“慢慢來,有的東西好學(xué)了,你好好想想吧,我要去“魔獸”了,改時聊。”
相關(guān)文章
C# DataTable 轉(zhuǎn)換為 實(shí)體類對象實(shí)例
如果你的實(shí)體類與數(shù)據(jù)庫表是完全一致的。上代碼:2013-04-04解析C#設(shè)計模式編程中適配器模式的實(shí)現(xiàn)
這篇文章主要介紹了C#設(shè)計模式編程中適配器模式的實(shí)現(xiàn),分別舉了類的對象適配器與對象的適配器模式的例子,需要的朋友可以參考下2016-02-02提權(quán)函數(shù)之RtlAdjustPrivilege()使用說明
RtlAdjustPrivilege() 這玩意是在 NTDLL.DLL 里的一個不為人知的函數(shù),MS沒有公開,原因就是這玩意實(shí)在是太NB了,以至于不需要任何其他函數(shù)的幫助,僅憑這一個函數(shù)就可以獲得進(jìn)程ACL的任意權(quán)限!2011-06-06C#使用Dns類實(shí)現(xiàn)查詢主機(jī)名對應(yīng)IP地址
C#中的Dns類能夠與默認(rèn)的DNS服務(wù)器進(jìn)行通信,以檢索IP地址,這篇文章主要介紹了C#如何使用Dns類解析出主機(jī)對應(yīng)的IP地址信息,需要的可以參考下2024-02-02C#隨機(jī)設(shè)置900-1100毫秒延遲的方法
這篇文章主要介紹了C#隨機(jī)設(shè)置900-1100毫秒延遲的方法,涉及C#中Thread.Sleep方法的使用技巧,需要的朋友可以參考下2015-04-04深入分析C#中WinForm控件之Dock順序調(diào)整的詳解
本篇文章是對C#中WinForm控件之Dock順序調(diào)整進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法
這篇文章介紹了C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07結(jié)合.net框架在C#派生類中觸發(fā)基類事件及實(shí)現(xiàn)接口事件
這篇文章主要介紹了結(jié)合.net框架在C#派生類中觸發(fā)基類事件及實(shí)現(xiàn)接口事件,示例的事件編程中包括接口和類的繼承等面向?qū)ο蟮幕A(chǔ)知識,需要的朋友可以參考下2016-02-02