当前位置: 首页 > news >正文

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

软计设计应该对扩展开放对修改关闭,具体操作就是软件功能变动时只增加子类扩展即可,无需或尽量减少对程序的修改。

核心思想:软件实体对扩展开放,对修改关闭。例如对于已经搭好的积木,可以再上面添加积木,无需拆毁原有的东西。

提高代码的可复用性,由于各个功能都是由子类完成,如果子类无法完成时,通过扩展子类或组合子类完成新的功能,提高代码的复用性。也可以提高软件的可维护性,当功能改变时,只需要添加新的子类即可,无需修改主程序代码,隐藏了软件框架的细节。

http://www.lryc.cn/news/588711.html

相关文章:

  • CG--类比推理
  • java截取视频帧
  • 视频HDR技术全解析:从原理到应用的深度探索
  • 音视频学习(三十九):IDR帧和I帧
  • React.FC与React.Component
  • PyCharm 高效入门指南:从安装到效率倍增
  • docker拉取nacos镜像失败
  • lanch4j将jar转成exe
  • 开通保存图片权限
  • iOS高级开发工程师面试——Swift
  • 语言模型玩转3D生成:LLaMA-Mesh开源项目
  • 无人机故障响应模块运行与技术难点
  • 全面安装指南:在Linux、Windows和macOS上部署Apache Cassandra
  • 网络劫持对用户隐私安全的影响:一场无形的数据窃取危机
  • 算法在前端框架中的集成
  • 021_自然语言处理应用
  • 量子比特的稳定性革命:破解量子计算“脆弱密码”的最新突破
  • 读取ubuntu的磁盘分区表与超级块
  • 【高等数学】第三章 微分中值定理与导数的应用——第一节 不定积分的概念与性质
  • 面向医疗AI场景的H20显卡算力组网方案
  • Vue 中 effectScope() 的全面解析与实战应用
  • WPF,Winform,HTML5网页,哪个UI开发速度最快?
  • 板凳-------Mysql cookbook学习 (十一--------11)
  • 使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)
  • PySpark Standalone 集群
  • PySpark 常用算子详解
  • Java使用itextpdf7生成pdf文档
  • 【开源】一款基于 .NET 和 Vue3 开源(Apache)的MES管理系统,您的新一代工厂管理助手!
  • 【雅思播客016】New Year Resolution 新年决心
  • Luban配置教程