1. 编程范式
1.结构化编程
Bohm和jocopini证明了可以使用顺序结构、分支结构、循环结构构造出任何程序
goto是有害的
顺序结构、分支结构和循环结构均可以证明其正确性,并且用这三种结构可以构造出任何程序。那么这就意味着可以将模块可以按功能进行降解拆分为一系列函数,而这些函数可以用结构化编程范式来写。只要这些函数是正确的,那么整个程序就是正确的。
Dijstra:测试只能展示bug的存在,不能证明bug不存在
结构化编程方式最有价值的地方在于它赋予了我们创造可以证伪程序单元的能力。这就是现代编程语言一般不支持无限制goto语句的原因。更重要的是,这也是为什么在架构设计领域,功能降解性拆分仍是最佳实现之一。
无论在哪一个层面上,从最小的函数到最大的组件,软件开发过程都是由证伪驱动的。软件架构师需要定义可以方便的进行证伪的模块、组件以及服务。为了达到这个目的,它们需要将类似结构化编程的限制方法应用在更高的层面上。
具体的限制性方法待补充。。。。
2.面向对象编程
什么是面向对象?
回答1:面向对象是数据与函数的组合。这种回答方式并不贴切。因为他似乎暗示了o.f()与f(o)之间的有区别。
回答2:面向对象编程时一种对真实世界进行建模的方式。这句话似乎意味着“由于采用面向对象方式构建的软件与真实世界的关系更加紧密,所以面向对象编程使软件开发更加容易”。但是该回答并没有说清楚——面向对象编程就是什么
回答3:面向对象编程就是封装、继承、多态。这只是面向对象编程的特性。
封装:
封装特性并不是面向对象编程所独有的。其实C语言也支持完成的封装,并且更加完美。而C++作为一种面向对象语言,反而破坏了C的完美封装性。因为C++编译器要求类的成员变量必须在类的头文件中声明(可以使用IMPL方式避免,但终归是一种规避方式)。
基于上述原因,很难说封装是面向对象的必要条件,事实上,有很多面向对象编程语言对封装性没有强制性的要求。
继承:
继承的主要作用是让我们可以在某个作用域内对外部定义的一组变量与函数进行覆盖。这事实上也是C程序员在面向对象发明之前一直做的事。只不过面向对象编程对原有的继承方式进行了拓展,支持了多重继承。
多态:
多态其实不过是函数指针的一种应用。自20世纪40年代冯诺依曼架构诞生的那一天起,程序员们就一直在使用函数指针模拟多态了。所以面向对象编程在多态方面没有提出任何新的概念,但是面向对象编程让多态变更更加安全,更加便于使用。
面向对象编程其实是对程序间接控制权的转移进行了约束。也就是说,非面向对象编程实现多态时是直接使用函数指针,只要符合规则,可以在使用函数指针在任意的函数之间转换。而面向对象编程使多态只能在继承关系中进行使用,从而达到了对程序间接控制权