一.代碼無錯就是好?
class Program
{
static void Main(string[] args)
{
Console.Write("請輸入數字A:");
string A = Console.ReadLine();
Console.Write("請選擇運算符號(+、-、*、/):");
string B = Console.ReadLine();
Console.Write("請輸入數字B:");
string C = Console.ReadLine();
string D = "";
if (B == "+")
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
if (B == "-")
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
if (B == "*")
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
if (B == "/")
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
Console.WriteLine("結果是:" + D);
}
}
存在問題:
(1)變量命名,ABCD,變量不帶有任何具體含義,非常不規範的;
(2)判斷分支,每個條件都要做判斷,等於計算機做了三次無用功;
(3)數據輸入有效性判斷等,如果用戶輸入的是字符符號而不是數字怎麼辦?如果除數時,客戶輸入了0怎麼辦?
二.代碼規範、重構
class Program
{
static void Main(string[] args) {
try{
Console.Write("請輸入數字A:");
string strNumberA = Console.ReadLine();
Console.Write("請選擇運算符號(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("請輸入數字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
switch (strOperate)
{
case "+":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
break;
case "-":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB));
break;
case "*":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB));
break;
case "/":
if (strNumberB != "0")
strResult = Convert.ToString
(Convert.ToDouble(strNumberA)/Convert.ToDouble(strNumberB));
else
strResult = "除數不能爲0";
break;
}
Console.WriteLine("結果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:" + ex.Message);
}
}
}
要用面向對象的編程方法去實現
比如這個程序,先要求輸入兩個數和運算符號,然後根據運算符號判斷選擇如何運算,得到結果,
這樣的思維卻使得我們的程序只爲滿足實現當前的需求,程序不容易維護,不容易擴展,更不容易複用。從而達不到高質量代碼的要求。
如果要求再寫一個windows的計算器,現在的代碼就能複用嗎?
代碼複製過去不就行了嗎?---->改動又不大,不算麻煩。
這其實是非常不好的編碼習慣,因爲當你的代碼中重複的代碼多到一定程度,維護的時候,可能就是一場災難。
越大的系統,這種方式帶來的問題越嚴重,編程有一原則,就是用盡可能的辦法去避免重複。
這段代碼,將控制檯有關的和計算器有關的分開會則麼樣。
三.業務的封裝
客戶端代碼
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("請輸入數字A:");
string strNumberA = Console.ReadLine();
Console.Write("請選擇運算符號(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("請輸入數字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));
Console.WriteLine("結果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:" + ex.Message);
}
}
}
Operation類
class Operation
{
public static double GetResult(double numberA, double numbleB, string operate)
{
double result = 0;
switch (operate)
{
case "+":
result = numberA + numbleB;
break;
case "-":
result = numberA - numbleB;
break;
case "*":
result = numberA * numbleB;
break;
case "/":
result = numberA / numbleB;
break;
}
return result;
}
}
修改後:不單是Windows程序,Web版程序需要運算可以用它,PDA,手機等需要移動系統的軟件需要運算也可以用它
但是隻用了封裝,繼承和多態未體現。
四.簡單工廠模式
客戶端代碼
static void Main(string[] args)
{
try
{
Console.Write("請輸入數字A:");
string strNumberA = Console.ReadLine();
Console.Write("請選擇運算符號(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("請輸入數字B:");
string strNumberB = Console.ReadLine();
Operation oper;
oper = OperationFactory.createOperate(strOperate);
oper.NumberA = Convert.ToDouble(strNumberA);
oper.NumberB = Convert.ToDouble(strNumberB);
double result = oper.GetResult();
Console.WriteLine("結果是:" + result);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:" + ex.Message);
}
}
簡單運算工廠類
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;
}
}
Operation 運算類
class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
加減乘除類
class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
throw new Exception("除數不能爲0.");
result = NumberA / NumberB;
return result;
}
}
優點:
1.若要修改加法 只需要改 OperationAdd
2.若要增加各種複雜的運算 只要增加相應的運算子類+運算工廠中的 Switch分支
3.若要改界面 則不需要修改運算