第一章 代码无错就是优吗?(简单工厂模式)
今天是設計模式的第一章由于工作比較忙所以一直想寫點什么,但是還是沒時間寫。這篇的主題是代碼無錯可以運行就是優質代碼嗎?
首先要實現一個業務代碼:有部門A,B,C,D 四個部門但是A部門的獎金是10%,B部門的是20%,C部門是30%,D部門的是40% 編寫一段代碼實現輸入底薪后計算出最后薪水
class Program{static void Main(string[] args){Console.WriteLine("請輸入底薪:");int a =Convert.ToInt32(Console.ReadLine());Console.WriteLine("請輸入部門:");string b = Console.ReadLine();string d = String.Empty;if (b == "a"){d = (a * 0.1 + a).ToString();}if (b == "b"){d = (a * 0.2 + a).ToString();}if (b == "c"){d = (a * 0.3 + a).ToString();}if (b == "d"){d = (a * 0.4 + a).ToString();}Console.WriteLine("您的薪水是:{0}RMB",d);Console.ReadKey();}}
?
先看上面的代碼,復制運行下看看。?沒問題吧需求的業務功能都實現了。但是這樣的代碼真的好嗎?
首先臨界值的問題放在一邊不說:
項目大了這樣的命名自己都搞不清楚這個變量是什么用的了,就像是給軟件埋了幾個地雷,誰來改誰就踩了地雷了。那么來改改?
?
?
class Program{static void Main(string[] args){Console.WriteLine("請輸入底薪:");int BasicSalary =Convert.ToInt32(Console.ReadLine());Console.WriteLine("請輸入部門:");string Department = Console.ReadLine();string Salary = String.Empty;switch (Department){case "a" :Salary = (BasicSalary * 0.1 + BasicSalary).ToString();break;case "b":Salary = (BasicSalary * 0.2 + BasicSalary).ToString();break;case "c":Salary = (BasicSalary * 0.3 + BasicSalary).ToString();break;case "d":Salary = (BasicSalary * 0.4 + BasicSalary).ToString();break;default:break;}Console.WriteLine("您的薪水是:{0}RMB",Salary);Console.ReadKey();}}這樣行了嗎?修改了命名修改了用switch代替if減少判斷次數。哈哈你看到下面還有篇幅就猜到還不行。
這樣的代碼沒有面向對象復用性很差 解決的辦法是業務的封裝再來改改
class Program{static void Main(string[] args){Console.WriteLine("請輸入底薪:");int BasicSalary = Convert.ToInt32(Console.ReadLine());Console.WriteLine("請輸入部門:");string Department = Console.ReadLine();Console.WriteLine("您的薪水是:{0}RMB", GetResult(Department, BasicSalary));Console.ReadKey();}public static string GetResult(string _department, int _basicsalary){string Salary = String.Empty;switch (_department){case "a":Salary = (_basicsalary * 0.1 + _basicsalary).ToString();break;case "b":Salary = (_basicsalary * 0.2 + _basicsalary).ToString();break;case "c":Salary = (_basicsalary * 0.3 + _basicsalary).ToString();break;case "d":Salary = (_basicsalary * 0.4 + _basicsalary).ToString();break;default:break;}return Salary;}}?嗯改了下業務和視圖分開 這樣Web,手機程序等等都可以調用這樣業務邏輯就不用再Ctrl+C,在Ctrl+V了而且到后期業務邏輯修改了也不用再一個一個副本去修改了,改一下GetResult函數就可以咯。
我們繼續 哈哈 還有啊...
如果今天公司發展和業務的需要加了一個部門f 那代碼就需要修改業務代碼了 破壞了代碼的封裝性 那怎么處理才是不破話封裝呢。那就是面向對象的其他2個特性多態和繼承
請看下面的代碼:
public class Operation{private int basicsalary;public int BasicSalary{get { return basicsalary; }set { basicsalary = value; }}public virtual string GetResult(){string Salary = String.Empty;return Salary;}}class OperationA : Operation{public override string GetResult(){string Salary = String.Empty;Salary = (BasicSalary * 0.1 + BasicSalary).ToString();return Salary;}}class OperationB : Operation{public override string GetResult(){string Salary = String.Empty;Salary = (BasicSalary * 0.2 + BasicSalary).ToString();return Salary;}}class OperationC : Operation{public override string GetResult(){string Salary = String.Empty;Salary = (BasicSalary * 0.3 + BasicSalary).ToString();return Salary;}}class OperationD : Operation{public override string GetResult(){string Salary = String.Empty;Salary = (BasicSalary * 0.4 + BasicSalary).ToString();return Salary;}}class Program{static void Main(string[] args){Console.WriteLine("請輸入底薪:");int BasicSalary = Convert.ToInt32(Console.ReadLine());Console.WriteLine("請輸入部門:");string Department = Console.ReadLine();Operation oper = OperationFactory.createOperate(Department);oper.BasicSalary = BasicSalary;Console.WriteLine("您的薪水是:{0}RMB", oper.GetResult());Console.ReadKey();}}public class OperationFactory{public static Operation createOperate(string operate){Operation oper = null;switch (operate){case "a":oper = new OperationA();break;case "b":oper = new OperationB();break;case "c":oper = new OperationC();break;case "d":oper = new OperationD();break;default:break;}return oper;}}怎么樣現在只要寫一個運行對象然后加個new 就可以樓 不用去修改原來的業務邏輯噢。如果要修改界面就只要改界面的類樓。下面是UML圖
?
?
?
吳蔣
2010.8.13
轉載于:https://www.cnblogs.com/wujiang/archive/2010/08/13/1798787.html
總結
以上是生活随笔為你收集整理的第一章 代码无错就是优吗?(简单工厂模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS2.1选择符
- 下一篇: 【转】排序算法复习(Java实现) (二