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