Answers:
我建议面向对象编程的最重要特征是复杂性管理。
人脑一次只能容纳这么多的概念-人们常常想到记住7 +/- 2个独立项目的极限。
在工作中的600kloc系统上工作时,我无法一次把整个事情都牢记在心。如果必须这样做,我将只能在更小的系统上工作。
幸运的是,我不必这样做。我们在该项目中使用的各种设计模式和其他结构意味着我不必立即处理整个系统-我可以挑选单个零件并对其进行处理,因为知道它们适合更广泛的应用程序以明确的方式。
所有重要的OO概念都提供了管理复杂性的方法。
封装 -让我处理为我提供各种服务的外部API,而不必担心这些服务的实现方式。
抽象 -让我专注于基本特征,而忽略不相关的内容。
合成 -让我重复使用已经以新组合构建的组件
多态性 -让我寻求服务,而不必担心不同的对象如何以不同的方式提供它。
继承 -让我重用接口或实现,仅提供与以前不同的部分。
单一责任原则 -使每个对象的目的清晰明了,因此很容易推理
里斯科夫换人原则 -让我们不要引入奇数依赖
开放/封闭原则 -让我们以不需要我们冒险破坏现有代码的方式进行扩展和修改
依赖注入 -让我们将构成提升到一个新的水平,然后将组件组装在一起。
面向接口的开发 -让我们将抽象提升到一个新的水平,仅依赖于抽象,而不依赖于具体的实现。
封装提供的数据隐藏。
其他任何答案都未提及的功能:域建模。由于人们倾向于考虑使用对象或对对象进行操作,以及考虑具有固有属性的对象,因此使用面向对象的软件对问题或工作流进行建模非常容易。从本质上讲,它使我们能够利用现有的能力来处理代码中的名词,动词和形容词。
我认为继承是OOP最重要的一点。
[来自游戏开发]您可以创建类似Drawable的类,并具有渲染方法和属性,并创建从Drawable继承的Spaceship and Planet类。从那些对象(和其他Sprite子对象)中获取所有对象,并放入drawableObjArray,然后为每个对象调用draw方法。您只需要知道它是一个Drawable。
它之所以有些成功,是因为它鼓励将人类的事物组织成对象。人们通常善于观察事物之间的关系-诸如差异,相似性和行为之类的事物。OO鼓励开发模仿人类对世界的概念化的软件。
使软件开发与我们对世界的看法相似,可以使我们的头脑更轻松地处理复杂性。
这里多次询问“ ADT与对象 ”。单行回答是“ ADT和对象是彼此相反的-一个人抽象得很清楚,而另一个则不能;每个对象都以不同的方式提供灵活性”。
有关更长的答案,请参见William Cook的“重新理解数据抽象”。简而言之,对象使您可以轻松地使用某些数据的多种实现/表示形式(看起来像列表的东西可能是数组,自平衡树,或...),但很难添加新操作(因为您必须将新操作添加到您的每个表示形式中),而ADT使得在数据类型上添加新操作变得容易,但是很难实现多种实现。
编辑:我曾说过,消息传递是使OO成功的原因。根据Jonas的评论,这是不对的,因为人们认为面向对象的大多数语言都不使用消息传递。由于这是不对的,因此我从回答中剔除了它。
我的前三项功能。对象组合-允许对象进行协作。多态-支持运行时的动态行为。继承-通过重用代码并通过方法重写修改行为。
ADT-即使在非面向对象的语言(例如Pascal)中,您也可以使用它。堆栈或队列是ADT的示例。
用简单的话来说,OOP是可重用性和封装性的关键,它可以产生大型框架,从而使这个时代的程序员的工作变得轻松,因为它可以调用API并执行当今最想做的事情。
因为您的问题是关于OOP的4个功能,所以您可以说
所以1.消息传递和3.多态实际上支持2.继承和4.封装。
我认为,后三个功能最重要,它们影响了OOP的广泛使用:
2. Inheritance
3. Polymorphism
4. Encapsulation
编辑:另一点是IDE和图形界面开发环境,例如Visual Studio和Eclipse。由于它们包含OOP语言,因此越来越多的设计趋向于OOP。
当然,SOLID Principles是使ROCK产品可靠交付的一次尝试:)