在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统。这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程。要完成整个教学管理系统,实际上就是完成一些函数,这些函数之间的逻辑组织结构就是人所认知的逻辑结构,要完成一个教学管理系统,首先要实现一些功能:比如 1.录入学生信息 2.为每个学生分配课程 3.为每个学生分配老师 4.为每个学生录入成绩 5.进行成绩的统计。

  上面这个流程很直观,而且实现起来也很流畅。我们只需要将这些函数进行实现就行了。但是在实际操作中,这样POP的程序设计过程可能会遇到一些问题,比如某一年,有一些课程可以改由多名教师上课,学生分配的课程可以进行更改,学生可以进行分数复核等等。但凡要实现这些功能,就需要对原有软件实现做出极大的改造,甚至是几乎重写。

  而众所周知,现在软件构造讲究“敏捷开发”,什么是敏捷开发呢?

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

  如果我们仅仅是为了完成课程作业的话,那我们基本用不到版本的更替迭代,问题是如果我们这样做,那实际工程只能是一堆“屎山”,代码几乎无法维护。这不禁让我想到此前的报道,美国的很多银行系统使用的是几十年前流行的语言,这种语言现在已经基本没人用了,而且之前的代码没有现在“敏捷开发”的思想,当时的代码组织结构极其笨重,虽然很稳定,但是难以修改。在几十年后的今天当人们想要加以维护时,发现这件事难以登天,即使开出百万年薪也找不到合适的人。这个例子也说明了软件“易于更改性”的重要性,试想一下,如果所有软件都只追求稳定性而不考虑可更改性,那每隔几年就要进行“轮子重造”,不断的造轮子,会让程序员们苦不堪言。

  但是通过OOP的思想,我们就可以解决远古的不具有“面向对象”特性语言的种种缺点。OOP和POP的本质区别在于:他们考虑的事情不同。

  POP是面向过程的编程思想,这种思想是“以过程为本”的,类似于状态转移。我们要做一件事,首先要考虑的是要实现哪些步骤,就像上面的教学管理系统,每个步骤只有在上一个步骤完成之后才能进行实现。这是一个“流式”编程的概念,他模仿人们做事的流程,因此单元与单元之间的耦合度很高,只要有一个功能发生变化,可能就会导致其他的功能完全需要重构。

  而OOP则是面向对象的编程思想,这种思想是“以人为本”的,我们将实现每个功能都划归给一些特定的对象,比如上面的教学管理系统,我们需要实现的对象可能包括:课程,教师资源,选课系统等等,我们考虑的不是事件与事件之间的耦合关系,我们恰恰是要减少模块之间的关联关系。这也是为了我们进行后期维护而进行的设计,倘若模块之前耦合度极高,那又会陷入面向过程编程的深坑。

  在引入OOP之后,我们就自然而然的可以感受到OOP的三大特征:封装性、继承性和多态性。所谓封装性,就是模块与模块之间是互不关联的,也就是他们之间的耦合度比较低,我们可以把模块当做砖头,实现一个软件就是完成一些砖块的堆积。通过封装让开发app就像盖房子一样简单,我们不需要自己造各种砖头,甚至可以复用别人的砖头。

  所谓继承性,也是为了简化编程的复杂度,因为自然界有很多的子类和父类的关系,或者说有些物品的所有特征都存在于别的物品中。那我们只需要通过简单的继承,就可以使这些子类完全获得父类可见的成员变量和方法,大大减低了代码量。

  说到这里,就不得不提一下Java特殊的继承机制,在C++里面是可以有多继承的,即一个子类可以继承多个父类。但是这样的设计往往会导致代码逻辑之间很混乱。在Java中取消了多继承的功能,我们一般采用接口的多实现来完成C++里面需要多继承才能实现的功能。就像在我们HIT软件构造课程所写的三个app中,对于每个app都可以设定不同的接口组合,我们通过实现多个接口来完成这些功能的组合,显得尤为方便。

  最后就是多态性,这个特性存在的原因就是继承,比如方法的多态-重写,子类型多态-通过不同的实例化。

  上面就是一些OOP和POP的功能对比,较详细的介绍了一些OOP的优点。

由软件构造引申的OOP与POP的心得体会的更多相关文章

  1. 软件构造 Lab1

    大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...

  2. 哈工大软件构造Lab2(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...

  3. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  4. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  5. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  6. 面向对象软件构造 (Bertrand Meyer 著)

    Part A: The Issues 议题 第一章 软件品质 第二章 面向对象的标准 Part B: The Road To Object Orientation 通向面向对象之路 第三章 模块性 第 ...

  7. 【软件构造】Mutable类型与Immutable类型

    [软件构造]Mutable类型与Immutable类型 1.前言 在软件构造这门课中,对mutable类型和immutable类型的深入理解,有助于后续ADT.可维护性.可复用性的学习,因此我们有必要 ...

  8. 哈工大软件构造Lab1(2022)

    目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...

  9. Delphi研究,对全局变量函数与OOP编程关系的一点体会 good

    感叹:设计VCL的人真是神人啊,感觉比Pascal编译器的设计人还要牛很多,把整个Windows架构理了一遍,封装的如此之好,复用的如此之好(以至于Delphi的控件满天飞,使用还特别容易),简直惊为 ...

随机推荐

  1. 浅谈产品模型(Profile)在程序设计中的作用

    引言:物联网平台的一个重要功能就是资产管理,产品或者设备都可以看成是资产中组成部分,所以有时候说物联网平台可以进行产品管理和设备管理.通常应用物联网平台开发一套具有产品或者设备管理功能的系统的时候,必 ...

  2. 「雕爷学编程」Arduino动手做(36)——WS2812B 4位彩灯模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. P1251 餐巾计划问题 网络流

    P1251 餐巾计划问题 #include <bits/stdc++.h> using namespace std; typedef long long ll; , inf = 0x3f3 ...

  4. 第三篇:ASR(Automatic Speech Recognition)语音识别

    ASR(Automatic Speech Recognition)语音识别: 百度语音--语音识别--python SDK文档: https://ai.baidu.com/docs#/ASR-Onli ...

  5. PAT-1058 A+B in Hogwarts (进制转换)

    1058. A+B in Hogwarts If you are a fan of Harry Potter, you would know the world of magic has its ow ...

  6. Excel_通过单元格的值来引用以单元格值命名的sheet

    1.通过单元格的值来引用以单元格值命名的sheet,在做多个类似sheet的统计结果时效率比较高 当一项测试中有很多个模块,每个模块中有很多条测试用例 将以上测试用例整理在Excel中,每个模块一个s ...

  7. Istio的流量管理(实操二)(istio 系列四)

    Istio的流量管理(实操二)(istio 系列四) 涵盖官方文档Traffic Management章节中的inrgess部分. 目录 Istio的流量管理(实操二)(istio 系列四) Ingr ...

  8. Mysql创建修改删除-表

    创建表之前要链接到库  例如  库名为 student use student; 连接结束可以查看此库中所有表 show tables; 创建表 create table student( id in ...

  9. linux克隆之后网络设置

    1.修改网络 vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改:ip地址 IPADDR=192.168.77.83GATEWAY=192.168.77.2 ...

  10. [wordpress使用]002_主题

    使用WordPress作为博客内容管理系统有一个很大的好处是,WordPress拥有大量的优秀的免费模板.你所需要的是下载安装,和稍作修改.下面接着开始WordPress教程:WordPress主题 ...