【问题标题】:OOP concepts confusion?OOP 概念混乱?
【发布时间】:2009-02-04 11:15:47
【问题描述】:

在阅读一些编程书籍时,我注意到作者说,在 OOP 中,您在理解 OOP 的主要思想时可能会有些困惑。

是啊!我有些困惑。您是否也遇到过这种情况?是什么让程序员(甚至是经验丰富的程序员)感到困惑?!

如果你有它,你怎么能打败它?!

谢谢

【问题讨论】:

  • 能否请您详细说明您的困惑之处?
  • +1 给瑞克。你能告诉我们更多吗?
  • OOP 的主要思想是什么?为什么你会觉得它令人困惑?对我来说,这是“类应该是唯一的模块”,这并不令人困惑。
  • 另请参阅: OOP 与程序化的无术语比较stackoverflow.com/questions/1530868

标签: oop


【解决方案1】:

Animal 比喻在向大多数人解释时很有效。

(更多有用的链接 herehere

【讨论】:

  • 直到他们进入现实世界并发现人们(正确地)避开了对组合的继承。 cow.moo() -> soundService.makeSound(cow) :)
【解决方案2】:

学习 OOP 时的很多困惑来自于尝试选择对象和对象类之间的正确关系,尤其是:

  • Object 包含 Some other Object(或Object1 Object2
  • Object Class 的一个实例

如果我能想到一个很好的例子来说明其中任何一个都可能合适的情况,我会添加它......

【讨论】:

    【解决方案3】:

    OOP 采用“面向问题”的方法进行编程在 C 和 Pascal 等语言中使用的传统“面向机器”的方法不同。如果您使用过程/功能语言进行了广泛的编程,那么学习 OOP 可能会非常困难。对这些程序员来说,事情往往更令人困惑。如果您是编程新手,您可能会发现事情变得不那么混乱了,因为您是从一个全新的头脑开始的。

    话虽如此,我已经看到许多程序员广泛使用 Java 等语言,并声称自己是优秀的 OOP 程序员,但实际上他们远非如此。当然,他们使用 Java 语言特性,如接口、继承等,并创建“作为类的实例”的对象,并“向对象发送消息”。大多数人使用很多 OOP 术语,因为他们接触过它。但是当涉及到编写一个简单的应用程序时,他们生成的代码暴露了他们的理解不足。

    我给你的建议是不要仅仅使用行话。认真地质疑和学习基本概念。当您学习多态性及其为代码可重用性带来的好处时,您可能会遇到第一个半涅槃(就像我一样)。当您了解通过继承重用和通过组合重用之间的权衡时,另一个半涅槃。最后,如果你能设计好,你就会知道你已经很好地理解了 OOP,或者更确切地说,一个好的 OO 设计很容易衡量你对 OOP 的理解程度。

    如果你对OOP很认真,你应该阅读GOF book on Design Patterns的前两章。这对新程序员来说可能有点困难,但它奠定了 OOP 背后思想的关键。这本书是任何认真的 OOP 程序员都应该拥有的重要参考书。如果你很好地理解了本书中的概念,那么就认为自己是一个优秀的 OO 程序员。

    【讨论】:

    【解决方案4】:

    是的,我一开始有点困惑。那是在 OO 刚刚开始成为主流的时候,所以有很多书都涵盖了它,但是对于那些还不知道它是什么的人来说,并没有很好地解释它。结果,我开始认为对象和类在很大程度上可以互换,并为我想要创建的每个对象定义一个新类。

    我终于通过在 LambdaMOO 上玩玩“搞定”了,这是一种使用面向对象的游戏内编程语言的 MUD(想想魔兽世界,但没有图形)。具有讽刺意味的是,MOOCode 没有区分类和对象——对象直接继承自其他对象。 (它确实有一个旨在用作“基类”的对象约定,将其命名为“通用 Foo”,以将它们与特定(“实例”)Foos 区分开来,但这与它的类/对象区别一样接近有。)

    【讨论】:

    • 这也是我完全理解OOP的原因! LambdaMOO 赢得胜利。
    • "具有讽刺意味的是,MOOCode 没有区分类和对象——对象直接继承自其他对象"——OOP 不需要类。您所描述的称为prototype-based OOP,JavaScript 是使用这种方法的流行语言的一个示例。
    • @el.pescado - 我所指的具有讽刺意味的是,我通过使用一种不存在这种区别的语言来理解类和对象之间的区别。人们会期望这种理解来自于学习一种在当时有很大区别的语言,而不是来自一种将它们视为可互换的语言。我并不是说(或暗示)MOOCode 不是“真正的”OOP。
    【解决方案5】:

    确实,我认为过于强调“阶级”的概念。

    我的理解最大的飞跃是在阅读“告诉,不要问”原则时。

    我只是在玩(和阅读)诸如 Ruby、JavaScript、Python 等鸭子类型的环境时才开始“感受”面向对象……在用 C++ 愉快地创建了大量的类之后,我已经快乐了 8 年。

    静态类型语言非常适合生产代码,但在尝试了解面向对象时需要付出很多开销。

    此外,在常用术语 OOP 旁边,人们常常忘记首先是 OOA 和 OOD

    【讨论】:

      【解决方案6】:

      我认为,尤其是在面向函数的语言开发方面经验丰富的程序员,很难理解 OOP 的概念。至少,这让我很困惑,我在使用 OOP 语言 (Java) 时做了很多事情来编程功能。

      但我也认为 OOP 方法对初学者来说是一件很棒的事情,因为这种方法非常“自然”。

      【讨论】:

      • JavaScript 非常适合这一点,因为它既是一种函数式语言又是一种高度 OOP 语言,因此它可能只是最好的“过渡”语言
      • 我知道你的意思 :) 出于学习目的,很遗憾你不能用它构建任何类型的应用程序。所以我认为 Delphi 有利于这种过渡,因为它允许您开发函数式和面向对象。
      【解决方案7】:

      我从来没有真正感到困惑,但我是沿着时间轴学习编程的。所以我有汇编、c、c++、java、c# 和其他在这里不相关的负载。您必须接受的是,一切都应由对象表示,并且对象包含描述自身(属性)的信息,并且它们可以执行与其相关的任务(方法即:Car.GetAllCars();)。

      对于继承和多态以及所有其他我建议练习。练习一切——因为熟能生巧。尝试开发所有书中给出的示例。

      【讨论】:

        【解决方案8】:

        一旦您了解了 oo 基础知识,请查看设计模式和设计原则(例如,通过阅读 Head First Design Patterns)。它将教您如何实际使用 oo 提供的工具。虽然这不能替代实践经验,但它肯定可以加快学习过程。

        【讨论】:

          【解决方案9】:

          感谢您的回答。

          我认为给出示例效果最好,但不是每次都这样,对吧?!

          我听 C++ 的创造者说过,这需要时间和耐心,你会通过尝试更好地理解它。

          【讨论】:

          • 非常正确,但只要您通过实践不断反思您的理论理解。从长远来看,这将使事情变得更加具体。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-06
          相关资源
          最近更新 更多