日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#入门详解(14)

發(fā)布時間:2023/12/13 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#入门详解(14) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

接口,依賴反轉(zhuǎn),單元測試

接口是協(xié)約是規(guī)定,所以必須是公開的,只能是public;

static void Main(string[] args){int[] num1 = new int[] { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(num1).ToString());Console.WriteLine("==================");Console.WriteLine(Avg(num1).ToString());}static int Sum(int[] arr){int result = 0;foreach (var item in arr)result += item;return result;}static double Avg(int[] arr){int result = 0;double count = 0;foreach (var item in arr) { result += item; count++; };return (result/count);}}

在上述代碼中,如果我們的參數(shù)不是int[]類型,而是ArrayList類型(存放的是object類型)

方案一進行方法的重載,在方法內(nèi)部進行強制類型轉(zhuǎn)換:

static void Main(string[] args){int[] num1 = new int[] { 1, 2, 3, 4, 5 };ArrayList array = new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(array).ToString());Console.WriteLine("==================");Console.WriteLine(Avg(array).ToString());}static int Sum(ArrayList arr){int result = 0;foreach (var item in arr)result += (int)item;return result;}static double Avg(ArrayList arr){int result = 0;double count = 0;foreach (var item in arr) { result += (int)item; count++; };return (result/count);}

在上述問題中,我們要調(diào)用的求和和求平均數(shù),就是甲方,提供的方法為乙方,仔細觀察不難發(fā)現(xiàn)我們的甲方只要求其方法參數(shù)為可迭代的集合就行了,查看int[]和ArrayList的基類,它們都是可迭代的,實現(xiàn)了IEnumerable接口

static void Main(string[] args){int[] num1 = new int[] { 1, 2, 3, 4, 5 };ArrayList array = new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(num1).ToString());Console.WriteLine("==================");Console.WriteLine(Avg(array).ToString());}static int Sum(IEnumerable arr){int result = 0;foreach (var item in arr)result += (int)item;return result;}static double Avg(IEnumerable arr){int result = 0;double count = 0;foreach (var item in arr) { result += (int)item; count++; };return (result/count);}

通過這樣的實現(xiàn)解決問題,把具體參數(shù)變抽象,用契約管理供需關(guān)系。

下一個實例繼續(xù):

public class Program{static void Main(string[] args){Engine engine = new Engine();Car car = new Car(engine);car.Run(3);Console.WriteLine(car.Speed.ToString());}}public class Engine{public int RPM { get;private set; }public void Work(int gas){this.RPM = 1000 * gas;}}public class Car{public Engine engine { get;private set; }public int Speed { get;private set; }public Car(Engine engine){this.engine = engine;}public void Run(int gas){this.engine.Work(gas);this.Speed = this.engine.RPM / 100;}}

上面這段代碼當(dāng)Engine中的Work出現(xiàn)問題時,會導(dǎo)致Car調(diào)用出現(xiàn)問題,這是因為Car已經(jīng)和Engine類緊耦合了

追求低耦合的原因:降低對提供方的需求,只需滿足協(xié)約就滿足要求,可替換。

接口與單元測試

接口的產(chǎn)生:自底而上(重構(gòu)),自頂向下(設(shè)計)

C#中接口的實現(xiàn)(隱式,顯示,多接口)

語言對面向?qū)ο笤O(shè)計的內(nèi)建支持:依賴反轉(zhuǎn),接口隔離,開/閉原則

public class Program{static void Main(string[] args){var fan = new DeskFan(new PowerSupply());Console.WriteLine(fan.Work());}}public class PowerSupply{public int GetPower(){return 100;}}public class DeskFan{private PowerSupply PowerSupply;public DeskFan(PowerSupply powerSupply){this.PowerSupply = powerSupply;}public string Work(){int power = PowerSupply.GetPower();if (power <= 0){return "won't work";}else if (power < 100)return "Slow";else if (power < 200)return "Work fine";elsereturn "Waring";}}

當(dāng)前代碼如果我們要測試的話會直接修改PowerSupply里面的方法內(nèi)的數(shù)值,在當(dāng)前是不能這樣干的,可能有別的代碼引用這個PowerSupply這個類,所以我們需要引入接口來解耦。

public interface IPowerSulpply{int GetPower();}private IPowerSulpply PowerSupply;public DeskFan(IPowerSulpply powerSupply){this.PowerSupply = powerSupply;}

現(xiàn)在可以進行單元測試了。具體步驟如下:

點擊VS頂級菜單Test->Window->Test Explore

右擊解決方案,添加項目,添加對應(yīng)的單元測試項目。

命名為要測試的項目名加“.Test”即可。

接著引用被測試項目。

編寫代碼方法等

[Fact]public void PowerSupplyThanZeroTest(){var oldvalue = "won't work";var power_ = new DeskFan(new PowerSupplyThanZero());var newvalue = power_.Work();Assert.Equal(oldvalue, newvalue);}public class PowerSupplyThanZero : IPowerSulpply{public int GetPower(){return 0;}}

打開測試管理器界面,點擊對應(yīng)的方法運行,全部變綠證明測試通過了。

上面調(diào)用是構(gòu)造類的實例然后更改調(diào)用的方法的值,使用Moq可以極大減輕我們的工作量。

var oldvalue = "won't work";//var power_ = new DeskFan(new PowerSupplyThanZero());var mock = new Mock<IPowerSulpply>();mock.Setup(a => a.GetPower()).Returns(() => 0);var power = new DeskFan(mock.Object);var newvalue = power.Work();Assert.Equal(oldvalue, newvalue);

?

轉(zhuǎn)載于:https://www.cnblogs.com/jingjingweixiao/p/11080404.html

總結(jié)

以上是生活随笔為你收集整理的C#入门详解(14)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。