272829 接口、抽象类、SOLID、单元测试、反射

1 什么是抽象类

例1(为作基类而生的“抽象类”与“开放/关闭原则”)

例2(纯抽象类)

例3 (将例2中纯抽象类修改为接口)

总结

        ·接口和抽象类都是“软件工程产物”

        ·具体类->抽象类->接口:越来越抽象,内部实现的东西越来越少

        ·抽象类是未完全实现逻辑的类(可以有字段和非public成员,它们代表了“具体逻辑”)

        ·抽象类为复用而生:专门作为基类来使用,也具有解耦功能

        ·封装确定的,开放不确定的,推迟到合适的子类中去实现

2 什么是接口

例1:未使用接口(契约)的例子

例2:使用接口的例子

例3:依赖与耦合 

        ·紧耦合的例子(要尽量避免紧耦合)

例4:引入接口,降低耦合度

        ·松耦合的例子(利用接口降低耦合度)

总结

        ·如果有可以替换的地方,那么就会有接口的存在,接口就是为了松耦合而生(为了解耦而生)。松耦合的目的是使功能的提供方变得可替换,从而降低功能的提供方不能被替换所带来的高风险与高成本。

        ·接口是一个契约,约束一组功能,这组功能的调用者是被约束的(只能调用这个接口中所包含的功能),调用者可以放心调用,这些功能都是已经实现好了的,只需要关注功能,不需要关注功能的提供者

        ·接口是“供需双方”都要遵守的“契约”

        ·接口是完全未实现逻辑的“类”(“纯虚类”;只有函数成员;成员全部public)

        ·接口为解耦而生:“高内聚,低耦合”,方便单元测试

        ·接口是一个“协约”,早已为工业生产所熟知(有分工必有协作,有协作必有协约)

        ·它们都不能实例化,只能用来声明变量、引用具体类(concrete class)的实例

3 依赖反转原则与单元测试

        ·解耦在代码中的体现就是依赖反转

        ·单元测试其实就是依赖反转在开发中的直接应用和直接受益者

什么是依赖反转原则?

        ·依赖:服务的提供者和服务的使用者之间存在依赖关系,服务的使用者依赖在服务的提供者之上;依赖越直接,耦合就越紧密

        ·依赖反转原则:提供一种新的思路,用来平衡这种“自顶向下,逐步求精”的单一的思维方式(反转的是箭头)

例一(观察接口、解耦、依赖倒置原则是怎样被单元测试所应用的)

例二(利用接口将耦合松开,再用单元测试来测试Deskfan)

        ·测试项目

例三(利用moq直接创建实现接口方法的实例,而越过创建类的这一步骤)

与方法修饰符有关的图解

        ·存在一个接口,接口中有一个方法:

                ①如果想直接拿一个类来实现它,方法的修饰符为public

                ②如果要用抽象类来实现一个接口,方法的修饰符为public abstract

                ③如果用一个类来实现这个方法,并且想让这个方法可以被它的子类重写,方法的修饰符为public virtual

                ④被重写之后的方法的修饰符为public override                       

4 接口隔离原则

        ·接口隔离原则:服务调用者不能够多要

        ·把本质不同的功能隔离开,再用接口将其封装起来

例一:“胖接口”的示例(违反了接口隔离原则)

例二:将“胖接口”分裂成两个不同的接口

        ·这个例子符合接口隔离原则,因为在Driver类中,驾驶机动车只要求机动车可以跑,并不需要机动车发射炮弹,所以传进来的只是Vehicle,不会传进来任何多余的功能

例三:接口的显式实现(C#语言的独有功能)

例四:接口的显示实现

        ·接口中的方法不想轻易地被人调用,那么就不能够轻易被别人看到,就要用到接口的显示实现 

5 反射

什么是反射?

        ·反射是.net框架的功能

        ·反射:以不变应万变(更松的耦合)

例一:反射的原理以及与反射密切相关的重要功能是依赖注入

例二:封装好了的反射的功能

        ·封装好了的反射最重要的功能就是依赖注入(DI)

        ·依赖注入需要借助依赖注入框架

例三

 为什么使用反射?利用反射追求更松的耦合(即以不变应万变的能力)

        ·插件式编程:使用插件式编程,可以以主体程序为中心,生成生态圈(生态圈中有人不断更新主体程序,有人不断用插件增加新功能)

        ·主体程序与插件程序之间的关系:不变与万变的关系(当开发主体程序时,未来有多少人会开发出多少插件是不可能知道的)。一般来说,主体程序都会发布包含有程序开发接口(API)的程序开发包(SDK),第三方使用SDK中的API,在开发插件时就会比较容易,开发出的插件也会比较标准、高效的去跟主体程序对接

        ·程序开发接口(API)中不一定都是接口,有可能是一组函数、有可能是一组类

        ·使用反射时可以将耦合降低到忽略不计;为了避免第三方(插件开发者)犯小错误,就要用SD中的API约束开发者的开发,同时减轻开发者的劳动

与之相关的例子:

        我是婴儿车的生产厂商(第一方程序员),婴儿车有一个面板,上面有按钮(动物和数字按钮),先点击动物,再点击数字,就会发出多少次该动物的叫声,我留一个USB的插口,其他厂商就可以把他们生产的包含更多动物的U盘插在婴儿车上,面板上就会出现更多的小动物。

6 .net core开发环境的搭建

        目前最值得学习的C#开发平台已经由原来只能运行在windows上的.net Framework变成了开源的、跨平台的.net core。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值