經驗不多的程序員寫程序喜歡按計算機思考的方式來進行編程,但是這樣寫出來的程序往往可維護性差,可拓展性不高,並且不容易復用代碼,那麼如何讓寫出來的代碼能容易維護可拓展性好並且能夠復用,這就需要面向對象的思維和方法。
書中用活字印刷形象地展示了面向對象的妙處,其一,之前的刻板印刷,更改一篇文章就需要更換一塊刻板重新刻字,而活字印刷只需要“更改要改之字”,體現了可維護性;其二,一篇文章印刷完畢後,其活字印刷仍可復用到印刷其它文章,體現了復用性;其三,如果文章需要加字,增加對應的刻字即可,體現了可擴展性;其四,排版可豎排或橫排,體現了靈活性。
使用面向對象的分析設計編程思想,通過封裝、繼承、多態把程序的耦合性降低,應用設計模式則可以使得程序更加靈活,容易修改並且復用性高。
編程是一門技術更是一門藝術,編寫出優雅的代碼是一件很爽的事情。
書中用一個編寫計算器的例子體現了簡單工廠模式比沒有應用設計模式只按計算機思考方式編程的好處,在這個例子中,對運算邏輯進行封裝(Operation類),然後繼承這個封裝類可以拓展不用的運算符運算類,如加法運算類OperationAdd等,然後寫一個運算工廠類OperationFactory,這個OperationFactory類實現創建不用的運算方法createOperat,這樣在前台就根據傳入的運算符參數進行創建相應的運算類,使用該類的計算方法得到結果。
相關代碼如下:
Code
using System;
using System.Collections.Generic;
using System.Text;
namespace OperationLibrary
{
public class Operation
{
private double _firstStr;
private double _secondStr;
public double FirstStr
{
set { _firstStr = value; }
get { return _firstStr; }
}
public double SecondStr
{
get { return _secondStr; }
set { _secondStr = value; }
}
public virtual double getResult()
{
double result = 0.0;
return result;
}
}
class OperationAdd : Operation
{
public override double getResult()
{
double result = 0.0;
result = FirstStr + SecondStr;
return result;
}
}
class OperationSub : Operation
{
public override double getResult()
{
double result = 0.0;
result = FirstStr - SecondStr;
return result;
}
}
class OperationMul : Operation
{
public override double getResult()
{
double result = 0.0;
result = FirstStr * SecondStr;
return result;
}
}
class OperationDiv : Operation
{
public override double getResult()
{
double result = 0.0;
if (SecondStr == 0)
throw new Exception("除數不能為0哦。");
result = FirstStr / SecondStr;
return result;
}
}
public class OperationFactory
{
public static Operation createOperat(string operate)
{
Operation operation = null;
switch (operate)
{
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
}
Code
using System;
using System.Collections.Generic;
using System.Text;
using OperationLibrary;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("請輸入第一個運算數字:");
string firstStr = Console.ReadLine();
Console.WriteLine("請輸入第二個運算數字:");
string secondStr = Console.ReadLine();
Console.WriteLine("請輸入運算符“+”或“-”或“*”或“/”:");
string operatorStr = Console.ReadLine();
Operation opr;
opr = OperationFactory.createOperat(operatorStr);
opr.FirstStr = Convert.ToDouble(firstStr);
opr.SecondStr = Convert.ToDouble(secondStr);
Console.WriteLine("計算結果是:" + opr.getResult());
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:"+ex.Message);
}
Console.ReadLine();
}
}
}