举例说明面向对象编程和结构化编程的优缺点

2024-12-01 08:14:52
推荐回答(5个)
回答1:

弊端是,没有人还记得面向对象原本要解决的问题是什么。

1、面向对象原本要解决什么(或者说有什么优良特性)
似乎很简单,但实际又很不简单:面向对象三要素封装、继承、多态

(警告:事实上,从业界如此总结出这面向对象三要素的一刹那开始,就已经开始犯错了!)。

封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口。

有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者;而外部调用者也可以知道自己不可以碰哪里。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

继承+多态:继承和多态必须一起说。一旦割裂,就说明理解上已经误入歧途了。

先说继承:继承同时具有两种含义:其一是继承基类的方法,并做出自己的改变和/或扩展——号称解决了代码重用问题;其二是声明某个子类兼容于某基类(或者说,接口上完全兼容于基类),外部调用者可无需关注其差别(内部机制会自动把请求派发[dispatch]到合适的逻辑)。

再说多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。

很显然,多态实际上是依附于继承的两种含义的:“改变”和“扩展”本身就意味着必须有机制去自动选用你改变/扩展过的版本,故无多态,则两种含义就不可能实现。

所以,多态实质上是继承的实现细节;那么让多态与封装、继承这两个概念并列,显然是不符合逻辑的。不假思索的就把它们当作可并列概念使用的人,显然是从一开始就被误导了——正是这种误导,使得大多数人把注意力过多集中在多态这个战术层面的问题上,甚至达到近乎恶意利用的程度;同时却忽略了战略层面的问题,这就致使软件很容易被他们设计成一滩稀屎(后面会详细谈论这个)。

实践中,继承的第一种含义(实现继承)意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样

回答2:

(1) 以过程为中心和对象为中心的比较 结构化编程方法是以过程为中心的,当面对一个问题时,该方法侧重于问题解决过程的层 次结构。面向对象的分析和设计方法侧重于对象。对象具有特定的行为和属性,行为和属性决 定了对象与其他对象的交互作用方式,以及对象本身的行为方式。2/ 一次性使用和可重用的比较 根据不同的实现,结构化过程可能无法重用。而面向对象的方法,对象是一个模块单元。 具有完备的实体,因此可以具有高度的可重用性。(3有序算法和无序算法的比较 结构化编程方法所开发的程序,其结构往往是线性的(或者说是自顶向下的)。而面向对 象的应用程序是一种基于消息或者事件驱动的程序类型。每个对象都可以向其他对象发送消 息。Windows 操作系统就是这样的程序。

回答3:

1960年结构化程序设计思想诞生。C和Pascal等语言都大力提倡这种程序设计的方法发明面向对象程序设计方法的主要出发点是弥补面向过程程序设计方法中的一些缺点
1960年结构化程序设计思想诞生。C和Pascal等语言都大力提倡这种程序设计的方法发明面向对象程序设计方法的主要出发点是弥补面向过程程序设计方法中的一些缺点
1960年结构化程序设计思想诞生。C和Pascal等语言都大力提倡这种程序设计的方法发明面向对象程序设计方法的主要出发点是弥补面向过程程序设计方法中的一些缺点

回答4:

1960年结构化程序设计思想诞生。C和Pascal等语言都大力提倡这种程序设计的方法发明面向对象程序设计方法的主要出发点是弥补面向过程程序设计方法中的一些缺点

回答5: