结构化编程与OO编程


11

我正在做一个演示,以显示结构化编程和面向对象编程之间的差异,并且我想以一个示例说明为什么人们需要OOP,在该示例中,应用OOP概念将使编码变得更加容易,从而使听众真正感到他们需要OOP。

有任何想法吗 ??


2
在programmers.stackexchange.com上问这个问题将给您更多答案。
reggie 2011年

2
你的听众是什么?经验丰富的非OO程序员(cobol等)?经验不足的程序员(学生等)?高管(根本不是程序员)?

我以前没有听说过,但是我读了FAQ,我想最好在那儿问。
艾哈迈德(Ahmed)

低经验的。
艾哈迈德(Ahmed)

4
我希望某些OO程序的结构更好。
Scott Whitlock

Answers:


17

您可能想看一下这个快速的视频博客。结果是结构化编程和OO编程之间的区别在于它们从编程中获得的好处,而不是它们所添加的内容。诸如结构化编程和面向对象编程之类的软件学科是约束性的,而不是启用性的。这里是一些定义。警告:您不会喜欢它们。

  • 结构化编程是对goto(控制权的直接转移)施加的约束

  • OO编程是对指向函数指针(控制的间接传递)的一种约束

  • 函数式编程是根据分配进行训练的学科。

    首先不是很难理解。Dijkstra发现,在算法中允许goto时,不可能创建正确性的一般证明。然而,如果控制结构只限于顺序,选择和迭代,然后正确性的证明可能的。当然,我们现在甚至都没有尝试证明事情是正确的,但是我们确实喜欢结构化编程的简单性和优雅性。

OO有点难理解。我们通常将OO定义为封装,继承和多态。鲜为人知的是,所有这三个属性都是可以实现的,并且经常在C 实现的。确实,C ++最初只是编译为C的预处理器。实际上并不难封装在C中,也很难构建彼此为子集的数据结构,用于模拟继承。但是,多态性要难一些。它需要指向在C中难以很好管理的函数的指针。像C ++这样的语言给我们的是对那些指向函数的指针的约束。C ++编译器为我们构建了vtable,并根据严格的形式主义初始化了其中的指针。因此,从非常真实的意义上讲,OO只是施加于纪律控制的间接传递,即函数的指针。

结构化编程是关于如何使用goto的。OO是关于如何使用函数指针的。和函数式编程太是所有关于这样做。在函数式编程中,除了在最严格的控制情况下,我们不分配变量。

因此,最后,所有这些编程“技术”实际上都是在约束学科而不是使技术成为可能。他们告诉我们没有做的比他们告诉我们去做。这意味着软件开发在过去40年中没有增长。相反,它已经缩小了。当我们了解了所有不应该做的事情时,它变得越来越受约束。

学习不做什么是好事;但这是一个令人不安的问题:我们学到什么新东西?


@Ahmed:“ TL; DR,感谢您的视频” +1-可疑评论(哄骗)
n611x007 2012年

链接腐烂...死链接
slashdottir

7

有三种对计算机编程的基本方法:

  1. 非结构化编程-使用gotos,例如在旧的BASIC解释器中或在汇编语言中。很少有人以这种方式编程。
  2. 结构化命令式编程-类似于C或PASCAL。
  3. 结构化的函数式编程-类似于Haskell,ML或Lisp。

在我看来,面向对象的编程是不同的。它是关于如何大规模组织程序的。它不会替代或淘汰我上面提到的3个范式中的任何一个-在方法主体中,您仍然需要从列表中选择3个范式之一进行写入。


我不太了解你!您的意思是我们必须使用3个范例之一,但我们不知道..而OOP只是更多的组织?
艾哈迈德(Ahmed)

您必须学习结构化命令式编程或结构化函数式编程,然后才能进行编程。这两个范例是关于完成工作的。另一方面,OOP是关于程序模块化的,只有程序达到一定大小后,OOP才起作用。尽管它肯定会一直出现在您在编程时使用的库中,但是可以拥有一个非常好的类库,而没有诸如继承的OO功能,例如Haskell,LISP或Standard ML的类库。
肯·布鲁姆

4

这与您如何预期变化有关。

这两个概念都使其易于重用,但是OOP为更轻松的更改打开了大门。OOP具有结构化编程的所有可重用性,但是您也可以使用它轻松地创建新功能。

您可以说OOP继承了结构化编程的所有功能以及继承的其他功能!:-D


我现在不太喜欢继承。

4
我也不是,但这是因为政府把我祖父从退休金中抽了出来。但是,就OOP而言,继承对我很有帮助!
corsiKa 2011年

以我的经验,在OOP中最好避免继承。您实际上多久构建一个超类而不是一个接口?一般赞成组成。
Janx

1
@Janx:“您实际上多久构建一个超类而不是一个接口?” ??您不会“建立超类”;你把现有的类和构建subclasss从他们身上,和你做一切的时候。如果您不使用继承,那么您将无法获得Liskov替换和多态性的好处,那么您首先在面向对象编程中做什么?组合是具有不同用例的不同工具,而不是继承的替代品。您不应“偏爱”一个。您应该同时使用两者,以各自发挥作用。
梅森惠勒

1
@梅森-值得一提的是,(李斯科夫换位原则的)芭芭拉·李斯科夫实际上(长视频)她并不特别喜欢继承。
艾丹·库利(Aidan Cully)

2

这些概念是正交的。结构化编程是关于在过程/函数/方法中对代码进行结构化。进行OOP时,完全有可能(并且很希望)在类方法中遵循结构化编程的原理。


1

那是一种主观的措辞-结构化编程和OOP是解决问题的风格,并且一种并不总是比另一种更好。如果以结构化的方式编写数值方法库,那么在此过程中,您将对输入数据执行转换,这将非常有意义。但是,由状态机驱动的简单代理可以轻松地表示为Java或C ++中的自包含类。OOP是表达数据结构存储容器的自然方法。

谈论信息隐藏和模块化是自然激发OOP风格的好方法。

史蒂夫·耶格Steve Yegge)在这个问题上写了一个有趣的观点 -在某些方面,这是对两种风格之间方法差异的更好描述。


0

建立业务模型时,OOP更容易理解。当您考虑应用程序的元素时,可以使用它们之间的一些对象和关系,例如,书中有作者,书名,ISBN。书籍要借给图书馆,学生可以借用。结构化编程要求考虑特定过程,而不是抽象实现。

OOP旨在简化更改。可以更改结构程序,但必须用代码描述。OO程序中的更改可以通过抽象模型更改来描述。


0

可变范围:

我认为确保良好编程的语言原则是限制变量的范围。在像C这样的结构化语言中,作用域主要有两种类型-

  • 全球范围
  • 本地/功能/方法范围

我们都知道全球范围是有害的。但是有时本地作用域不足以运行该程序。因此,避免使用全局作用域往往会更广泛地使用指针,从而可以使用作用域之外的变量。但是指针很难理解和使用。

像C ++这样的OOP语言通过封装添加了一种新的作用域- 类/对象作用域。私有/公共变体会进一步增强此范围。这解决了可变作用域的许多问题。范围在OOP中有更多定义。并且不需要指针。

这是OOP的重要功能之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.