labview关于OOP
这几天看了知乎李时珍,李老师的文章,还有labview编程之道,汪老师的文章,对于OOP有了一些认识,这里做了一些记录。
1.简介
类是一种自定义数据类型,和与该数据交互的方法,是一个集合,方法和数据捆绑在一起。
1.1创建方法
主要介绍两种
基于动态模板分配的VI:这个是后面想用子类来重写功能创建的,可以是优化,更新功能。
基于静态模板分配的VI:静态VI不能重写,只能继承,用于一些不会变的固定的方法。
1.2类的继承
涉及到OOP就离不开封装,继承,多态,这三大件,这里将一下继承。
在一个已有类的基础上可以生成定义更细致的子类,子类拥有原有的类(父类)所有公开的属性和方法,他还具有一些更为具体的属性和方法,可以定义相似的类型,相似关系的建模。就相当于动物类下面还细分哺乳动物和非哺乳动物类。这两者都是动物,但是有具有不同的特性。
1.3类的封装
把高度相关的一组数据和方法组织在一起,形成一个相对独立的模块,外部程序只能通过严格定义的接口访问这个模块公开的数据和方法,不需要和外部发生联系的数据和方法把他隐藏起来。可以保护数据不被意外破坏,保护数据不会被其他函数意外修改,封装可以提高代码的可维护性和可重用性。
1.4类的多态
同一种方法,在不同的子类中具有不同的表现方法,虽然子类中具有很多继承自父类相同的方法,但是他们的实现可以是不同的,调用这些方法可以使用父类的名称调用他们,可以通过继承父类的方法,通过接入子类的不同来实现执行不同的子类方法。
1.5接口
接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。一个类只能继承一个父类,一个类可以实现多个接口,接口中不包含任何数据,包含一个以上的虚方法,直接调用接口实现会报错,必须在子类中重写方法来使用,接口为多继承模式,一个子类可以继承多个接口,类继承接口后必须重写。
2.单一职责SRP
原则规定每一个类都应该有一个单一的功能,并且这个功能应该由这个类完全封装起来,最终一个类或者模块应该有且只有一个改变的原因。
核心思想:一个VI只做一件事,并且把它做好,例如厨师只负责炒菜,服务员只负责上菜,收银员只负责结账。
优点:一个类只做一件事,类的复杂性降低,实现什么功能有准确定义,一个类的颗粒性变小,提高类的可读性,因为职责单一,所以一个类变更功能对其它类的影响会比较小。
缺点:会造成类的膨胀,增加开发时间。
3.接口隔离原则ISP
尽量将臃肿的接口拆分成更小的更具体的接口。可以把一个丰富的接口拆分成几个小接口,用来给不同的类继承。
核心思想:不要强迫模块使用它不需要的接口,例如你给了我整套文具,但是我只需要一支笔。
优点:比较小的颗粒度接口设计程序,使代码高内聚,低耦合,减少代码冗余,使代码更容易理解和维护。
4.依赖倒置原则DIP
高层模块不应该依赖于底层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节依赖抽象。
核心思想:高层模块不该依赖底层模块,二者都应该依赖抽象,就像老板不直接管理员工,而是通过企业文化,员工手册约束员工。
优点:可以降低模块之间的耦合性,解耦类之间的依赖,提高系统的稳定性,提升代码的可拓展性,减少并行开发引起的风险。从顶层开始设计忽略实现细节,让不同的开发人员做不同的事情,将设计和实现分离定义好接口或抽象类后两边并行开发,提高效率。
5.里氏替换原则LSP
为继承必须确保超类所拥有的性质在子类中仍然成立,确保所有子类使用父类方法后软件功能正常,确保所有子类重写父类方法在软件运行时功能正常。
核心思想:子模块必须能无缝替换父模块,且系统不崩溃。就像备胎必须能替换原装轮胎,且不影响汽车的运行。
通俗来讲子类可以扩展父类的功能,但不能改变父类原有的功能,也就是说子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类方法。
6.开闭原则OCP
软计设计应该对扩展开放对修改关闭,具体操作就是软件功能变动时只增加子类扩展即可,无需或尽量减少对程序的修改。
核心思想:软件实体对扩展开放,对修改关闭。例如对于已经搭好的积木,可以再上面添加积木,无需拆毁原有的东西。
提高代码的可复用性,由于各个功能都是由子类完成,如果子类无法完成时,通过扩展子类或组合子类完成新的功能,提高代码的复用性。也可以提高软件的可维护性,当功能改变时,只需要添加新的子类即可,无需修改主程序代码,隐藏了软件框架的细节。